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))
|
if (!Visit(SubExpr))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
// FIXME: Support cast on LValue results.
|
if (!Result.isInt()) {
|
||||||
if (!Result.isInt())
|
// Only allow casts of lvalues if they are lossless.
|
||||||
return false;
|
return Info.Ctx.getTypeSize(DestType) == Info.Ctx.getTypeSize(SrcType);
|
||||||
|
}
|
||||||
|
|
||||||
return Success(HandleIntToIntCast(DestType, SrcType,
|
return Success(HandleIntToIntCast(DestType, SrcType,
|
||||||
Result.getInt(), Info.Ctx), E);
|
Result.getInt(), Info.Ctx), E);
|
||||||
|
@ -1080,6 +1081,20 @@ bool IntExprEvaluator::VisitCastExpr(CastExpr *E) {
|
||||||
return Success(HandleIntToIntCast(DestType, SrcType, AsInt, Info.Ctx), 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())
|
if (!SrcType->isRealFloatingType())
|
||||||
return Error(E->getExprLoc(), diag::note_invalid_subexpr_in_ice, E);
|
return Error(E->getExprLoc(), diag::note_invalid_subexpr_in_ice, E);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue