r240189 - Stop moving attributes off of a block literal's decl specifiers.

Douglas Gregor dgregor at apple.com
Fri Jun 19 16:18:03 PDT 2015


Author: dgregor
Date: Fri Jun 19 18:18:03 2015
New Revision: 240189

URL: http://llvm.org/viewvc/llvm-project?rev=240189&view=rev
Log:
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

Modified:
    cfe/trunk/lib/Parse/ParseExpr.cpp
    cfe/trunk/test/SemaObjC/nullability.m

Modified: cfe/trunk/lib/Parse/ParseExpr.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParseExpr.cpp?rev=240189&r1=240188&r2=240189&view=diff
==============================================================================
--- cfe/trunk/lib/Parse/ParseExpr.cpp (original)
+++ cfe/trunk/lib/Parse/ParseExpr.cpp Fri Jun 19 18:18:03 2015
@@ -2640,9 +2640,6 @@ void Parser::ParseBlockId(SourceLocation
   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.

Modified: cfe/trunk/test/SemaObjC/nullability.m
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaObjC/nullability.m?rev=240189&r1=240188&r2=240189&view=diff
==============================================================================
--- cfe/trunk/test/SemaObjC/nullability.m (original)
+++ cfe/trunk/test/SemaObjC/nullability.m Fri Jun 19 18:18:03 2015
@@ -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'}}
+}





More information about the cfe-commits mailing list