[AST/Interp] Fix left shift overflow bug in D64146
authorFangrui Song <i@maskray.me>
Thu, 8 Sep 2022 20:49:07 +0000 (13:49 -0700)
committerFangrui Song <i@maskray.me>
Thu, 8 Sep 2022 20:49:07 +0000 (13:49 -0700)
Noticed by Dmitri Gribenko

clang/lib/AST/Interp/Descriptor.cpp

index 2098ae7..34240ed 100644 (file)
@@ -269,7 +269,7 @@ InitMap::T *InitMap::data() {
 
 bool InitMap::initialize(unsigned I) {
   unsigned Bucket = I / PER_FIELD;
-  unsigned Mask = 1ull << static_cast<uint64_t>(I % PER_FIELD);
+  T Mask = T(1) << (I % PER_FIELD);
   if (!(data()[Bucket] & Mask)) {
     data()[Bucket] |= Mask;
     UninitFields -= 1;
@@ -279,8 +279,7 @@ bool InitMap::initialize(unsigned I) {
 
 bool InitMap::isInitialized(unsigned I) {
   unsigned Bucket = I / PER_FIELD;
-  unsigned Mask = 1ull << static_cast<uint64_t>(I % PER_FIELD);
-  return data()[Bucket] & Mask;
+  return data()[Bucket] & (T(1) << (I % PER_FIELD));
 }
 
 InitMap *InitMap::allocate(unsigned N) {