diff options
author | Joey Gouly <joey.gouly@gmail.com> | 2014-01-06 11:26:18 +0000 |
---|---|---|
committer | Joey Gouly <joey.gouly@gmail.com> | 2014-01-06 11:26:18 +0000 |
commit | 16cb99dd15834bcc0c857e0bbfb1c9b48a26d694 (patch) | |
tree | 9c8c16901d364fef2ec86e195d49982cb729b47b | |
parent | 20b9966e5f6a7cc0e0d374492c2de1062888b156 (diff) | |
download | bcm5719-llvm-16cb99dd15834bcc0c857e0bbfb1c9b48a26d694.tar.gz bcm5719-llvm-16cb99dd15834bcc0c857e0bbfb1c9b48a26d694.zip |
[OpenCL] Produce an error if an address space is used on the return
type of a function.
llvm-svn: 198597
-rw-r--r-- | clang/include/clang/Basic/DiagnosticSemaKinds.td | 2 | ||||
-rw-r--r-- | clang/lib/Sema/SemaDecl.cpp | 13 | ||||
-rw-r--r-- | clang/test/SemaOpenCL/invalid-kernel.cl | 12 |
3 files changed, 27 insertions, 0 deletions
diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td index fe0a2d86d07..255d4db92d2 100644 --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -6714,6 +6714,8 @@ def err_opencl_global_invalid_addr_space : Error< def err_opencl_no_main : Error<"%select{function|kernel}0 cannot be called 'main'">; def err_opencl_kernel_attr : Error<"attribute %0 can only be applied to a kernel function">; +def err_opencl_return_value_with_address_space : Error< + "return value cannot be qualified with address space">; def err_opencl_constant_no_init : Error< "variable in constant address space must be initialized">; } // end of sema category diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp index 793337cc5ad..bdb8bbac72a 100644 --- a/clang/lib/Sema/SemaDecl.cpp +++ b/clang/lib/Sema/SemaDecl.cpp @@ -7030,6 +7030,19 @@ Sema::ActOnFunctionDeclarator(Scope *S, Declarator &D, DeclContext *DC, } } + if (getLangOpts().OpenCL) { + // OpenCL v1.1 s6.5: Using an address space qualifier in a function return + // type declaration will generate a compilation error. + unsigned AddressSpace = RetType.getAddressSpace(); + if (AddressSpace == LangAS::opencl_local || + AddressSpace == LangAS::opencl_global || + AddressSpace == LangAS::opencl_constant) { + Diag(NewFD->getLocation(), + diag::err_opencl_return_value_with_address_space); + NewFD->setInvalidDecl(); + } + } + if (!getLangOpts().CPlusPlus) { // Perform semantic checking on the function declaration. bool isExplicitSpecialization=false; diff --git a/clang/test/SemaOpenCL/invalid-kernel.cl b/clang/test/SemaOpenCL/invalid-kernel.cl index c12bd8414e2..62991d46420 100644 --- a/clang/test/SemaOpenCL/invalid-kernel.cl +++ b/clang/test/SemaOpenCL/invalid-kernel.cl @@ -13,3 +13,15 @@ kernel void main() { // expected-error {{kernel cannot be called 'main'}} int main() { // expected-error {{function cannot be called 'main'}} return 0; } + +int* global x(int* x) { // expected-error {{return value cannot be qualified with address space}} + return x + 1; +} + +int* local x(int* x) { // expected-error {{return value cannot be qualified with address space}} + return x + 1; +} + +int* constant x(int* x) { // expected-error {{return value cannot be qualified with address space}} + return x + 1; +} |