[cfe-commits] [PATCH] Use the new APFloat::convertToInt(APSInt) function (issue4728042)

jyasskin at gmail.com jyasskin at gmail.com
Thu Jul 14 17:06:02 PDT 2011


Reviewers: cfe-commits_cs.uiuc.edu,

Message:
Initial diff at
http://codereview.appspot.com/download/issue4728042_1.diff.

Description:
Use the new APFloat::convertToInt(APSInt) function to simplify uses of
convertToInt(integerParts*) and make them more reliable.

Relies on http://codereview.appspot.com/4738043.

Please review this at http://codereview.appspot.com/4728042/

Affected files:
   M lib/AST/ExprConstant.cpp
   M lib/Sema/SemaChecking.cpp


Index: lib/AST/ExprConstant.cpp
diff --git a/lib/AST/ExprConstant.cpp b/lib/AST/ExprConstant.cpp
index  
9943222b1dd30d9761731fca984d20d6b578f788..03c0747efba9e8ed9451607b6a33c8b1c9716196  
100644
--- a/lib/AST/ExprConstant.cpp
+++ b/lib/AST/ExprConstant.cpp
@@ -223,12 +223,10 @@ static APSInt HandleFloatToIntCast(QualType DestType,  
QualType SrcType,
    // Determine whether we are converting to unsigned or signed.
    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,
Index: lib/Sema/SemaChecking.cpp
diff --git a/lib/Sema/SemaChecking.cpp b/lib/Sema/SemaChecking.cpp
index  
267cda8f4016ca935873eac6d22bb82906201051..d1990f3061f353f3152a33d450b971b445d95a10  
100644
--- a/lib/Sema/SemaChecking.cpp
+++ b/lib/Sema/SemaChecking.cpp
@@ -2990,17 +2990,15 @@ 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),
+                            /*isUnsigned=*/false);
+  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);
    S.Diag(FL->getExprLoc(), diag::note_fix_integral_float_as_integer)
      << FixItHint::CreateReplacement(FL->getSourceRange(), LiteralValue);





More information about the cfe-commits mailing list