diff options
author | Mike Stump <mrs@apple.com> | 2009-04-28 01:10:27 +0000 |
---|---|---|
committer | Mike Stump <mrs@apple.com> | 2009-04-28 01:10:27 +0000 |
commit | 4eeab84b6527feba5c63b819a74417677c9977a0 (patch) | |
tree | 624a0d360d958cc90d462fab1087ea747f28dcb4 | |
parent | 3575f84e459033d6427b84b4b795b22c85c4d27d (diff) |
Don't allow blocks to be declared as returning an array. Radar 6441502
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@70277 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | include/clang/Basic/DiagnosticSemaKinds.td | 2 | ||||
-rw-r--r-- | lib/Sema/SemaExpr.cpp | 6 | ||||
-rw-r--r-- | test/Sema/block-return.c | 3 |
3 files changed, 11 insertions, 0 deletions
diff --git a/include/clang/Basic/DiagnosticSemaKinds.td b/include/clang/Basic/DiagnosticSemaKinds.td index e115703a95..fb1820d8ec 100644 --- a/include/clang/Basic/DiagnosticSemaKinds.td +++ b/include/clang/Basic/DiagnosticSemaKinds.td @@ -1551,6 +1551,8 @@ def err_goto_in_block : Error< "goto not allowed 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_ret_local_block : Error< "returning block that lives on the local stack">; diff --git a/lib/Sema/SemaExpr.cpp b/lib/Sema/SemaExpr.cpp index f2f8ae5797..045fa180e6 100644 --- a/lib/Sema/SemaExpr.cpp +++ b/lib/Sema/SemaExpr.cpp @@ -4726,6 +4726,12 @@ void Sema::ActOnBlockArguments(Declarator &ParamInfo, Scope *CurScope) { || ParamInfo.getTypeObject(0).Kind != DeclaratorChunk::Function) { QualType T = GetTypeForDeclarator(ParamInfo, CurScope); + if (T->isArrayType()) { + Diag(ParamInfo.getSourceRange().getBegin(), + diag::err_block_returns_array); + return; + } + // The parameter list is optional, if there was none, assume (). if (!T->isFunctionType()) T = Context.getFunctionType(T, NULL, 0, 0, 0); diff --git a/test/Sema/block-return.c b/test/Sema/block-return.c index e6101d176f..4b0dbb0b01 100644 --- a/test/Sema/block-return.c +++ b/test/Sema/block-return.c @@ -92,3 +92,6 @@ bptr foo5(int j) { return ^{ ^{ i=0; }(); }; // expected-error {{returning block that lives on the local stack}} return ^{ i=0; }; // expected-error {{returning block that lives on the local stack}} } + +int (*funcptr3[5])(long); +int sz8 = sizeof(^int (*[5])(long) {return funcptr3;}); // expected-error {{block declared as returning an array}} |