Extend Evaluate() to fold (int) <pointer type>.
 - PR3463, PR3398, <rdar://problem/6553401> crash on relocatable
   symbol addresses as constants in static locals.

 - There are many more scenarious we could handle (like arithmetic on
   such an int) but this is the main use case.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@65074 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/AST/ExprConstant.cpp b/lib/AST/ExprConstant.cpp
index cfe1a74..5e08e52 100644
--- a/lib/AST/ExprConstant.cpp
+++ b/lib/AST/ExprConstant.cpp
@@ -1057,7 +1057,7 @@
     if (!Result.isInt())
       return false;
 
-    return Success(HandleIntToIntCast(DestType, SrcType, 
+    return Success(HandleIntToIntCast(DestType, SrcType,
                                       Result.getInt(), Info.Ctx), E);
   }
   
@@ -1067,10 +1067,17 @@
     if (!EvaluatePointer(SubExpr, LV, Info))
       return false;
 
-    if (LV.getLValueBase())
-      return false;
+    if (LV.getLValueBase()) {
+      // Only allow based lvalue casts if they are lossless.
+      if (Info.Ctx.getTypeSize(DestType) != Info.Ctx.getTypeSize(SrcType))
+        return false;
 
-    return Success(LV.getLValueOffset(), E);
+      Result = LV;
+      return true;
+    }
+
+    APSInt AsInt = Info.Ctx.MakeIntValue(LV.getLValueOffset(), SrcType);
+    return Success(HandleIntToIntCast(DestType, SrcType, AsInt, Info.Ctx), E);
   }
 
   if (!SrcType->isRealFloatingType())