From: Tanya Lattner Date: Fri, 5 Apr 2013 20:14:50 +0000 (+0000) Subject: Add an error to check that all program scope variables are in the constant address... X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=8aa86d1155fb99e34fd084d83da3345b1ec2b2e4;p=clang Add an error to check that all program scope variables are in the constant address space in OpenCL. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@178906 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Basic/DiagnosticSemaKinds.td b/include/clang/Basic/DiagnosticSemaKinds.td index c4815cd7ea..fe8233b053 100644 --- a/include/clang/Basic/DiagnosticSemaKinds.td +++ b/include/clang/Basic/DiagnosticSemaKinds.td @@ -6205,7 +6205,9 @@ def err_sampler_argument_required : Error< "sampler_t variable required - got %0">; def err_wrong_sampler_addressspace: Error< "sampler type cannot be used with the __local and __global address space qualifiers">; - +def err_opencl_global_invalid_addr_space : Error< + "global variables must have a constant address space qualifier">; + // OpenMP support. def err_omp_expected_var_arg_suggest : Error< "%0 is not a global variable, static local variable or static data member%select{|; did you mean %2?}1">; diff --git a/lib/Sema/SemaDecl.cpp b/lib/Sema/SemaDecl.cpp index adf3505633..e9116bc91a 100644 --- a/lib/Sema/SemaDecl.cpp +++ b/lib/Sema/SemaDecl.cpp @@ -5177,6 +5177,16 @@ bool Sema::CheckVariableDeclaration(VarDecl *NewVD, return false; } + // OpenCL v1.2 s6.5 - All program scope variables must be declared in the + // __constant address space. + if (getLangOpts().OpenCL && NewVD->isFileVarDecl() + && T.getAddressSpace() != LangAS::opencl_constant + && !T->isSamplerT()){ + Diag(NewVD->getLocation(), diag::err_opencl_global_invalid_addr_space); + NewVD->setInvalidDecl(); + return false; + } + // OpenCL v1.2 s6.8 -- The static qualifier is valid only in program // scope. if ((getLangOpts().OpenCLVersion >= 120) diff --git a/test/SemaOpenCL/event_t.cl b/test/SemaOpenCL/event_t.cl index 57a0981cf1..06197d0c17 100644 --- a/test/SemaOpenCL/event_t.cl +++ b/test/SemaOpenCL/event_t.cl @@ -2,7 +2,7 @@ event_t glb_evt; // expected-error {{the event_t type cannot be used to declare a program scope variable}} -struct evt_s { +constant struct evt_s { event_t evt; // expected-error {{the event_t type cannot be used to declare a structure or union field}} } evt_str; diff --git a/test/SemaOpenCL/storageclass.cl b/test/SemaOpenCL/storageclass.cl index fdfe134621..d2678f2010 100644 --- a/test/SemaOpenCL/storageclass.cl +++ b/test/SemaOpenCL/storageclass.cl @@ -2,6 +2,8 @@ static constant int A = 0; +int X = 0; // expected-error{{global variables must have a constant address space qualifier}} + // static is not allowed at local scope. void kernel foo() { static int X = 5; // expected-error{{variables in function scope cannot be declared static}} diff --git a/unittests/AST/SourceLocationTest.cpp b/unittests/AST/SourceLocationTest.cpp index b8d8b02d03..f6c0edc927 100644 --- a/unittests/AST/SourceLocationTest.cpp +++ b/unittests/AST/SourceLocationTest.cpp @@ -132,10 +132,10 @@ TEST(CompoundLiteralExpr, CompoundVectorLiteralRange) { TEST(CompoundLiteralExpr, ParensCompoundVectorLiteralRange) { RangeVerifier Verifier; - Verifier.expectRange(2, 11, 2, 22); + Verifier.expectRange(2, 20, 2, 31); EXPECT_TRUE(Verifier.match( "typedef int int2 __attribute__((ext_vector_type(2)));\n" - "int2 i2 = (int2)(1, 2);", + "constant int2 i2 = (int2)(1, 2);", compoundLiteralExpr(), Lang_OpenCL)); } @@ -149,10 +149,10 @@ TEST(InitListExpr, VectorLiteralListBraceRange) { TEST(InitListExpr, VectorLiteralInitListParens) { RangeVerifier Verifier; - Verifier.expectRange(2, 17, 2, 22); + Verifier.expectRange(2, 26, 2, 31); EXPECT_TRUE(Verifier.match( "typedef int int2 __attribute__((ext_vector_type(2)));\n" - "int2 i2 = (int2)(1, 2);", initListExpr(), Lang_OpenCL)); + "constant int2 i2 = (int2)(1, 2);", initListExpr(), Lang_OpenCL)); } } // end namespace ast_matchers