[clang] [clang] Avoid printing overly large integer/_BitInt numbers in static assertion failure diagnostics #71675 (PR #145053)
via cfe-commits
cfe-commits at lists.llvm.org
Fri Jun 20 13:14:38 PDT 2025
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.matias1 at 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 at +1 {{non-templated function cannot have a requires clause}}
>From db0a3bdea16e2dee834bd4715aa8a36b1e1d53ae Mon Sep 17 00:00:00 2001
From: Mara Matias <mara.matias1 at 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 at +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}}
More information about the cfe-commits
mailing list