Use the new APFloat::convertToInt(APSInt) function to simplify uses of

convertToInt(integerParts*) and make them more reliable.

llvm-svn: 135279
This commit is contained in:
Jeffrey Yasskin 2011-07-15 17:03:07 +00:00
parent f5f352dda5
commit d0f079dad4
2 changed files with 8 additions and 11 deletions

View File

@ -224,11 +224,10 @@ static APSInt HandleFloatToIntCast(QualType DestType, QualType SrcType,
bool DestSigned = DestType->isSignedIntegerOrEnumerationType();
// FIXME: Warning for overflow.
uint64_t Space[4];
APSInt Result(DestWidth, !DestSigned);
bool ignored;
(void)Value.convertToInteger(Space, DestWidth, DestSigned,
llvm::APFloat::rmTowardZero, &ignored);
return APSInt(llvm::APInt(DestWidth, 4, Space), !DestSigned);
(void)Value.convertToInteger(Result, llvm::APFloat::rmTowardZero, &ignored);
return Result;
}
static APFloat HandleFloatToFloatCast(QualType DestType, QualType SrcType,

View File

@ -3030,18 +3030,16 @@ void DiagnoseFloatingLiteralImpCast(Sema &S, FloatingLiteral *FL, QualType T,
if (&Value.getSemantics() == &llvm::APFloat::PPCDoubleDouble)
return;
// Try to convert this exactly to an 64-bit integer. FIXME: It would be
// nice to support arbitrarily large integers here.
// Try to convert this exactly to an integer.
bool isExact = false;
uint64_t IntegerPart;
if (Value.convertToInteger(&IntegerPart, 64, /*isSigned=*/true,
llvm::APSInt IntegerValue(S.Context.getIntWidth(T),
T->hasUnsignedIntegerRepresentation());
if (Value.convertToInteger(IntegerValue,
llvm::APFloat::rmTowardZero, &isExact)
!= llvm::APFloat::opOK || !isExact)
return;
llvm::APInt IntegerValue(64, IntegerPart, /*isSigned=*/true);
std::string LiteralValue = IntegerValue.toString(10, /*isSigned=*/true);
std::string LiteralValue = IntegerValue.toString(10);
S.Diag(FL->getExprLoc(), diag::note_fix_integral_float_as_integer)
<< FixItHint::CreateReplacement(FL->getSourceRange(), LiteralValue);
}