From: Michael Gottesman Date: Sun, 19 Jan 2014 20:33:38 +0000 (+0000) Subject: [APInt] Fixed bug where APInt(UINT32_MAX, 0) would blow up when being constructed. X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=e7413972a42ebb9ff63df448cc1ed40ff7a6d20d;p=oota-llvm.git [APInt] Fixed bug where APInt(UINT32_MAX, 0) would blow up when being constructed. 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 --- diff --git a/include/llvm/ADT/APInt.h b/include/llvm/ADT/APInt.h index 8bfdcbfa364..8f5c72d8a2e 100644 --- a/include/llvm/ADT/APInt.h +++ b/include/llvm/ADT/APInt.h @@ -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 diff --git a/unittests/ADT/APIntTest.cpp b/unittests/ADT/APIntTest.cpp index 5043aa0eec2..01a30dfd20f 100644 --- a/unittests/ADT/APIntTest.cpp +++ b/unittests/ADT/APIntTest.cpp @@ -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.