]> granicus.if.org Git - clang/commitdiff
Add OpenCL error that a kernel function must have void return type. Includes a test...
authorTanya Lattner <tonic@nondot.org>
Wed, 30 Jan 2013 19:48:52 +0000 (19:48 +0000)
committerTanya Lattner <tonic@nondot.org>
Wed, 30 Jan 2013 19:48:52 +0000 (19:48 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@173963 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Basic/DiagnosticSemaKinds.td
lib/Sema/SemaDecl.cpp
test/SemaOpenCL/invalid-kernel.cl

index a3b03033d23e7f80b1f1f6ed9cd7a6b7d88dd03c..e398da955b53add069ea38a907c3633a143e5a00 100644 (file)
@@ -6124,6 +6124,8 @@ def err_event_t_struct_field : Error<
   "the event_t type cannot be used to declare a structure or union field">;
 def err_event_t_addr_space_qual : Error<
   "the event_t type can only be used with __private address space qualifier">;
+def err_expected_kernel_void_return_type : Error<
+  "kernel must have void return type">;
 
 } // end of sema category
 
index c94bf5f092f89a4f5f3e26d49ee5efad1103472f..24dffc0299dae90cae941794803489364dc51960 100644 (file)
@@ -6227,7 +6227,14 @@ Sema::ActOnFunctionDeclarator(Scope *S, Declarator &D, DeclContext *DC,
       Diag(D.getIdentifierLoc(), diag::err_static_kernel);
       D.setInvalidType();
     }
-
+    
+    // OpenCL v1.2, s6.9 -- Kernels can only have return type void.
+    if (!NewFD->getResultType()->isVoidType()) {
+      Diag(D.getIdentifierLoc(),
+           diag::err_expected_kernel_void_return_type);
+      D.setInvalidType();
+    }
+    
     for (FunctionDecl::param_iterator PI = NewFD->param_begin(),
          PE = NewFD->param_end(); PI != PE; ++PI) {
       ParmVarDecl *Param = *PI;
index a06b0e1e0977aa4377826320d5aa76ab236a063f..fb8ce5876f937825f1bffd23db889afd3dd8c780 100644 (file)
@@ -1,3 +1,7 @@
 // RUN: %clang_cc1 -verify %s
 
 kernel void no_ptrptr(global int **i) { } // expected-error{{kernel argument cannot be declared as a pointer to a pointer}}
+
+kernel int bar()  { // expected-error {{kernel must have void return type}}
+  return 6;
+}