diff options
| -rw-r--r-- | clang/include/clang/Basic/DiagnosticSemaKinds.td | 2 | ||||
| -rw-r--r-- | clang/lib/Sema/SemaStmt.cpp | 9 | ||||
| -rw-r--r-- | clang/test/Sema/block-return.c | 7 | 
3 files changed, 13 insertions, 5 deletions
diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td index 1efa4f2f171..2ce1e895dcc 100644 --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -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">; diff --git a/clang/lib/Sema/SemaStmt.cpp b/clang/lib/Sema/SemaStmt.cpp index ef453f5c6ae..333f6dd2552 100644 --- a/clang/lib/Sema/SemaStmt.cpp +++ b/clang/lib/Sema/SemaStmt.cpp @@ -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)); diff --git a/clang/test/Sema/block-return.c b/clang/test/Sema/block-return.c index e8c651652bc..67bc5c7dfe2 100644 --- a/clang/test/Sema/block-return.c +++ b/clang/test/Sema/block-return.c @@ -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}} +};  | 

