Author: jlebar Date: Fri Sep 30 18:57:34 2016 New Revision: 282986 URL: http://llvm.org/viewvc/llvm-project?rev=282986&view=rev Log: [CUDA] Disallow __constant__ local variables.
Reviewers: tra, rnk Subscribers: cfe-commits Differential Revision: https://reviews.llvm.org/D25129 Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td cfe/trunk/lib/Sema/SemaDeclAttr.cpp cfe/trunk/test/SemaCUDA/bad-attributes.cu Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td?rev=282986&r1=282985&r2=282986&view=diff ============================================================================== --- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original) +++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Fri Sep 30 18:57:34 2016 @@ -6723,6 +6723,7 @@ def err_cuda_vla : Error< "cannot use variable-length arrays in " "%select{__device__|__global__|__host__|__host__ __device__}0 functions">; def err_cuda_extern_shared : Error<"__shared__ variable %0 cannot be 'extern'">; +def err_cuda_nonglobal_constant : Error<"__constant__ variables must be global">; def warn_non_pod_vararg_with_format_string : Warning< "cannot pass %select{non-POD|non-trivial}0 object of type %1 to variadic " Modified: cfe/trunk/lib/Sema/SemaDeclAttr.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclAttr.cpp?rev=282986&r1=282985&r2=282986&view=diff ============================================================================== --- cfe/trunk/lib/Sema/SemaDeclAttr.cpp (original) +++ cfe/trunk/lib/Sema/SemaDeclAttr.cpp Fri Sep 30 18:57:34 2016 @@ -3696,6 +3696,19 @@ static void handleOptimizeNoneAttr(Sema D->addAttr(Optnone); } +static void handleConstantAttr(Sema &S, Decl *D, const AttributeList &Attr) { + if (checkAttrMutualExclusion<CUDASharedAttr>(S, D, Attr.getRange(), + Attr.getName())) + return; + auto *VD = cast<VarDecl>(D); + if (!VD->hasGlobalStorage()) { + S.Diag(Attr.getLoc(), diag::err_cuda_nonglobal_constant); + return; + } + D->addAttr(::new (S.Context) CUDAConstantAttr( + Attr.getRange(), S.Context, Attr.getAttributeSpellingListIndex())); +} + static void handleSharedAttr(Sema &S, Decl *D, const AttributeList &Attr) { if (checkAttrMutualExclusion<CUDAConstantAttr>(S, D, Attr.getRange(), Attr.getName())) @@ -5541,8 +5554,7 @@ static void ProcessDeclAttribute(Sema &S handleCommonAttr(S, D, Attr); break; case AttributeList::AT_CUDAConstant: - handleSimpleAttributeWithExclusions<CUDAConstantAttr, CUDASharedAttr>(S, D, - Attr); + handleConstantAttr(S, D, Attr); break; case AttributeList::AT_PassObjectSize: handlePassObjectSizeAttr(S, D, Attr); Modified: cfe/trunk/test/SemaCUDA/bad-attributes.cu URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCUDA/bad-attributes.cu?rev=282986&r1=282985&r2=282986&view=diff ============================================================================== --- cfe/trunk/test/SemaCUDA/bad-attributes.cu (original) +++ cfe/trunk/test/SemaCUDA/bad-attributes.cu Fri Sep 30 18:57:34 2016 @@ -61,3 +61,11 @@ __global__ static inline void foobar() { #ifdef EXPECT_INLINE_WARNING // expected-warning@-2 {{ignored 'inline' attribute on kernel function 'foobar'}} #endif + +__constant__ int global_constant; +void host_fn() { + __constant__ int c; // expected-error {{__constant__ variables must be global}} +} +__device__ void device_fn() { + __constant__ int c; // expected-error {{__constant__ variables must be global}} +} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits