aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/clang/Basic/DiagnosticSemaKinds.td4
-rw-r--r--lib/Sema/SemaExpr.cpp7
-rw-r--r--test/Sema/block-missing-return-type-warning.c18
-rw-r--r--test/Sema/warn-unused-parameters.c6
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