[clang-tools-extra] [clang-tidy] Fix false positive in bugprone-dynamic-static-initializers (PR #174275)
via cfe-commits
cfe-commits at lists.llvm.org
Sat Jan 3 06:50:18 PST 2026
https://github.com/zeyi2 created https://github.com/llvm/llvm-project/pull/174275
Closes #145680
>From 163994c73dbb8b72f3a44c6af88ef2765d531dcc Mon Sep 17 00:00:00 2001
From: mtx <mitchell.xu2 at gmail.com>
Date: Sat, 3 Jan 2026 22:15:34 +0800
Subject: [PATCH] [clang-tidy] Fix false positive in
bugprone-dynamic-static-initializers
---
.../DynamicStaticInitializersCheck.cpp | 7 +++----
clang-tools-extra/docs/ReleaseNotes.rst | 5 +++++
.../bugprone/dynamic-static-initializers.hpp | 21 +++++++++++++++++++
3 files changed, 29 insertions(+), 4 deletions(-)
diff --git a/clang-tools-extra/clang-tidy/bugprone/DynamicStaticInitializersCheck.cpp b/clang-tools-extra/clang-tidy/bugprone/DynamicStaticInitializersCheck.cpp
index 48de7fbe7fad6..d00c8d0ffb925 100644
--- a/clang-tools-extra/clang-tidy/bugprone/DynamicStaticInitializersCheck.cpp
+++ b/clang-tools-extra/clang-tidy/bugprone/DynamicStaticInitializersCheck.cpp
@@ -18,12 +18,11 @@ namespace clang::tidy::bugprone {
namespace {
AST_MATCHER(clang::VarDecl, hasConstantDeclaration) {
+ if (Node.isConstexpr())
+ return true;
const Expr *Init = Node.getInit();
- if (Init && !Init->isValueDependent()) {
- if (Node.isConstexpr())
- return true;
+ if (Init && !Init->isValueDependent())
return Node.evaluateValue();
- }
return false;
}
diff --git a/clang-tools-extra/docs/ReleaseNotes.rst b/clang-tools-extra/docs/ReleaseNotes.rst
index 7d878f7d28386..402ef0e0a9a31 100644
--- a/clang-tools-extra/docs/ReleaseNotes.rst
+++ b/clang-tools-extra/docs/ReleaseNotes.rst
@@ -370,6 +370,11 @@ Changes in existing checks
new option `IgnoreMacros` to suppress warnings within macro
expansions.
+- Improved :doc:`bugprone-dynamic-static-initializers
+ <clang-tidy/checks/bugprone/dynamic-static-initializers>` check by
+ avoiding false positives for ``constexpr`` variables whose
+ initializers are value-dependent.
+
- Improved :doc:`bugprone-easily-swappable-parameters
<clang-tidy/checks/bugprone/easily-swappable-parameters>` check by
correcting a spelling mistake on its option
diff --git a/clang-tools-extra/test/clang-tidy/checkers/bugprone/dynamic-static-initializers.hpp b/clang-tools-extra/test/clang-tidy/checkers/bugprone/dynamic-static-initializers.hpp
index 647b2e571655e..7a3211512fd84 100644
--- a/clang-tools-extra/test/clang-tidy/checkers/bugprone/dynamic-static-initializers.hpp
+++ b/clang-tools-extra/test/clang-tidy/checkers/bugprone/dynamic-static-initializers.hpp
@@ -42,3 +42,24 @@ int foo3() {
static int p = 7 + 83; // no warning
return p;
}
+
+namespace std {
+ template <typename T>
+ struct numeric_limits {
+ static constexpr T min() { return 0; }
+ static constexpr T max() { return 1000; }
+ };
+}
+
+template <typename T>
+void template_func() {
+ static constexpr T local_kMin{std::numeric_limits<T>::min()}; // no warning
+}
+
+template <int n>
+struct TemplateStruct {
+ static constexpr int xn{n}; // no warning
+};
+
+template <typename T>
+constexpr T kGlobalMin{std::numeric_limits<T>::min()}; // no warning
More information about the cfe-commits
mailing list