From: Douglas Gregor Date: Fri, 19 Jun 2015 23:18:03 +0000 (+0000) Subject: Stop moving attributes off of a block literal's decl specifiers. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=9932005c200e548549ffdb45c1bc079d2c330ec4;p=clang Stop moving attributes off of a block literal's decl specifiers. These usually apply to the return type. At one point this was necessary to get some of them to apply to the entire block, but it appears that's working anyway (see block-return.c). rdar://problem/20468034 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@240189 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Parse/ParseExpr.cpp b/lib/Parse/ParseExpr.cpp index cee9079d50..da759c7652 100644 --- a/lib/Parse/ParseExpr.cpp +++ b/lib/Parse/ParseExpr.cpp @@ -2640,9 +2640,6 @@ void Parser::ParseBlockId(SourceLocation CaretLoc) { Declarator DeclaratorInfo(DS, Declarator::BlockLiteralContext); ParseDeclarator(DeclaratorInfo); - // We do this for: ^ __attribute__((noreturn)) {, as DS has the attributes. - DeclaratorInfo.takeAttributes(DS.getAttributes(), SourceLocation()); - MaybeParseGNUAttributes(DeclaratorInfo); // Inform sema that we are starting a block. diff --git a/test/SemaObjC/nullability.m b/test/SemaObjC/nullability.m index 2cbdba1bd3..ca8c2fcd32 100644 --- a/test/SemaObjC/nullability.m +++ b/test/SemaObjC/nullability.m @@ -222,3 +222,11 @@ void testMultiProp(MultiProp *foo) { ip = foo.d; // expected-warning{{from 'MultiProp * __nullable'}} ip = foo.e; // expected-error{{incompatible type 'MultiProp *(^ __nullable)(int)'}} } + +void testBlockLiterals() { + (void)(^id(void) { return 0; }); + (void)(^id __nullable (void) { return 0; }); + (void)(^ __nullable id(void) { return 0; }); + + int *x = (^ __nullable id(void) { return 0; })(); // expected-warning{{incompatible pointer types initializing 'int *' with an expression of type 'id __nullable'}} +}