https://github.com/maramatias updated 
https://github.com/llvm/llvm-project/pull/145053

>From 119a156c668c03f048399ec20f3bcf8fc0d2fdc5 Mon Sep 17 00:00:00 2001
From: Mara Matias <mara.mati...@gmail.com>
Date: Wed, 18 Jun 2025 09:06:10 -0700
Subject: [PATCH 1/2] draft unittest not ready

---
 clang/docs/ReleaseNotes.rst                        |  4 ++++
 clang/lib/Sema/SemaDeclCXX.cpp                     | 10 +++++++++-
 clang/test/CXX/dcl.decl/dcl.decl.general/p4-20.cpp |  5 +++++
 3 files changed, 18 insertions(+), 1 deletion(-)

diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 96477ef6ddc9af..5a3e234ea1bcd6 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -642,6 +642,10 @@ Improvements to Clang's diagnostics
   #GH69470, #GH59391, #GH58172, #GH46215, #GH45915, #GH45891, #GH44490,
   #GH36703, #GH32903, #GH23312, #GH69874.
 
+- Improved the performance of static assertions envolving large integers by
+  using hex format instead of string.
+
+  Fixes #GH71675
 
 Improvements to Clang's time-trace
 ----------------------------------
diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp
index 16645ecf411e56..0e053671836c89 100644
--- a/clang/lib/Sema/SemaDeclCXX.cpp
+++ b/clang/lib/Sema/SemaDeclCXX.cpp
@@ -47,6 +47,7 @@
 #include "clang/Sema/SemaOpenMP.h"
 #include "clang/Sema/Template.h"
 #include "clang/Sema/TemplateDeduction.h"
+#include "llvm/ADT/APSInt.h"
 #include "llvm/ADT/ArrayRef.h"
 #include "llvm/ADT/STLExtras.h"
 #include "llvm/ADT/StringExtras.h"
@@ -17575,7 +17576,14 @@ static bool ConvertAPValueToString(const APValue &V, 
QualType T,
           break;
         }
       }
-      V.getInt().toString(Str);
+
+      llvm::APSInt vInt = V.getInt();
+      if (vInt > std::numeric_limits<uint64_t>::max() ||
+          vInt < std::numeric_limits<int64_t>::min()) {
+            vInt.toString(Str,16);
+      } else {
+        vInt.toString(Str);
+      }
     }
 
     break;
diff --git a/clang/test/CXX/dcl.decl/dcl.decl.general/p4-20.cpp 
b/clang/test/CXX/dcl.decl/dcl.decl.general/p4-20.cpp
index c7596218db5379..14a4d024b8aa80 100644
--- a/clang/test/CXX/dcl.decl/dcl.decl.general/p4-20.cpp
+++ b/clang/test/CXX/dcl.decl/dcl.decl.general/p4-20.cpp
@@ -35,6 +35,11 @@ struct S {
   void member() requires(sizeof(T) > 1);
 };
 
+namespace GH71675 {
+  constexpr unsigned _BitInt(__BITINT_MAXWIDTH__ >> 6) F = ~0;
+  static_assert(F == 1); // no-error
+}
+
 template<typename T>
 void ContainingFunction() {
   // expected-error@+1 {{non-templated function cannot have a requires clause}}

>From db0a3bdea16e2dee834bd4715aa8a36b1e1d53ae Mon Sep 17 00:00:00 2001
From: Mara Matias <mara.mati...@gmail.com>
Date: Fri, 20 Jun 2025 13:13:28 -0700
Subject: [PATCH 2/2] fixup! draft unittest not ready

---
 clang/lib/Sema/SemaDeclCXX.cpp                     | 2 +-
 clang/test/CXX/dcl.decl/dcl.decl.general/p4-20.cpp | 5 -----
 clang/test/SemaCXX/static-assert.cpp               | 6 ++++++
 3 files changed, 7 insertions(+), 6 deletions(-)

diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp
index 0e053671836c89..cd12b0702135b5 100644
--- a/clang/lib/Sema/SemaDeclCXX.cpp
+++ b/clang/lib/Sema/SemaDeclCXX.cpp
@@ -17578,7 +17578,7 @@ static bool ConvertAPValueToString(const APValue &V, 
QualType T,
       }
 
       llvm::APSInt vInt = V.getInt();
-      if (vInt > std::numeric_limits<uint64_t>::max() ||
+      if (vInt > std::numeric_limits<int64_t>::max() || 
           vInt < std::numeric_limits<int64_t>::min()) {
             vInt.toString(Str,16);
       } else {
diff --git a/clang/test/CXX/dcl.decl/dcl.decl.general/p4-20.cpp 
b/clang/test/CXX/dcl.decl/dcl.decl.general/p4-20.cpp
index 14a4d024b8aa80..c7596218db5379 100644
--- a/clang/test/CXX/dcl.decl/dcl.decl.general/p4-20.cpp
+++ b/clang/test/CXX/dcl.decl/dcl.decl.general/p4-20.cpp
@@ -35,11 +35,6 @@ struct S {
   void member() requires(sizeof(T) > 1);
 };
 
-namespace GH71675 {
-  constexpr unsigned _BitInt(__BITINT_MAXWIDTH__ >> 6) F = ~0;
-  static_assert(F == 1); // no-error
-}
-
 template<typename T>
 void ContainingFunction() {
   // expected-error@+1 {{non-templated function cannot have a requires clause}}
diff --git a/clang/test/SemaCXX/static-assert.cpp 
b/clang/test/SemaCXX/static-assert.cpp
index bf6a2eeb432a3d..762cf3e6ccb516 100644
--- a/clang/test/SemaCXX/static-assert.cpp
+++ b/clang/test/SemaCXX/static-assert.cpp
@@ -255,6 +255,12 @@ int f() {
 }
 }
 
+namespace GH71675 {
+  constexpr unsigned _BitInt(__BITINT_MAXWIDTH__ >> 6) F = ~0;
+  static_assert(F == 1); // expected-error {{static assertion failed due to 
requirement 'F == 1'}}
+                         // expected-note {{expression evaluates to 'F'}}
+}
+
 namespace Diagnostics {
   /// No notes for literals.
   static_assert(false, ""); // expected-error {{failed}}

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to