[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