]> granicus.if.org Git - clang/commitdiff
Allow void blocks to return witn a void expression in
authorFariborz Jahanian <fjahanian@apple.com>
Wed, 21 Mar 2012 16:45:13 +0000 (16:45 +0000)
committerFariborz Jahanian <fjahanian@apple.com>
Wed, 21 Mar 2012 16:45:13 +0000 (16:45 +0000)
c-mode to match behavior with void functions in c. Issue
warning with -pedantic. // rdar://11069896

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@153200 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Basic/DiagnosticSemaKinds.td
lib/Sema/SemaStmt.cpp
test/Sema/block-return.c

index 1efa4f2f17147ee5e4f3ccf9b63f7089f97a9542..2ce1e895dcca21a8f2e404bed66356a189be416b 100644 (file)
@@ -5159,7 +5159,7 @@ def ext_return_has_expr : ExtWarn<
   "should not return a value">,
   DefaultError, InGroup<ReturnType>;
 def ext_return_has_void_expr : Extension<
-  "void %select{function|method}1 %0 should not return void expression">;
+  "void %select{function|method|block}1 %0 should not return void expression">;
 def err_return_init_list : Error<
   "%select{void function|void method|constructor|destructor}1 %0 "
   "must not return a value">;
index ef453f5c6ae811128aaf50713e12ca00ee9ae27a..333f6dd25526df917fb3d40517cb70ac9e4b46ff 100644 (file)
@@ -1886,8 +1886,13 @@ Sema::ActOnCapScopeReturnStmt(SourceLocation ReturnLoc, Expr *RetValExp) {
         !(getLangOpts().CPlusPlus &&
           (RetValExp->isTypeDependent() ||
            RetValExp->getType()->isVoidType()))) {
-      Diag(ReturnLoc, diag::err_return_block_has_expr);
-      RetValExp = 0;
+      if (!getLangOpts().CPlusPlus &&
+          RetValExp->getType()->isVoidType())
+        Diag(ReturnLoc, diag::ext_return_has_void_expr) << "" << 2;
+      else {
+        Diag(ReturnLoc, diag::err_return_block_has_expr);
+        RetValExp = 0;
+      }
     }
   } else if (!RetValExp) {
     return StmtError(Diag(ReturnLoc, diag::err_block_return_missing_expr));
index e8c651652bcfaa314ccf01265972b5b9b478b954..67bc5c7dfe20addecff64648c22530955b895973 100644 (file)
@@ -1,4 +1,4 @@
-// RUN: %clang_cc1 -fsyntax-only %s -verify -fblocks
+// RUN: %clang_cc1 -pedantic -fsyntax-only %s -verify -fblocks
 
 typedef void (^CL)(void);
 
@@ -130,4 +130,7 @@ void foo7()
   int (^NN) (void)  = ^{ return cint; };
 }
 
-
+// rdar://11069896
+void (^blk)(void) = ^{
+    return (void)0; // expected-warning {{void block  should not return void expression}}
+};