[clang-tools-extra] [clang-tidy] Add new check 'misc-static-initialization-cycle' (PR #175342)

via cfe-commits cfe-commits at lists.llvm.org
Sat Jan 10 08:46:02 PST 2026


github-actions[bot] wrote:

<!--LLVM CODE LINT COMMENT: clang-tidy-->


:warning: C/C++ code linter, clang-tidy found issues in your code. :warning:

<details>
<summary>
You can test this locally with the following command:
</summary>

```bash

git diff -U0 origin/main...HEAD -- clang-tools-extra/clang-tidy/misc/StaticInitializationCycleCheck.cpp clang-tools-extra/clang-tidy/misc/StaticInitializationCycleCheck.h clang-tools-extra/clang-tidy/misc/MiscTidyModule.cpp |
python3 clang-tools-extra/clang-tidy/tool/clang-tidy-diff.py   -path build -p1 -quiet
```

</details>

<details>
<summary>
View the output from clang-tidy here.
</summary>

```
clang-tools-extra/clang-tidy/misc/StaticInitializationCycleCheck.h:14:1: warning: nested namespaces can be concatenated [modernize-concat-nested-namespaces]
   14 | namespace clang {
      | ^~~~~~~~~~~~~~~~~
   15 | 
   16 | namespace tidy::misc {
      | ~~~~~~~~~~~~~~~~~~~~
      | namespace clang::tidy::misc


clang-tools-extra/clang-tidy/misc/StaticInitializationCycleCheck.cpp:26:6: warning: function 'isUnusedValue' is declared in an anonymous namespace; prefer using 'static' for restricting visibility [llvm-prefer-static-over-anonymous-namespace]
   26 | bool isUnusedValue(const DeclRefExpr *DRE, ASTContext &ACtx) {
      |      ^
clang-tools-extra/clang-tidy/misc/StaticInitializationCycleCheck.cpp:34:20: warning: using the result of an assignment as a condition without parentheses [clang-diagnostic-parentheses]
   34 |       if (ParentBO = dyn_cast<BinaryOperator>(E))
      |           ~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
clang-tools-extra/clang-tidy/misc/StaticInitializationCycleCheck.cpp:34:20: note: place parentheses around the assignment to silence this warning
   34 |       if (ParentBO = dyn_cast<BinaryOperator>(E))
      |                    ^                            
      |           (                                     )
clang-tools-extra/clang-tidy/misc/StaticInitializationCycleCheck.cpp:34:20: note: use '==' to turn this assignment into an equality comparison
   34 |       if (ParentBO = dyn_cast<BinaryOperator>(E))
      |                    ^
      |                    ==
clang-tools-extra/clang-tidy/misc/StaticInitializationCycleCheck.cpp:59:13: warning: unused function 'operator==' [clang-diagnostic-unused-function]
   59 | inline bool operator==(const VarUseRecord &LHS, const VarUseRecord &RHS) {
      |             ^~~~~~~~
clang-tools-extra/clang-tidy/misc/StaticInitializationCycleCheck.cpp:59:13: warning: function 'operator==' is declared in an anonymous namespace; prefer using 'static' for restricting visibility [llvm-prefer-static-over-anonymous-namespace]
clang-tools-extra/clang-tidy/misc/StaticInitializationCycleCheck.cpp:100:13: warning: function 'operator==' is declared in an anonymous namespace; prefer using 'static' for restricting visibility [llvm-prefer-static-over-anonymous-namespace]
  100 | inline bool operator==(const VarUseRecord &LHS, const VarUseNode *RHS) {
      |             ^
clang-tools-extra/clang-tidy/misc/StaticInitializationCycleCheck.cpp:240:28: warning: invalid case style for function 'child_begin' [readability-identifier-naming]
  240 |   static ChildIteratorType child_begin(NodeType *N) { return N->begin(); }
      |                            ^~~~~~~~~~~
      |                            childBegin
clang-tools-extra/clang-tidy/misc/StaticInitializationCycleCheck.cpp:241:28: warning: invalid case style for function 'child_end' [readability-identifier-naming]
  241 |   static ChildIteratorType child_end(NodeType *N) { return N->end(); }
      |                            ^~~~~~~~~
      |                            childEnd
clang-tools-extra/clang-tidy/misc/StaticInitializationCycleCheck.cpp:249:22: warning: invalid case style for function 'GetValue' [readability-identifier-naming]
  249 |   static VarUseNode *GetValue(VarUseGraph::const_iterator::value_type &P) {
      |                      ^~~~~~~~
      |                      getValue
  250 |     return P.second.get();
  251 |   }
  252 | 
  253 |   using nodes_iterator =
  254 |       mapped_iterator<VarUseGraph::const_iterator, decltype(&GetValue)>;
      |                                                              ~~~~~~~~
      |                                                              getValue
  255 | 
  256 |   static nodes_iterator nodes_begin(const VarUseGraph *G) {
  257 |     return nodes_iterator(G->begin(), &GetValue);
      |                                        ~~~~~~~~
      |                                        getValue
  258 |   }
  259 | 
  260 |   static nodes_iterator nodes_end(const VarUseGraph *G) {
  261 |     return nodes_iterator(G->end(), &GetValue);
      |                                      ~~~~~~~~
      |                                      getValue
clang-tools-extra/clang-tidy/misc/StaticInitializationCycleCheck.cpp:256:25: warning: invalid case style for function 'nodes_begin' [readability-identifier-naming]
  256 |   static nodes_iterator nodes_begin(const VarUseGraph *G) {
      |                         ^~~~~~~~~~~
      |                         nodesBegin
clang-tools-extra/clang-tidy/misc/StaticInitializationCycleCheck.cpp:257:12: warning: avoid repeating the return type from the declaration; use a braced initializer list instead [modernize-return-braced-init-list]
  257 |     return nodes_iterator(G->begin(), &GetValue);
      |            ^~~~~~~~~~~~~~~                     ~
      |            {                                   }
clang-tools-extra/clang-tidy/misc/StaticInitializationCycleCheck.cpp:260:25: warning: invalid case style for function 'nodes_end' [readability-identifier-naming]
  260 |   static nodes_iterator nodes_end(const VarUseGraph *G) {
      |                         ^~~~~~~~~
      |                         nodesEnd
clang-tools-extra/clang-tidy/misc/StaticInitializationCycleCheck.cpp:261:12: warning: avoid repeating the return type from the declaration; use a braced initializer list instead [modernize-return-braced-init-list]
  261 |     return nodes_iterator(G->end(), &GetValue);
      |            ^~~~~~~~~~~~~~~                   ~
      |            {                                 }
clang-tools-extra/clang-tidy/misc/StaticInitializationCycleCheck.cpp:271:6: warning: function 'reportCycles' is declared in an anonymous namespace; prefer using 'static' for restricting visibility [llvm-prefer-static-over-anonymous-namespace]
  271 | void reportCycles(ArrayRef<const VarUseNode *> SCC,
      |      ^
clang-tools-extra/clang-tidy/misc/StaticInitializationCycleCheck.cpp:276:3: warning: 'auto VarNode' can be declared as 'const auto *VarNode' [llvm-qualified-auto]
  276 |   auto VarNode = llvm::find_if(SCC, NodeIsVar);
      |   ^~~~
      |   const auto *
clang-tools-extra/clang-tidy/misc/StaticInitializationCycleCheck.cpp:347:35: warning: C-style casts are discouraged; use static_cast/const_cast/reinterpret_cast [google-readability-casting]
  347 |            SCCI = llvm::scc_begin((const VarUseGraph *)&Uses),
      |                                   ^
clang-tools-extra/clang-tidy/misc/StaticInitializationCycleCheck.cpp:348:33: warning: C-style casts are discouraged; use static_cast/const_cast/reinterpret_cast [google-readability-casting]
  348 |            SCCE = llvm::scc_end((const VarUseGraph *)&Uses);
      |                                 ^
```

</details>


https://github.com/llvm/llvm-project/pull/175342


More information about the cfe-commits mailing list