summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJoey Gouly <joey.gouly@gmail.com>2014-01-06 11:26:18 +0000
committerJoey Gouly <joey.gouly@gmail.com>2014-01-06 11:26:18 +0000
commit16cb99dd15834bcc0c857e0bbfb1c9b48a26d694 (patch)
tree9c8c16901d364fef2ec86e195d49982cb729b47b
parent20b9966e5f6a7cc0e0d374492c2de1062888b156 (diff)
downloadbcm5719-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.td2
-rw-r--r--clang/lib/Sema/SemaDecl.cpp13
-rw-r--r--clang/test/SemaOpenCL/invalid-kernel.cl12
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;
+}
OpenPOWER on IntegriCloud