forked from OSchip/llvm-project
ExprConstant handling for a couple more cases of pointer-to-int casts
from the testsuite. llvm-svn: 65098
This commit is contained in:
parent
c86fb5ecb4
commit
742421e2e7
|
@ -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);
|
||||
|
||||
|
|
Loading…
Reference in New Issue