diff options
| author | Steve Naroff <snaroff@apple.com> | 2009-04-16 19:02:57 +0000 | 
|---|---|---|
| committer | Steve Naroff <snaroff@apple.com> | 2009-04-16 19:02:57 +0000 | 
| commit | a0c32704e26c554c5a41c13f1bd7671c76660f3a (patch) | |
| tree | be4c7f63e42d14470ccdb4b231a9587474d3fd8b | |
| parent | bcf548760edada00ede16f06ab07c4bbde252c71 (diff) | |
| download | bcm5719-llvm-a0c32704e26c554c5a41c13f1bd7671c76660f3a.tar.gz bcm5719-llvm-a0c32704e26c554c5a41c13f1bd7671c76660f3a.zip  | |
Fix <rdar://problem/6765383> clang-6: clang does not appear to support declaring a static Block 'const'.
llvm-svn: 69306
| -rw-r--r-- | clang/lib/AST/Expr.cpp | 2 | ||||
| -rw-r--r-- | clang/lib/AST/ExprConstant.cpp | 10 | ||||
| -rw-r--r-- | clang/test/Sema/block-literal.c | 6 | 
3 files changed, 18 insertions, 0 deletions
diff --git a/clang/lib/AST/Expr.cpp b/clang/lib/AST/Expr.cpp index 9e8958c0733..083bf3b8087 100644 --- a/clang/lib/AST/Expr.cpp +++ b/clang/lib/AST/Expr.cpp @@ -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: diff --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp index 327fff0c0b1..8fd75f1808e 100644 --- a/clang/lib/AST/ExprConstant.cpp +++ b/clang/lib/AST/ExprConstant.cpp @@ -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)) diff --git a/clang/test/Sema/block-literal.c b/clang/test/Sema/block-literal.c index 2dc45812431..040c383033b 100644 --- a/clang/test/Sema/block-literal.c +++ b/clang/test/Sema/block-literal.c @@ -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() {  | 

