aboutsummaryrefslogtreecommitdiff
path: root/llvm/unittests/ADT/APIntTest.cpp
diff options
context:
space:
mode:
authorPeter Rong <PeterRong96@gmail.com>2022-12-08 16:59:22 -0800
committerPeter Rong <PeterRong96@gmail.com>2022-12-15 10:06:26 -0800
commit55968109d1f9c8655d30928b9fde9993e341c97f (patch)
tree3aa06cbc7a948176b4c935edfc3c6297355acae1 /llvm/unittests/ADT/APIntTest.cpp
parent80f2f1eabc491cde39d543e4ebda93e2d2974d1f (diff)
downloadllvm-55968109d1f9c8655d30928b9fde9993e341c97f.zip
llvm-55968109d1f9c8655d30928b9fde9993e341c97f.tar.gz
llvm-55968109d1f9c8655d30928b9fde9993e341c97f.tar.bz2
[APInt] provide a safe API for zext value and sext value.
Currently, APInt::getSExtValue and getZExtValue crashes on values with more than 64 bits. Users may accidently crash the compiler with this setting when the integer may be i128. As shown in https://github.com/llvm/llvm-project/issues/59316 In this patch we provide a trySExtValue and tryZExtValue to return an Optional, the user needs to explictly unwrap it and condsier the possibility where there my no value in it. Reviewed By: RKSimon Differential Revision: https://reviews.llvm.org/D139683
Diffstat (limited to 'llvm/unittests/ADT/APIntTest.cpp')
-rw-r--r--llvm/unittests/ADT/APIntTest.cpp21
1 files changed, 21 insertions, 0 deletions
diff --git a/llvm/unittests/ADT/APIntTest.cpp b/llvm/unittests/ADT/APIntTest.cpp
index 3055581..09c9c8d 100644
--- a/llvm/unittests/ADT/APIntTest.cpp
+++ b/llvm/unittests/ADT/APIntTest.cpp
@@ -3134,4 +3134,25 @@ TEST(APIntTest, DenseMap) {
Map.find(ZeroWidthInt);
}
+TEST(APIntTest, TryExt) {
+ APInt small(32, 42);
+ APInt large(128, {0xffff, 0xffff});
+ ASSERT_TRUE(small.tryZExtValue().has_value());
+ ASSERT_TRUE(small.trySExtValue().has_value());
+ ASSERT_FALSE(large.tryZExtValue().has_value());
+ ASSERT_FALSE(large.trySExtValue().has_value());
+ ASSERT_EQ(small.trySExtValue().value_or(41), 42);
+ ASSERT_EQ(large.trySExtValue().value_or(41), 41);
+
+ APInt negOne32(32, 0);
+ negOne32.setAllBits();
+ ASSERT_EQ(negOne32.trySExtValue().value_or(42), -1);
+ APInt negOne64(64, 0);
+ negOne64.setAllBits();
+ ASSERT_EQ(negOne64.trySExtValue().value_or(42), -1);
+ APInt negOne128(128, 0);
+ negOne128.setAllBits();
+ ASSERT_EQ(negOne128.trySExtValue().value_or(42), 42);
+}
+
} // end anonymous namespace