From 9d3430f3554642431cf817fce020681c01e5009f 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 llvm-svn: 240189 --- clang/lib/Parse/ParseExpr.cpp | 3 --- clang/test/SemaObjC/nullability.m | 8 ++++++++ 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/clang/lib/Parse/ParseExpr.cpp b/clang/lib/Parse/ParseExpr.cpp index cee9079..da759c7 100644 --- a/clang/lib/Parse/ParseExpr.cpp +++ b/clang/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/clang/test/SemaObjC/nullability.m b/clang/test/SemaObjC/nullability.m index 2cbdba1..ca8c2fc 100644 --- a/clang/test/SemaObjC/nullability.m +++ b/clang/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.7.4