]> granicus.if.org Git - clang/commitdiff
Sema: diagnose kernel calls to non-global functions
authorPeter Collingbourne <peter@pcc.me.uk>
Wed, 23 Feb 2011 01:53:29 +0000 (01:53 +0000)
committerPeter Collingbourne <peter@pcc.me.uk>
Wed, 23 Feb 2011 01:53:29 +0000 (01:53 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@126292 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Basic/DiagnosticSemaKinds.td
lib/Sema/SemaExpr.cpp
test/SemaCUDA/kernel-call.cu

index 98523ee57f3cf08dcbef796b20640bdaeaaf5390..1ff3c0f316b9f14e7e168a61b81e0a3183cd915c 100644 (file)
@@ -3121,6 +3121,8 @@ def err_kern_type_not_void_return : Error<
   "kernel function type %0 must have void return type">;
 def err_config_scalar_return : Error<
   "CUDA special function 'cudaConfigureCall' must have scalar return type">;
+def err_kern_call_not_global_function : Error<
+  "kernel call to non-global function %0">;
 
 
 def err_cannot_pass_objc_interface_to_vararg : Error<
index 9e2b21aca213b4521c59479d97c61e030b3bd0b6..1ba8ea62b4165a2041ee14503eb189f549351ef3 100644 (file)
@@ -4625,6 +4625,20 @@ Sema::BuildResolvedCallExpr(Expr *Fn, NamedDecl *NDecl,
     return ExprError(Diag(LParenLoc, diag::err_typecheck_call_not_function)
       << Fn->getType() << Fn->getSourceRange());
 
+  if (getLangOptions().CUDA) {
+    if (Config) {
+      // CUDA: Kernel calls must be to global functions
+      if (FDecl && !FDecl->hasAttr<CUDAGlobalAttr>())
+        return ExprError(Diag(LParenLoc,diag::err_kern_call_not_global_function)
+            << FDecl->getName() << Fn->getSourceRange());
+
+      // CUDA: Kernel function must have 'void' return type
+      if (!FuncT->getResultType()->isVoidType())
+        return ExprError(Diag(LParenLoc, diag::err_kern_type_not_void_return)
+            << Fn->getType() << Fn->getSourceRange());
+    }
+  }
+
   // Check for a valid return type
   if (CheckCallReturnType(FuncT->getResultType(),
                           Fn->getSourceRange().getBegin(), TheCall,
index 6d51695522ce4177c223a5d3931d0e44c67e7a3e..7bc7ae1131596a845a0faa8e0ec38c03ac86bf87 100644 (file)
@@ -8,8 +8,16 @@ template <typename T> void t1(T arg) {
   g1<<<arg, arg>>>(1);
 }
 
+void h1(int x) {}
+int h2(int x) { return 1; }
+
 int main(void) {
   g1<<<1, 1>>>(42);
 
   t1(1);
+
+  h1<<<1, 1>>>(42); // expected-error {{kernel call to non-global function h1}}
+
+  int (*fp)(int) = h2;
+  fp<<<1, 1>>>(42); // expected-error {{must have void return type}}
 }