Author: stulova Date: Thu Mar 3 12:38:40 2016 New Revision: 262641 URL: http://llvm.org/viewvc/llvm-project?rev=262641&view=rev Log: [OpenCL] Improve diagnostics of address spaces for variables in function
- Prevent local variables to be declared in global AS - Diagnose AS of local variables with an extern storage class as if they would be in a program scope Review: http://reviews.llvm.org/D17345 Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td cfe/trunk/lib/Sema/SemaDecl.cpp cfe/trunk/test/Parser/opencl-storage-class.cl cfe/trunk/test/SemaOpenCL/storageclass-cl20.cl cfe/trunk/test/SemaOpenCL/storageclass.cl Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td?rev=262641&r1=262640&r2=262641&view=diff ============================================================================== --- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original) +++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Thu Mar 3 12:38:40 2016 @@ -7683,8 +7683,8 @@ def err_opencl_ptrptr_kernel_param : Err "kernel parameter cannot be declared as a pointer to a pointer">; def err_opencl_private_ptr_kernel_param : Error< "kernel parameter cannot be declared as a pointer to the __private address space">; -def err_opencl_non_kernel_variable : Error< - "non-kernel function variable cannot be declared in %0 address space">; +def err_opencl_function_variable : Error< + "%select{non-kernel function|function scope}0 variable cannot be declared in %1 address space">; def err_static_function_scope : Error< "variables in function scope cannot be declared static">; def err_opencl_bitfields : Error< @@ -7712,7 +7712,7 @@ def err_sampler_argument_required : Erro 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< - "program scope variable must reside in %0 address space">; + "%select{program scope|static local|extern}0 variable must reside in %1 address space">; def err_missing_actual_pipe_type : Error< "missing actual type specifier for pipe">; def err_reference_pipe_type : Error < Modified: cfe/trunk/lib/Sema/SemaDecl.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDecl.cpp?rev=262641&r1=262640&r2=262641&view=diff ============================================================================== --- cfe/trunk/lib/Sema/SemaDecl.cpp (original) +++ cfe/trunk/lib/Sema/SemaDecl.cpp Thu Mar 3 12:38:40 2016 @@ -6633,34 +6633,26 @@ void Sema::CheckVariableDeclarationType( // OpenCL v2.0 s6.5.1 - Variables defined at program scope and static // variables inside a function can also be declared in the global // address space. - if (NewVD->isFileVarDecl()) { + if (NewVD->isFileVarDecl() || NewVD->isStaticLocal() || + NewVD->hasExternalStorage()) { if (!T->isSamplerT() && !(T.getAddressSpace() == LangAS::opencl_constant || (T.getAddressSpace() == LangAS::opencl_global && getLangOpts().OpenCLVersion == 200))) { + int Scope = NewVD->isStaticLocal() | NewVD->hasExternalStorage() << 1; if (getLangOpts().OpenCLVersion == 200) Diag(NewVD->getLocation(), diag::err_opencl_global_invalid_addr_space) - << "global or constant"; + << Scope << "global or constant"; else Diag(NewVD->getLocation(), diag::err_opencl_global_invalid_addr_space) - << "constant"; + << Scope << "constant"; NewVD->setInvalidDecl(); return; } } else { - // OpenCL v2.0 s6.5.1 - Variables defined at program scope and static - // variables inside a function can also be declared in the global - // address space. - if (NewVD->isStaticLocal() && - !(T.getAddressSpace() == LangAS::opencl_constant || - (T.getAddressSpace() == LangAS::opencl_global && - getLangOpts().OpenCLVersion == 200))) { - if (getLangOpts().OpenCLVersion == 200) - Diag(NewVD->getLocation(), diag::err_opencl_global_invalid_addr_space) - << "global or constant"; - else - Diag(NewVD->getLocation(), diag::err_opencl_global_invalid_addr_space) - << "constant"; + if (T.getAddressSpace() == LangAS::opencl_global) { + Diag(NewVD->getLocation(), diag::err_opencl_function_variable) + << 1 /*is any function*/ << "global"; NewVD->setInvalidDecl(); return; } @@ -6671,11 +6663,11 @@ void Sema::CheckVariableDeclarationType( FunctionDecl *FD = getCurFunctionDecl(); if (FD && !FD->hasAttr<OpenCLKernelAttr>()) { if (T.getAddressSpace() == LangAS::opencl_constant) - Diag(NewVD->getLocation(), diag::err_opencl_non_kernel_variable) - << "constant"; + Diag(NewVD->getLocation(), diag::err_opencl_function_variable) + << 0 /*non-kernel only*/ << "constant"; else - Diag(NewVD->getLocation(), diag::err_opencl_non_kernel_variable) - << "local"; + Diag(NewVD->getLocation(), diag::err_opencl_function_variable) + << 0 /*non-kernel only*/ << "local"; NewVD->setInvalidDecl(); return; } Modified: cfe/trunk/test/Parser/opencl-storage-class.cl URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Parser/opencl-storage-class.cl?rev=262641&r1=262640&r2=262641&view=diff ============================================================================== --- cfe/trunk/test/Parser/opencl-storage-class.cl (original) +++ cfe/trunk/test/Parser/opencl-storage-class.cl Thu Mar 3 12:38:40 2016 @@ -8,8 +8,8 @@ void test_storage_class_specs() auto int d; // expected-error {{OpenCL does not support the 'auto' storage class specifier}} #pragma OPENCL EXTENSION cl_clang_storage_class_specifiers : enable - static int e; // expected-error {{program scope variable must reside in constant address space}} + static int e; // expected-error {{static local variable must reside in constant address space}} register int f; - extern int g; + extern int g; // expected-error {{extern variable must reside in constant address space}} auto int h; } Modified: cfe/trunk/test/SemaOpenCL/storageclass-cl20.cl URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaOpenCL/storageclass-cl20.cl?rev=262641&r1=262640&r2=262641&view=diff ============================================================================== --- cfe/trunk/test/SemaOpenCL/storageclass-cl20.cl (original) +++ cfe/trunk/test/SemaOpenCL/storageclass-cl20.cl Thu Mar 3 12:38:40 2016 @@ -1,15 +1,19 @@ -// RUN: %clang_cc1 %s -verify -pedantic -fsyntax-only -DCL20 -cl-std=CL2.0 +// RUN: %clang_cc1 %s -verify -pedantic -fsyntax-only -cl-std=CL2.0 static constant int G1 = 0; int G2 = 0; global int G3 = 0; -local int G4 = 0;// expected-error{{program scope variable must reside in global or constant address space}} +local int G4 = 0; // expected-error{{program scope variable must reside in global or constant address space}} void kernel foo() { static int S1 = 5; static global int S2 = 5; - static private int S3 = 5;// expected-error{{program scope variable must reside in global or constant address space}} + static private int S3 = 5; // expected-error{{static local variable must reside in global or constant address space}} constant int L1 = 0; local int L2; + global int L3; // expected-error{{function scope variable cannot be declared in global address space}} + + extern global int G5; + extern int G6; // expected-error{{extern variable must reside in global or constant address space}} } Modified: cfe/trunk/test/SemaOpenCL/storageclass.cl URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaOpenCL/storageclass.cl?rev=262641&r1=262640&r2=262641&view=diff ============================================================================== --- cfe/trunk/test/SemaOpenCL/storageclass.cl (original) +++ cfe/trunk/test/SemaOpenCL/storageclass.cl Thu Mar 3 12:38:40 2016 @@ -14,6 +14,7 @@ void kernel foo() { local int L2; auto int L3 = 7; // expected-error{{OpenCL does not support the 'auto' storage class specifier}} + global int L4; // expected-error{{function scope variable cannot be declared in global address space}} } static void kernel bar() { // expected-error{{kernel functions cannot be declared static}} @@ -26,4 +27,6 @@ void f() { constant int L1 = 0; // expected-error{{non-kernel function variable cannot be declared in constant address space}} local int L2; // expected-error{{non-kernel function variable cannot be declared in local address space}} } + global int L3; // expected-error{{function scope variable cannot be declared in global address space}} + extern constant float L4; } _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits