diff options
author | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2011-01-25 23:16:33 +0000 |
---|---|---|
committer | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2011-01-25 23:16:33 +0000 |
commit | 20ad245e3e22cebe883dab8c0982136374d8aeec (patch) | |
tree | 334309f416491bbe7dabc1f9cab6973ee51df6c9 | |
parent | 175a104028301d7e9fe7a1c046fafbe5fd55b45f (diff) | |
download | bcm5719-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.td | 4 | ||||
-rw-r--r-- | clang/lib/Sema/SemaType.cpp | 6 | ||||
-rw-r--r-- | clang/test/Sema/block-return.c | 2 |
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)); |