]> granicus.if.org Git - clang/commitdiff
Fix <rdar://problem/6125909>.
authorTed Kremenek <kremenek@apple.com>
Thu, 7 Aug 2008 00:49:01 +0000 (00:49 +0000)
committerTed Kremenek <kremenek@apple.com>
Thu, 7 Aug 2008 00:49:01 +0000 (00:49 +0000)
Unify logic in return-of-stack-check (Sema) for casts and implicit casts.

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

lib/Sema/SemaChecking.cpp

index 5da9cd7ae203b7773700a57731aa3d42c7224935..2f2fe7dab65e5c20b9b11f0e28023ead6dfa8c4a 100644 (file)
@@ -797,30 +797,26 @@ static DeclRefExpr* EvalAddr(Expr *E) {
      return EvalAddr(C->getRHS());
   }
     
-  // For implicit casts, we need to handle conversions from arrays to
-  // pointer values, and implicit pointer-to-pointer conversions.
+  // For casts, we need to handle conversions from arrays to
+  // pointer values, and pointer-to-pointer conversions.
+  case Stmt::CastExprClass:
   case Stmt::ImplicitCastExprClass: {
-    ImplicitCastExpr *IE = cast<ImplicitCastExpr>(E);
-    Expr* SubExpr = IE->getSubExpr();
     
-    if (SubExpr->getType()->isPointerType() ||
-        SubExpr->getType()->isObjCQualifiedIdType())
-      return EvalAddr(SubExpr);
+    Expr* SubExpr;
+    
+    if (ImplicitCastExpr *IE = dyn_cast<ImplicitCastExpr>(E))
+      SubExpr = IE->getSubExpr();
     else
-      return EvalVal(SubExpr);
-  }
-
-  // For casts, we handle pointer-to-pointer conversions (which
-  // is essentially a no-op from our mini-interpreter's standpoint).
-  // For other casts we abort.
-  case Stmt::CastExprClass: {
-    CastExpr *C = cast<CastExpr>(E);
-    Expr *SubExpr = C->getSubExpr();
+      SubExpr = cast<CastExpr>(E)->getSubExpr();
+    
+    QualType T = SubExpr->getType();
     
-    if (SubExpr->getType()->isPointerType())
+    if (T->isPointerType() || T->isObjCQualifiedIdType())
       return EvalAddr(SubExpr);
+    else if (T->isArrayType())
+      return EvalVal(SubExpr);
     else
-      return NULL;
+      return 0;
   }
     
   // C++ casts.  For dynamic casts, static casts, and const casts, we