diff options
-rw-r--r-- | lib/AST/Expr.cpp | 21 | ||||
-rw-r--r-- | test/Sema/block-literal.c | 2 |
2 files changed, 12 insertions, 11 deletions
diff --git a/lib/AST/Expr.cpp b/lib/AST/Expr.cpp index f2553c3390..789fbc5ce1 100644 --- a/lib/AST/Expr.cpp +++ b/lib/AST/Expr.cpp @@ -781,7 +781,17 @@ Expr::isModifiableLvalueResult Expr::isModifiableLvalue(ASTContext &Ctx) const { return MLV_InvalidExpression; case LV_MemberFunction: return MLV_MemberFunction; } - + + // The following is illegal: + // void takeclosure(void (^C)(void)); + // void func() { int x = 1; takeclosure(^{ x = 7; }); } + // + if (getStmtClass() == BlockDeclRefExprClass) { + const BlockDeclRefExpr *BDR = cast<BlockDeclRefExpr>(this); + if (!BDR->isByRef() && isa<VarDecl>(BDR->getDecl())) + return MLV_NotBlockQualified; + } + QualType CT = Ctx.getCanonicalType(getType()); if (CT.isConstQualified()) @@ -795,15 +805,6 @@ Expr::isModifiableLvalueResult Expr::isModifiableLvalue(ASTContext &Ctx) const { if (r->hasConstFields()) return MLV_ConstQualified; } - // The following is illegal: - // void takeclosure(void (^C)(void)); - // void func() { int x = 1; takeclosure(^{ x = 7 }); } - // - if (getStmtClass() == BlockDeclRefExprClass) { - const BlockDeclRefExpr *BDR = cast<BlockDeclRefExpr>(this); - if (!BDR->isByRef() && isa<VarDecl>(BDR->getDecl())) - return MLV_NotBlockQualified; - } // Assigning to an 'implicit' property? else if (getStmtClass() == ObjCKVCRefExprClass) { diff --git a/test/Sema/block-literal.c b/test/Sema/block-literal.c index 290cef1fed..4890839b97 100644 --- a/test/Sema/block-literal.c +++ b/test/Sema/block-literal.c @@ -39,7 +39,7 @@ void test2() { } foo: - takeclosure(^{ x = 4; }); // expected-error {{read-only variable is not assignable}} + takeclosure(^{ x = 4; }); // expected-error {{variable is not assignable (missing __block type specifier)}} __block y = 7; // expected-warning {{type specifier missing, defaults to 'int'}} takeclosure(^{ y = 8; }); } |