forked from OSchip/llvm-project
Adjust isModifiableLvalue to give a slightly more useful diagnostic for
attempting to illegally modify a BlockDeclRefExpr. llvm-svn: 67491
This commit is contained in:
parent
d8500f3b0f
commit
e8dd7b3228
|
@ -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) {
|
||||
|
|
|
@ -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; });
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue