Tweak Expr::isModifiableLvalue() and Expr::isLvalue() to better deal with BlockDeclRef exprs.

This fixes <rdar://problem/6248392> clang: Error when using address of stack variable inside block.



git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@56652 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/AST/Expr.cpp b/lib/AST/Expr.cpp
index 9c3d623..456b87b 100644
--- a/lib/AST/Expr.cpp
+++ b/lib/AST/Expr.cpp
@@ -425,7 +425,7 @@
   }
   case BlockDeclRefExprClass: {
     const BlockDeclRefExpr *BDR = cast<BlockDeclRefExpr>(this);
-    if (BDR->isByRef() && isa<VarDecl>(BDR->getDecl()))
+    if (isa<VarDecl>(BDR->getDecl()))
       return LV_Valid;
     break;
   }
@@ -497,6 +497,15 @@
     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;
+  }
   return MLV_Valid;    
 }