From 9812634c5243b124d4c63641dc6d6c9452b957ba Mon Sep 17 00:00:00 2001 From: Tanya Lattner Date: Thu, 4 Apr 2013 23:36:11 +0000 Subject: [PATCH] Add an error to check that all program scope variables are in the constant address space in OpenCL. llvm-svn: 178811 --- clang/include/clang/Basic/DiagnosticSemaKinds.td | 4 +++- clang/lib/Sema/SemaDecl.cpp | 10 ++++++++++ clang/test/SemaOpenCL/event_t.cl | 2 +- clang/test/SemaOpenCL/storageclass.cl | 2 ++ 4 files changed, 16 insertions(+), 2 deletions(-) diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td index c4815cd7ea6c..fe8233b053ea 100644 --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/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/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp index adf3505633bd..e9116bc91a5b 100644 --- a/clang/lib/Sema/SemaDecl.cpp +++ b/clang/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/clang/test/SemaOpenCL/event_t.cl b/clang/test/SemaOpenCL/event_t.cl index 57a0981cf130..06197d0c1796 100644 --- a/clang/test/SemaOpenCL/event_t.cl +++ b/clang/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/clang/test/SemaOpenCL/storageclass.cl b/clang/test/SemaOpenCL/storageclass.cl index fdfe13462188..d2678f2010d9 100644 --- a/clang/test/SemaOpenCL/storageclass.cl +++ b/clang/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}}