forked from OSchip/llvm-project
[OpenCL] Diagnose scoped address-space qualified variables
Produce an error if variables qualified with a local or a constant address space are not declared in the outermost scope of a kernel. Patch by Simon Perretta. Differential Revision: https://reviews.llvm.org/D34024 llvm-svn: 305798
This commit is contained in:
parent
ad870f8285
commit
e437b6a52b
|
@ -8311,6 +8311,9 @@ def err_opencl_ext_vector_component_invalid_length : Error<
|
|||
"vector component access has invalid length %0. Supported: 1,2,3,4,8,16.">;
|
||||
def err_opencl_function_variable : Error<
|
||||
"%select{non-kernel function|function scope}0 variable cannot be declared in %1 address space">;
|
||||
def err_opencl_addrspace_scope : Error<
|
||||
"variables in the %0 address space can only be declared in the outermost "
|
||||
"scope of a kernel function">;
|
||||
def err_static_function_scope : Error<
|
||||
"variables in function scope cannot be declared static">;
|
||||
def err_opencl_bitfields : Error<
|
||||
|
|
|
@ -7260,11 +7260,11 @@ void Sema::CheckVariableDeclarationType(VarDecl *NewVD) {
|
|||
NewVD->setInvalidDecl();
|
||||
return;
|
||||
}
|
||||
// OpenCL v1.1 s6.5.2 and s6.5.3 no local or constant variables
|
||||
// in functions.
|
||||
if (T.getAddressSpace() == LangAS::opencl_constant ||
|
||||
T.getAddressSpace() == LangAS::opencl_local) {
|
||||
FunctionDecl *FD = getCurFunctionDecl();
|
||||
// OpenCL v1.1 s6.5.2 and s6.5.3: no local or constant variables
|
||||
// in functions.
|
||||
if (FD && !FD->hasAttr<OpenCLKernelAttr>()) {
|
||||
if (T.getAddressSpace() == LangAS::opencl_constant)
|
||||
Diag(NewVD->getLocation(), diag::err_opencl_function_variable)
|
||||
|
@ -7275,6 +7275,20 @@ void Sema::CheckVariableDeclarationType(VarDecl *NewVD) {
|
|||
NewVD->setInvalidDecl();
|
||||
return;
|
||||
}
|
||||
// OpenCL v2.0 s6.5.2 and s6.5.3: local and constant variables must be
|
||||
// in the outermost scope of a kernel function.
|
||||
if (FD && FD->hasAttr<OpenCLKernelAttr>()) {
|
||||
if (!getCurScope()->isFunctionScope()) {
|
||||
if (T.getAddressSpace() == LangAS::opencl_constant)
|
||||
Diag(NewVD->getLocation(), diag::err_opencl_addrspace_scope)
|
||||
<< "constant";
|
||||
else
|
||||
Diag(NewVD->getLocation(), diag::err_opencl_addrspace_scope)
|
||||
<< "local";
|
||||
NewVD->setInvalidDecl();
|
||||
return;
|
||||
}
|
||||
}
|
||||
} else if (T.getAddressSpace() != LangAS::Default) {
|
||||
// Do not allow other address spaces on automatic variable.
|
||||
Diag(NewVD->getLocation(), diag::err_as_qualified_auto_decl) << 1;
|
||||
|
|
|
@ -13,6 +13,11 @@ void kernel foo(int x) {
|
|||
constant int L1 = 0;
|
||||
local int L2;
|
||||
|
||||
if (true) {
|
||||
local int L1; // expected-error {{variables in the local address space can only be declared in the outermost scope of a kernel function}}
|
||||
constant int L1 = 42; // expected-error {{variables in the constant address space can only be declared in the outermost scope of a kernel function}}
|
||||
}
|
||||
|
||||
auto int L3 = 7; // expected-error{{OpenCL version 1.2 does not support the 'auto' storage class specifier}}
|
||||
global int L4; // expected-error{{function scope variable cannot be declared in global address space}}
|
||||
__attribute__((address_space(100))) int L5; // expected-error{{automatic variable qualified with an invalid address space}}
|
||||
|
|
Loading…
Reference in New Issue