[APInt] Fixed bug where APInt(UINT32_MAX, 0) would blow up when being constructed.
authorMichael Gottesman <mgottesman@apple.com>
Sun, 19 Jan 2014 20:33:38 +0000 (20:33 +0000)
committerMichael Gottesman <mgottesman@apple.com>
Sun, 19 Jan 2014 20:33:38 +0000 (20:33 +0000)
This was due to arithmetic overflow in the getNumBits() computation. Now we
cast BitWidth to a uint64_t so that does not occur during the computation. After
the computation is complete, the uint64_t is truncated when the function
returns.

I know that this is not something that is likely to happen, but it *IS* a valid
input and we should not blow up.

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

include/llvm/ADT/APInt.h
unittests/ADT/APIntTest.cpp

index 8bfdcbfa364204e230a21c0e5034099a2c807b83..8f5c72d8a2e68b2290187b8a210424159b7c4caf 100644 (file)
@@ -1265,7 +1265,7 @@ public:
   /// \returns the number of words to hold the integer value with a given bit
   /// width.
   static unsigned getNumWords(unsigned BitWidth) {
-    return (BitWidth + APINT_BITS_PER_WORD - 1) / APINT_BITS_PER_WORD;
+    return ((uint64_t)BitWidth + APINT_BITS_PER_WORD - 1) / APINT_BITS_PER_WORD;
   }
 
   /// \brief Compute the number of active bits in the value
index 5043aa0eec2eb9307844dbbeffa5b5a315ba322c..01a30dfd20ff84725cfb5733ad0df3de0da36a48 100644 (file)
@@ -623,6 +623,14 @@ TEST(APIntTest, arrayAccess) {
   }
 }
 
+TEST(APIntTest, LargeAPIntConstruction) {
+  // Check that we can properly construct very large APInt. It is very
+  // unlikely that people will ever do this, but it is a legal input,
+  // so we should not crash on it.
+  APInt A9(UINT32_MAX, 0);
+  EXPECT_FALSE(A9.getBoolValue());
+}
+
 TEST(APIntTest, nearestLogBase2) {
   // Single word check.