From 9932005c200e548549ffdb45c1bc079d2c330ec4 Mon Sep 17 00:00:00 2001 From: Douglas Gregor Date: Fri, 19 Jun 2015 23:18:03 +0000 Subject: [PATCH] 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 --- lib/Parse/ParseExpr.cpp | 3 --- test/SemaObjC/nullability.m | 8 ++++++++ 2 files changed, 8 insertions(+), 3 deletions(-) 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'}} +} -- 2.40.0