]> granicus.if.org Git - clang/commitdiff
Fix <rdar://problem/6765383> clang-6: clang does not appear to support declaring...
authorSteve Naroff <snaroff@apple.com>
Thu, 16 Apr 2009 19:02:57 +0000 (19:02 +0000)
committerSteve Naroff <snaroff@apple.com>
Thu, 16 Apr 2009 19:02:57 +0000 (19:02 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@69306 91177308-0d34-0410-b5e6-96231b3b80d8

lib/AST/Expr.cpp
lib/AST/ExprConstant.cpp
test/Sema/block-literal.c

index 9e8958c0733cc05c8f4eecaad1d01bceb3e71cb8..083bf3b80871e31b17c789681af102059d486aab 100644 (file)
@@ -854,6 +854,8 @@ bool Expr::hasGlobalStorage() const {
   switch (getStmtClass()) {
   default:
     return false;
+  case BlockExprClass:
+    return true;
   case ParenExprClass:
     return cast<ParenExpr>(this)->getSubExpr()->hasGlobalStorage();
   case ImplicitCastExprClass:
index 327fff0c0b1644013c26e0bb32d48bd3adfff673..8fd75f1808eb29ccbc9f6cca22c2b60050fd21dc 100644 (file)
@@ -156,6 +156,7 @@ public:
 
   APValue VisitParenExpr(ParenExpr *E) { return Visit(E->getSubExpr()); }
   APValue VisitDeclRefExpr(DeclRefExpr *E);
+  APValue VisitBlockExpr(BlockExpr *E);
   APValue VisitPredefinedExpr(PredefinedExpr *E) { return APValue(E, 0); }
   APValue VisitCompoundLiteralExpr(CompoundLiteralExpr *E);
   APValue VisitMemberExpr(MemberExpr *E);
@@ -184,6 +185,14 @@ APValue LValueExprEvaluator::VisitDeclRefExpr(DeclRefExpr *E)
   return APValue(E, 0); 
 }
 
+APValue LValueExprEvaluator::VisitBlockExpr(BlockExpr *E)
+{ 
+  if (E->hasBlockDeclRefExprs())
+    return APValue();
+    
+  return APValue(E, 0);
+}
+
 APValue LValueExprEvaluator::VisitCompoundLiteralExpr(CompoundLiteralExpr *E) {
   if (E->isFileScope())
     return APValue(E, 0);
@@ -373,6 +382,7 @@ APValue PointerExprEvaluator::VisitCastExpr(const CastExpr* E) {
   }
 
   if (SubExpr->getType()->isFunctionType() ||
+      SubExpr->getType()->isBlockPointerType() ||
       SubExpr->getType()->isArrayType()) {
     APValue Result;
     if (EvaluateLValue(SubExpr, Result, Info))
index 2dc458124319be83088e9f94db046b4f993ea7e7..040c383033b2ee12e0761b8b6f6e48cc03e17140 100644 (file)
@@ -81,6 +81,12 @@ void test_arguments() {
 static int global_x = 10;
 void (^global_block)(void) = ^{ printf("global x is %d\n", global_x); };
 
+typedef void (^void_block_t)(void);
+
+static const void_block_t myBlock = ^{ };
+
+static const void_block_t myBlock2 = ^ void(void) { }; 
+
 #if 0
 // Old syntax. FIXME: convert/test.
 void test_byref() {