]> granicus.if.org Git - clang/commitdiff
Handle (int)1.0e40 as an i-c-e.
authorChris Lattner <sabre@nondot.org>
Wed, 26 Sep 2007 00:47:26 +0000 (00:47 +0000)
committerChris Lattner <sabre@nondot.org>
Wed, 26 Sep 2007 00:47:26 +0000 (00:47 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@42334 91177308-0d34-0410-b5e6-96231b3b80d8

AST/Expr.cpp

index ce6636a52a59e5f88a4db83ad953ea61d7194cd6..ffd2d3e8d550f33716d9054930ea4a0a99eeac05 100644 (file)
@@ -483,7 +483,7 @@ bool Expr::isConstantExpr(ASTContext &Ctx, SourceLocation *Loc) const {
 /// comma, etc
 ///
 /// FIXME: This should ext-warn on overflow during evaluation!  ISO C does not
-/// permit this.
+/// permit this.  This includes things like (int)1e1000
 ///
 /// FIXME: Handle offsetof.  Two things to do:  Handle GCC's __builtin_offsetof
 /// to support gcc 4.0+  and handle the idiom GCC recognizes with a null pointer
@@ -557,7 +557,8 @@ bool Expr::isIntegerConstantExpr(llvm::APSInt &Result, ASTContext &Ctx,
       
       // Return the result in the right width.
       Result.zextOrTrunc(
-        static_cast<uint32_t>(Ctx.getTypeSize(getType(), Exp->getOperatorLoc())));
+        static_cast<uint32_t>(Ctx.getTypeSize(getType(),
+                                              Exp->getOperatorLoc())));
 
       // Get information about the size or align.
       if (Exp->getOpcode() == UnaryOperator::SizeOf)
@@ -570,7 +571,8 @@ bool Expr::isIntegerConstantExpr(llvm::APSInt &Result, ASTContext &Ctx,
     case UnaryOperator::LNot: {
       bool Val = Result != 0;
       Result.zextOrTrunc(
-        static_cast<uint32_t>(Ctx.getTypeSize(getType(), Exp->getOperatorLoc())));
+        static_cast<uint32_t>(Ctx.getTypeSize(getType(),
+                                              Exp->getOperatorLoc())));
       Result = Val;
       break;
     }
@@ -748,17 +750,12 @@ bool Expr::isIntegerConstantExpr(llvm::APSInt &Result, ASTContext &Ctx,
     
     // Determine whether we are converting to unsigned or signed.
     bool DestSigned = getType()->isSignedIntegerType();
-    
+
+    // TODO: Warn on overflow, but probably not here: isIntegerConstantExpr can
+    // be called multiple times per AST.
     uint64_t Space[4]; 
-    
-    llvm::APFloat::opStatus Status =
-      FL->getValue().convertToInteger(Space, DestWidth, DestSigned,
-                                      llvm::APFloat::rmTowardZero);
-    if (Status != llvm::APFloat::opOK && Status != llvm::APFloat::opInexact) {
-      if (Loc) *Loc = Operand->getLocStart();
-      return false; // FIXME: need to accept this as an extension.
-    }
-    
+    (void)FL->getValue().convertToInteger(Space, DestWidth, DestSigned,
+                                          llvm::APFloat::rmTowardZero);
     Result = llvm::APInt(DestWidth, 4, Space);
     break;
   }