From: Mike Stump Date: Tue, 28 Apr 2009 01:10:27 +0000 (+0000) Subject: Don't allow blocks to be declared as returning an array. Radar 6441502 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=4eeab84b6527feba5c63b819a74417677c9977a0;p=clang 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 --- 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}}