summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArgyrios Kyrtzidis <akyrtzi@gmail.com>2011-01-25 23:16:33 +0000
committerArgyrios Kyrtzidis <akyrtzi@gmail.com>2011-01-25 23:16:33 +0000
commit20ad245e3e22cebe883dab8c0982136374d8aeec (patch)
tree334309f416491bbe7dabc1f9cab6973ee51df6c9
parent175a104028301d7e9fe7a1c046fafbe5fd55b45f (diff)
downloadbcm5719-llvm-20ad245e3e22cebe883dab8c0982136374d8aeec.tar.gz
bcm5719-llvm-20ad245e3e22cebe883dab8c0982136374d8aeec.zip
Change error "function cannot return array type" -> "blocks cannot return array type" when blocks are involved.
Addresses rdar://8876238. llvm-svn: 124242
-rw-r--r--clang/include/clang/Basic/DiagnosticSemaKinds.td4
-rw-r--r--clang/lib/Sema/SemaType.cpp6
-rw-r--r--clang/test/Sema/block-return.c2
3 files changed, 7 insertions, 5 deletions
diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td
index f33285c7d4f..9518ed91bfb 100644
--- a/clang/include/clang/Basic/DiagnosticSemaKinds.td
+++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td
@@ -3381,8 +3381,8 @@ def err_blocks_disable : Error<"blocks support disabled - compile with -fblocks"
def err_expected_block_lbrace : Error<"expected '{' in block literal">;
def err_return_in_block_expression : Error<
"return not allowed in block expression literal">;
-def err_block_returns_array : Error<
- "block declared as returning an array">;
+def err_block_returning_array_function : Error<
+ "block cannot return %select{array|function}0 type %1">;
// CFString checking
diff --git a/clang/lib/Sema/SemaType.cpp b/clang/lib/Sema/SemaType.cpp
index c8f7545602b..09ebbc085fe 100644
--- a/clang/lib/Sema/SemaType.cpp
+++ b/clang/lib/Sema/SemaType.cpp
@@ -1621,8 +1621,10 @@ TypeSourceInfo *Sema::GetTypeForDeclarator(Declarator &D, Scope *S,
// For conversion functions, we'll diagnose this particular error later.
if ((T->isArrayType() || T->isFunctionType()) &&
(D.getName().getKind() != UnqualifiedId::IK_ConversionFunctionId)) {
- Diag(DeclType.Loc, diag::err_func_returning_array_function)
- << T->isFunctionType() << T;
+ unsigned diagID = diag::err_func_returning_array_function;
+ if (D.getContext() == Declarator::BlockLiteralContext)
+ diagID = diag::err_block_returning_array_function;
+ Diag(DeclType.Loc, diagID) << T->isFunctionType() << T;
T = Context.IntTy;
D.setInvalidType(true);
}
diff --git a/clang/test/Sema/block-return.c b/clang/test/Sema/block-return.c
index 5741fc9c6df..2eb51e79ccb 100644
--- a/clang/test/Sema/block-return.c
+++ b/clang/test/Sema/block-return.c
@@ -97,7 +97,7 @@ bptr foo5(int j) {
}
int (*funcptr3[5])(long);
-int sz8 = sizeof(^int (*[5])(long) {return funcptr3;}); // expected-error {{function cannot return array type}} expected-warning {{incompatible pointer to integer conversion}}
+int sz8 = sizeof(^int (*[5])(long) {return funcptr3;}); // expected-error {{block cannot return array type}} expected-warning {{incompatible pointer to integer conversion}}
void foo6() {
int (^b)(int) __attribute__((noreturn));
OpenPOWER on IntegriCloud