[clang] [clang][analyzer] Correct SMT Layer for _BitInt cases refutations (PR #143310)

DonĂ¡t Nagy via cfe-commits cfe-commits at lists.llvm.org
Tue Jun 10 07:50:44 PDT 2025


================
@@ -570,23 +572,42 @@ class SMTConv {
   // TODO: Refactor to put elsewhere
   static inline QualType getAPSIntType(ASTContext &Ctx,
                                        const llvm::APSInt &Int) {
-    return Ctx.getIntTypeForBitwidth(Int.getBitWidth(), Int.isSigned());
+    QualType Ty = Ctx.getIntTypeForBitwidth(Int.getBitWidth(), Int.isSigned());
+    // If Ty is Null, could be because the original type was a _BitInt.
+    // Get the bit size and round up to next power of 2, max char size
+    if (Ty.isNull()) {
+      unsigned CharTypeSize = Ctx.getTypeSize(Ctx.CharTy);
+      unsigned pow2DestWidth =
+          std::max(llvm::bit_ceil(Int.getBitWidth()), CharTypeSize);
+      Ty = Ctx.getIntTypeForBitwidth(pow2DestWidth, Int.isSigned());
+    }
+    return Ty;
+  }
+
+  static inline bool IsPower2(unsigned bits) {
----------------
NagyDonat wrote:

You don't need to implement this helper function because it already exists in the support headers, see e.g. `llvm::isPowerOf2_32` defined in `llvm/include/llvm/Support/MathExtras.h` or `llvm::has_single_bit` from `llvm/include/llvm/ADT/bit.h`.

https://github.com/llvm/llvm-project/pull/143310


More information about the cfe-commits mailing list