diff options
author | Fariborz Jahanian <fjahanian@apple.com> | 2012-03-05 19:34:00 +0000 |
---|---|---|
committer | Fariborz Jahanian <fjahanian@apple.com> | 2012-03-05 19:34:00 +0000 |
commit | abf9d908cce6ffe2ee7b739d98fc7344a4f9fe3b (patch) | |
tree | 78ff3c89d85ee81fc80ef1962d1c9add5b2e6b6a | |
parent | a187c5cc7cbc4931ef488374648348de5c057aee (diff) |
patch to optionally warn for block implementations without explicit
return types that return non-void values. // rdar://10735698
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@152047 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | include/clang/Basic/DiagnosticSemaKinds.td | 4 | ||||
-rw-r--r-- | lib/Sema/SemaExpr.cpp | 7 | ||||
-rw-r--r-- | test/Sema/block-missing-return-type-warning.c | 18 | ||||
-rw-r--r-- | test/Sema/warn-unused-parameters.c | 6 |
4 files changed, 31 insertions, 4 deletions
diff --git a/include/clang/Basic/DiagnosticSemaKinds.td b/include/clang/Basic/DiagnosticSemaKinds.td index 5d3ff2a4af..816956051c 100644 --- a/include/clang/Basic/DiagnosticSemaKinds.td +++ b/include/clang/Basic/DiagnosticSemaKinds.td @@ -4953,6 +4953,10 @@ def err_blocks_disable : Error<"blocks support disabled - compile with -fblocks" " or pick a deployment target that supports them">; def err_block_returning_array_function : Error< "block cannot return %select{array|function}0 type %1">; +def warn_block_missing_return_type : Warning< + "block literal is missing explicit return type and " + "returns non-void values">, + InGroup<DiagGroup<"block-missing-explicit-return-type">>, DefaultIgnore; // Builtin annotation string. def err_builtin_annotation_not_string_constant : Error< diff --git a/lib/Sema/SemaExpr.cpp b/lib/Sema/SemaExpr.cpp index ab96f7416f..aba38db035 100644 --- a/lib/Sema/SemaExpr.cpp +++ b/lib/Sema/SemaExpr.cpp @@ -8902,7 +8902,12 @@ ExprResult Sema::ActOnBlockStmtExpr(SourceLocation CaretLoc, ExprCleanupObjects.push_back(Result->getBlockDecl()); ExprNeedsCleanups = true; } - + + if (BSI->TheDecl->blockMissingReturnType() && + !RetTy->isDependentType() && + !Context.getCanonicalType(RetTy)->isVoidType()) + Diag(CaretLoc, diag::warn_block_missing_return_type); + return Owned(Result); } diff --git a/test/Sema/block-missing-return-type-warning.c b/test/Sema/block-missing-return-type-warning.c new file mode 100644 index 0000000000..c029ae610f --- /dev/null +++ b/test/Sema/block-missing-return-type-warning.c @@ -0,0 +1,18 @@ +// RUN: %clang_cc1 %s -fsyntax-only -verify -fblocks -Wblock-missing-explicit-return-type +// rdar://10735698 + +int f; +int main() { + int (^bar)() = ^{ if (f) return 'a'; // expected-warning {{block literal is missing explicit return type and returns non-void values}} + else return 10; + }; + + void (^bar1)() = ^{ f = 100; }; + + void (^bar2)() = ^(void){ f = 100; }; + + int (^bar3)() = ^ int { if (f) return 'a'; + else return 10; + }; + +} diff --git a/test/Sema/warn-unused-parameters.c b/test/Sema/warn-unused-parameters.c index af048e77e8..28a6bcb799 100644 --- a/test/Sema/warn-unused-parameters.c +++ b/test/Sema/warn-unused-parameters.c @@ -24,7 +24,7 @@ static void achor() {}; // RUN: %clang_cc1 -fblocks -fsyntax-only -Weverything %s 2>&1 | FileCheck -check-prefix=CHECK-everything %s // RUN: %clang_cc1 -fblocks -fsyntax-only -Weverything -Werror %s 2>&1 | FileCheck -check-prefix=CHECK-everything-error %s // RUN: %clang_cc1 -fblocks -fsyntax-only -Weverything -Wno-unused %s 2>&1 | FileCheck -check-prefix=CHECK-everything-no-unused %s -// CHECK-everything: 6 warnings generated -// CHECK-everything-error: 5 errors generated -// CHECK-everything-no-unused: 5 warnings generated +// CHECK-everything: 7 warnings generated +// CHECK-everything-error: 6 errors generated +// CHECK-everything-no-unused: 6 warnings generated |