For PR409: \
authorReid Spencer <rspencer@reidspencer.com>
Mon, 6 Dec 2004 22:18:37 +0000 (22:18 +0000)
committerReid Spencer <rspencer@reidspencer.com>
Mon, 6 Dec 2004 22:18:37 +0000 (22:18 +0000)
Test the range of float constants to ensure we are not attempting to create a \
float constant using a double value that is out of range for a float

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@18585 91177308-0d34-0410-b5e6-96231b3b80d8

lib/VMCore/Constants.cpp

index 97e4fa565c7e06982bca4b299968e81c01bbe9d0..c97d9fc8d39b7a19a39728640b25b5757e10f27c 100644 (file)
@@ -21,6 +21,7 @@
 #include "llvm/ADT/StringExtras.h"
 #include <algorithm>
 #include <iostream>
+#include <limits>
 using namespace llvm;
 
 ConstantBool *ConstantBool::True  = new ConstantBool(true);
@@ -442,6 +443,16 @@ bool ConstantFP::isValueValidForType(const Type *Ty, double Val) {
 
     // TODO: Figure out how to test if a double can be cast to a float!
   case Type::FloatTyID:
+    return 
+      (std::numeric_limits<double>::has_infinity && 
+       std::numeric_limits<float>::has_infinity &&
+       Val == std::numeric_limits<double>::infinity()) ||
+      (std::numeric_limits<double>::has_quiet_NaN &&
+       std::numeric_limits<float>::has_quiet_NaN &&
+       Val == std::numeric_limits<double>::quiet_NaN()) ||
+      (Val >= -std::numeric_limits<float>::max() && 
+       Val <= std::numeric_limits<float>::max());
+    
   case Type::DoubleTyID:
     return true;          // This is the largest type...
   }