Sema and CodeGen support for attributes on blocks.  Radar 6441502


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@70403 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Parse/ParseExpr.cpp b/lib/Parse/ParseExpr.cpp
index f299c52..1f37532 100644
--- a/lib/Parse/ParseExpr.cpp
+++ b/lib/Parse/ParseExpr.cpp
@@ -1290,6 +1290,13 @@
   // Parse the block-declarator.
   Declarator DeclaratorInfo(DS, Declarator::BlockLiteralContext);
   ParseDeclarator(DeclaratorInfo);
+
+  if (Tok.is(tok::kw___attribute)) {
+    SourceLocation Loc;
+    AttributeList *AttrList = ParseAttributes(&Loc);
+    DeclaratorInfo.AddAttributes(AttrList, Loc);
+  }
+
   // Inform sema that we are starting a block.
   Actions.ActOnBlockArguments(DeclaratorInfo, CurScope);
 }
@@ -1345,6 +1352,13 @@
       Actions.ActOnBlockError(CaretLoc, CurScope);
       return ExprError();
     }
+
+    if (Tok.is(tok::kw___attribute)) {
+      SourceLocation Loc;
+      AttributeList *AttrList = ParseAttributes(&Loc);
+      ParamInfo.AddAttributes(AttrList, Loc);
+    }
+
     // Inform sema that we are starting a block.
     Actions.ActOnBlockArguments(ParamInfo, CurScope);
   } else if (!Tok.is(tok::l_brace)) {
@@ -1357,6 +1371,13 @@
                                                        false, false, 0, 0,
                                                        CaretLoc, ParamInfo),
                           CaretLoc);
+
+    if (Tok.is(tok::kw___attribute)) {
+      SourceLocation Loc;
+      AttributeList *AttrList = ParseAttributes(&Loc);
+      ParamInfo.AddAttributes(AttrList, Loc);
+    }
+
     // Inform sema that we are starting a block.
     Actions.ActOnBlockArguments(ParamInfo, CurScope);
   }