Author: mitchell
Date: 2026-01-04T00:39:06+08:00
New Revision: e46b4e3e9db5e2b6eda24aeef248bbbc5d90e401

URL: 
https://github.com/llvm/llvm-project/commit/e46b4e3e9db5e2b6eda24aeef248bbbc5d90e401
DIFF: 
https://github.com/llvm/llvm-project/commit/e46b4e3e9db5e2b6eda24aeef248bbbc5d90e401.diff

LOG: [clang-tidy] Fix false positive in bugprone-dynamic-static-initializers 
(#174275)

Closes #145680

Added: 
    

Modified: 
    clang-tools-extra/clang-tidy/bugprone/DynamicStaticInitializersCheck.cpp
    clang-tools-extra/docs/ReleaseNotes.rst
    
clang-tools-extra/test/clang-tidy/checkers/bugprone/dynamic-static-initializers.hpp

Removed: 
    


################################################################################
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 a154b4e08fae8..391c3a6b3db79 100644
--- a/clang-tools-extra/docs/ReleaseNotes.rst
+++ b/clang-tools-extra/docs/ReleaseNotes.rst
@@ -381,6 +381,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


        
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to