https://github.com/srimanreddy4 updated https://github.com/llvm/llvm-project/pull/173213
>From 99657df10ef9cd4f5ec8f9e95706661b6e750d1e Mon Sep 17 00:00:00 2001 From: srimanreddy4 <[email protected]> Date: Mon, 22 Dec 2025 10:14:48 +0530 Subject: [PATCH] [Clang] Fix crash in EnumDecl::getValueRange with large __int128 constants Fixes #173182. Prevents an assertion failure in APInt when shifting by the full bit width during enum range calculation. --- clang/lib/AST/Decl.cpp | 7 +++++-- clang/test/SemaCXX/pr173182.cpp | 13 +++++++++++++ 2 files changed, 18 insertions(+), 2 deletions(-) create mode 100644 clang/test/SemaCXX/pr173182.cpp diff --git a/clang/lib/AST/Decl.cpp b/clang/lib/AST/Decl.cpp index b12f042646bbb..82cec455895a3 100644 --- a/clang/lib/AST/Decl.cpp +++ b/clang/lib/AST/Decl.cpp @@ -5129,8 +5129,11 @@ void EnumDecl::getValueRange(llvm::APInt &Max, llvm::APInt &Min) const { unsigned NumBits = std::max(NumNegativeBits, NumPositiveBits + 1); Max = llvm::APInt(Bitwidth, 1) << (NumBits - 1); Min = -Max; - } else { - Max = llvm::APInt(Bitwidth, 1) << NumPositiveBits; + } else { + if (NumPositiveBits >= Bitwidth) + Max = llvm::APInt::getZero(Bitwidth); + else + Max = llvm::APInt(Bitwidth, 1) << NumPositiveBits; Min = llvm::APInt::getZero(Bitwidth); } } diff --git a/clang/test/SemaCXX/pr173182.cpp b/clang/test/SemaCXX/pr173182.cpp new file mode 100644 index 0000000000000..0c668e1b4d57a --- /dev/null +++ b/clang/test/SemaCXX/pr173182.cpp @@ -0,0 +1,13 @@ +// RUN: %clang_cc1 -fsyntax-only -verify -triple x86_64-unknown-linux-gnu %s + +enum E1 { + V1 = (__int128)0x1000000000000000 +}; + +enum E2 { // expected-warning {{enumeration values exceed range of largest integer}} + V2 = ((__int128)0x1000000000000000 << 64) + 1 +}; + +__int128 get_val() { + return (enum E2)__int128(V2 >> 4); +} \ No newline at end of file _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
