More type checking for blocks. Still incomplete (will hopefully finish up this weekend).


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@55862 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Sema/SemaChecking.cpp b/lib/Sema/SemaChecking.cpp
index 1c1c594..8c59039 100644
--- a/lib/Sema/SemaChecking.cpp
+++ b/lib/Sema/SemaChecking.cpp
@@ -711,11 +711,15 @@
                            SourceLocation ReturnLoc) {
    
   // Perform checking for returned stack addresses.
-  if (lhsType->isPointerType()) {
+  if (lhsType->isPointerType() || lhsType->isBlockPointerType()) {
     if (DeclRefExpr *DR = EvalAddr(RetValExp))
       Diag(DR->getLocStart(), diag::warn_ret_stack_addr,
            DR->getDecl()->getIdentifier()->getName(),
            RetValExp->getSourceRange());
+           
+    if (BlockExpr *C = dyn_cast_or_null<BlockExpr>(EvalAddr(RetValExp)))
+      Diag(C->getLocStart(), diag::err_ret_local_block,
+           C->getSourceRange());
   }
   // Perform checking for stack values returned by reference.
   else if (lhsType->isReferenceType()) {
@@ -751,7 +755,8 @@
 ///   * taking the address of an array element where the array is on the stack
 static DeclRefExpr* EvalAddr(Expr *E) {
   // We should only be called for evaluating pointer expressions.
-  assert((E->getType()->isPointerType() || 
+  assert((E->getType()->isPointerType() ||
+          E->getType()->isBlockPointerType() ||
           E->getType()->isObjCQualifiedIdType()) &&
          "EvalAddr only works on pointers");
     
@@ -814,7 +819,9 @@
     Expr* SubExpr = cast<CastExpr>(E)->getSubExpr();
     QualType T = SubExpr->getType();
     
-    if (T->isPointerType() || T->isObjCQualifiedIdType())
+    if (SubExpr->getType()->isPointerType() ||
+        SubExpr->getType()->isBlockPointerType() ||
+        SubExpr->getType()->isObjCQualifiedIdType())
       return EvalAddr(SubExpr);
     else if (T->isArrayType())
       return EvalVal(SubExpr);
@@ -832,7 +839,7 @@
     
     if (C->getOpcode() == CXXCastExpr::ReinterpretCast) {
       Expr *S = C->getSubExpr();
-      if (S->getType()->isPointerType())
+      if (S->getType()->isPointerType() || S->getType()->isBlockPointerType())
         return EvalAddr(S);
       else
         return NULL;