]> granicus.if.org Git - clang/commitdiff
ExprConstant handling for a couple more cases of pointer-to-int casts
authorEli Friedman <eli.friedman@gmail.com>
Fri, 20 Feb 2009 01:15:07 +0000 (01:15 +0000)
committerEli Friedman <eli.friedman@gmail.com>
Fri, 20 Feb 2009 01:15:07 +0000 (01:15 +0000)
from the testsuite.

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

lib/AST/ExprConstant.cpp

index 5e08e52a7ca2218c8d775180b30723fcf820f311..fe4429743834d67c19510e01bfaada782105c76a 100644 (file)
@@ -1053,9 +1053,10 @@ bool IntExprEvaluator::VisitCastExpr(CastExpr *E) {
     if (!Visit(SubExpr))
       return false;
 
-    // FIXME: Support cast on LValue results.
-    if (!Result.isInt())
-      return false;
+    if (!Result.isInt()) {
+      // Only allow casts of lvalues if they are lossless.
+      return Info.Ctx.getTypeSize(DestType) == Info.Ctx.getTypeSize(SrcType);
+    }
 
     return Success(HandleIntToIntCast(DestType, SrcType,
                                       Result.getInt(), Info.Ctx), E);
@@ -1080,6 +1081,20 @@ bool IntExprEvaluator::VisitCastExpr(CastExpr *E) {
     return Success(HandleIntToIntCast(DestType, SrcType, AsInt, Info.Ctx), E);
   }
 
+  if (SrcType->isArrayType() || SrcType->isFunctionType()) {
+    // This handles double-conversion cases, where there's both
+    // an l-value promotion and an implicit conversion to int.
+    APValue LV;
+    if (!EvaluateLValue(SubExpr, LV, Info))
+      return false;
+
+    if (Info.Ctx.getTypeSize(DestType) != Info.Ctx.getTypeSize(Info.Ctx.VoidPtrTy))
+      return false;
+
+    Result = LV;
+    return true;
+  }
+
   if (!SrcType->isRealFloatingType())
     return Error(E->getExprLoc(), diag::note_invalid_subexpr_in_ice, E);