]> granicus.if.org Git - clang/commitdiff
Adjust isModifiableLvalue to give a slightly more useful diagnostic for
authorEli Friedman <eli.friedman@gmail.com>
Sun, 22 Mar 2009 23:26:56 +0000 (23:26 +0000)
committerEli Friedman <eli.friedman@gmail.com>
Sun, 22 Mar 2009 23:26:56 +0000 (23:26 +0000)
attempting to illegally modify a BlockDeclRefExpr.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@67491 91177308-0d34-0410-b5e6-96231b3b80d8

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

index f2553c3390d24c8568eb51ed01537f5871f2ea66..789fbc5ce1d3e82a4ed8ceee0f52a3a98e960edb 100644 (file)
@@ -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) {
index 290cef1fed627f434efb2b699f6fe34cfaafc0e0..4890839b97a1d3258f5fe235b34339f3e07d71ee 100644 (file)
@@ -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; });
 }