diff options
Diffstat (limited to 'clang')
-rw-r--r-- | clang/include/clang/Basic/DiagnosticSemaKinds.td | 2 | ||||
-rw-r--r-- | clang/lib/Sema/SemaExpr.cpp | 6 | ||||
-rw-r--r-- | clang/test/Sema/block-return.c | 3 |
3 files changed, 11 insertions, 0 deletions
diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td index e115703a95e..fb1820d8ecb 100644 --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/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/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index f2f8ae5797c..045fa180e65 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/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/clang/test/Sema/block-return.c b/clang/test/Sema/block-return.c index e6101d176f8..4b0dbb0b013 100644 --- a/clang/test/Sema/block-return.c +++ b/clang/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}} |