[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:51:16 PST 2026


github-actions[bot] wrote:

<!--PREMERGE ADVISOR COMMENT: Windows-->
# :window: Windows x64 Test Results

* 3016 tests passed
* 29 tests skipped
* 1 test failed

## Failed Tests
(click on a test name to see its output)

### Clang Tools
<details>
<summary>Clang Tools.clang-tidy/checkers/misc/static-initialization-cycle.cpp</summary>

```
Exit Code: 1

Command Output (stdout):
--
# RUN: at line 1
C:/Python312/python.exe C:/_work/llvm-project/llvm-project/clang-tools-extra/test/../test\clang-tidy\check_clang_tidy.py C:\_work\llvm-project\llvm-project\clang-tools-extra\test\clang-tidy\checkers\misc\static-initialization-cycle.cpp misc-static-initialization-cycle C:\_work\llvm-project\llvm-project\build\tools\clang\tools\extra\test\clang-tidy\checkers\misc\Output\static-initialization-cycle.cpp.tmp
# executed command: C:/Python312/python.exe 'C:/_work/llvm-project/llvm-project/clang-tools-extra/test/../test\clang-tidy\check_clang_tidy.py' 'C:\_work\llvm-project\llvm-project\clang-tools-extra\test\clang-tidy\checkers\misc\static-initialization-cycle.cpp' misc-static-initialization-cycle 'C:\_work\llvm-project\llvm-project\build\tools\clang\tools\extra\test\clang-tidy\checkers\misc\Output\static-initialization-cycle.cpp.tmp'
# .---command stdout------------
# | Running ['clang-tidy', '--experimental-custom-checks', 'C:\\_work\\llvm-project\\llvm-project\\build\\tools\\clang\\tools\\extra\\test\\clang-tidy\\checkers\\misc\\Output\\static-initialization-cycle.cpp.tmp.cpp', '-fix', '--checks=-*,misc-static-initialization-cycle', '--config={}', '--', '-std=c++11', '-nostdinc++']...
# | ------------------------ clang-tidy output -----------------------
# | 10 warnings generated.
# | 
# | C:\_work\llvm-project\llvm-project\build\tools\clang\tools\extra\test\clang-tidy\checkers\misc\Output\static-initialization-cycle.cpp.tmp.cpp:6:5: warning: Static variable initialization cycle detected involving 'B' [misc-static-initialization-cycle]
# |     6 | int B = S::A;
# |       |     ^
# | C:\_work\llvm-project\llvm-project\build\tools\clang\tools\extra\test\clang-tidy\checkers\misc\Output\static-initialization-cycle.cpp.tmp.cpp:6:9: note: Value of 'A' may be used to initialize variable 'B' here
# |     6 | int B = S::A;
# |       |         ^
# | C:\_work\llvm-project\llvm-project\build\tools\clang\tools\extra\test\clang-tidy\checkers\misc\Output\static-initialization-cycle.cpp.tmp.cpp:7:12: note: Value of 'B' may be used to initialize variable 'A' here
# |     7 | int S::A = B;
# |       |            ^
# | C:\_work\llvm-project\llvm-project\build\tools\clang\tools\extra\test\clang-tidy\checkers\misc\Output\static-initialization-cycle.cpp.tmp.cpp:14:23: warning: Static variable initialization cycle detected involving 'A' [misc-static-initialization-cycle]
# |    14 | struct S { static int A; };
# |       |                       ^
# | C:\_work\llvm-project\llvm-project\build\tools\clang\tools\extra\test\clang-tidy\checkers\misc\Output\static-initialization-cycle.cpp.tmp.cpp:15:12: note: Value of 'A' may be used to initialize variable 'A' here
# |    15 | int S::A = S::A;
# |       |            ^
# | C:\_work\llvm-project\llvm-project\build\tools\clang\tools\extra\test\clang-tidy\checkers\misc\Output\static-initialization-cycle.cpp.tmp.cpp:24:5: warning: Static variable initialization cycle detected involving 'C' [misc-static-initialization-cycle]
# |    24 | int C = B + S::A;
# |       |     ^
# | C:\_work\llvm-project\llvm-project\build\tools\clang\tools\extra\test\clang-tidy\checkers\misc\Output\static-initialization-cycle.cpp.tmp.cpp:24:13: note: Value of 'A' may be used to initialize variable 'C' here
# |    24 | int C = B + S::A;
# |       |             ^
# | C:\_work\llvm-project\llvm-project\build\tools\clang\tools\extra\test\clang-tidy\checkers\misc\Output\static-initialization-cycle.cpp.tmp.cpp:25:12: note: Value of 'C' may be used to initialize variable 'A' here
# |    25 | int S::A = C;
# |       |            ^
# | C:\_work\llvm-project\llvm-project\build\tools\clang\tools\extra\test\clang-tidy\checkers\misc\Output\static-initialization-cycle.cpp.tmp.cpp:34:5: warning: Static variable initialization cycle detected involving 'B' [misc-static-initialization-cycle]
# |    34 | int B = S::A;
# |       |     ^
# | C:\_work\llvm-project\llvm-project\build\tools\clang\tools\extra\test\clang-tidy\checkers\misc\Output\static-initialization-cycle.cpp.tmp.cpp:34:9: note: Value of 'A' may be used to initialize variable 'B' here
# |    34 | int B = S::A;
# |       |         ^
# | C:\_work\llvm-project\llvm-project\build\tools\clang\tools\extra\test\clang-tidy\checkers\misc\Output\static-initialization-cycle.cpp.tmp.cpp:35:12: note: Value of 'B' may be used to initialize variable 'A' here
# |    35 | int S::A = B;
# |       |            ^
# | C:\_work\llvm-project\llvm-project\build\tools\clang\tools\extra\test\clang-tidy\checkers\misc\Output\static-initialization-cycle.cpp.tmp.cpp:46:5: warning: Static variable initialization cycle detected involving 'C' [misc-static-initialization-cycle]
# |    46 | int C = S::A;
# |       |     ^
# | C:\_work\llvm-project\llvm-project\build\tools\clang\tools\extra\test\clang-tidy\checkers\misc\Output\static-initialization-cycle.cpp.tmp.cpp:46:9: note: Value of 'A' may be used to initialize variable 'C' here
# |    46 | int C = S::A;
# |       |         ^
# | C:\_work\llvm-project\llvm-project\build\tools\clang\tools\extra\test\clang-tidy\checkers\misc\Output\static-initialization-cycle.cpp.tmp.cpp:47:16: note: Value of 'C' may be used to initialize variable 'A' here
# |    47 | int S::A = B + C;
# |       |                ^
# | C:\_work\llvm-project\llvm-project\build\tools\clang\tools\extra\test\clang-tidy\checkers\misc\Output\static-initialization-cycle.cpp.tmp.cpp:56:5: warning: Static variable initialization cycle detected involving 'B' [misc-static-initialization-cycle]
# |    56 | int B = S::A;
# |       |     ^
# | C:\_work\llvm-project\llvm-project\build\tools\clang\tools\extra\test\clang-tidy\checkers\misc\Output\static-initialization-cycle.cpp.tmp.cpp:56:9: note: Value of 'A' may be used to initialize variable 'B' here
# |    56 | int B = S::A;
# |       |         ^
# | C:\_work\llvm-project\llvm-project\build\tools\clang\tools\extra\test\clang-tidy\checkers\misc\Output\static-initialization-cycle.cpp.tmp.cpp:58:12: note: Value of 'C' may be used to initialize variable 'A' here
# |    58 | int S::A = C;
# |       |            ^
# | C:\_work\llvm-project\llvm-project\build\tools\clang\tools\extra\test\clang-tidy\checkers\misc\Output\static-initialization-cycle.cpp.tmp.cpp:57:9: note: Value of 'B' may be used to initialize variable 'C' here
# |    57 | int C = B + 1;
# |       |         ^
# | C:\_work\llvm-project\llvm-project\build\tools\clang\tools\extra\test\clang-tidy\checkers\misc\Output\static-initialization-cycle.cpp.tmp.cpp:75:5: warning: Static variable initialization cycle detected involving 'B' [misc-static-initialization-cycle]
# |    75 | int B = S::A + 1;
# |       |     ^
# | C:\_work\llvm-project\llvm-project\build\tools\clang\tools\extra\test\clang-tidy\checkers\misc\Output\static-initialization-cycle.cpp.tmp.cpp:75:9: note: Value of 'A' may be used to initialize variable 'B' here
# |    75 | int B = S::A + 1;
# |       |         ^
# | C:\_work\llvm-project\llvm-project\build\tools\clang\tools\extra\test\clang-tidy\checkers\misc\Output\static-initialization-cycle.cpp.tmp.cpp:76:15: note: Value of 'B' may be used to initialize variable 'A' here
# |    76 | int S::A = f1(B, 2);
# |       |               ^
# | C:\_work\llvm-project\llvm-project\build\tools\clang\tools\extra\test\clang-tidy\checkers\misc\Output\static-initialization-cycle.cpp.tmp.cpp:83:23: warning: Static variable initialization cycle detected involving 'A' [misc-static-initialization-cycle]
# |    83 | struct S { static int A; };
# |       |                       ^
# | C:\_work\llvm-project\llvm-project\build\tools\clang\tools\extra\test\clang-tidy\checkers\misc\Output\static-initialization-cycle.cpp.tmp.cpp:85:10: note: Value of 'A' may be used to compute result of 'f1'
# |    85 |   return S::A;
# |       |          ^
# | C:\_work\llvm-project\llvm-project\build\tools\clang\tools\extra\test\clang-tidy\checkers\misc\Output\static-initialization-cycle.cpp.tmp.cpp:87:12: note: Result of 'f1' may be used to initialize variable 'A' here
# |    87 | int S::A = f1();
# |       |            ^
# | C:\_work\llvm-project\llvm-project\build\tools\clang\tools\extra\test\clang-tidy\checkers\misc\Output\static-initialization-cycle.cpp.tmp.cpp:94:23: warning: Static variable initialization cycle detected involving 'A' [misc-static-initialization-cycle]
# |    94 | struct S { static int A; };
# |       |                       ^
# | C:\_work\llvm-project\llvm-project\build\tools\clang\tools\extra\test\clang-tidy\checkers\misc\Output\static-initialization-cycle.cpp.tmp.cpp:96:18: note: Value of 'A' may be used to compute result of 'f1'
# |    96 |   static int X = S::A;
# |       |                  ^
# | C:\_work\llvm-project\llvm-project\build\tools\clang\tools\extra\test\clang-tidy\checkers\misc\Output\static-initialization-cycle.cpp.tmp.cpp:99:12: note: Result of 'f1' may be used to initialize variable 'A' here
# |    99 | int S::A = f1();
# |       |            ^
# | C:\_work\llvm-project\llvm-project\build\tools\clang\tools\extra\test\clang-tidy\checkers\misc\Output\static-initialization-cycle.cpp.tmp.cpp:134:14: warning: Static variable initialization cycle detected involving 'A' [misc-static-initialization-cycle]
# |   134 |   static int A = f(1);
# |       |              ^
# | C:\_work\llvm-project\llvm-project\build\tools\clang\tools\extra\test\clang-tidy\checkers\misc\Output\static-initialization-cycle.cpp.tmp.cpp:134:18: note: Result of 'f' may be used to initialize variable 'A' here
# |   134 |   static int A = f(1);
# |       |                  ^
# | C:\_work\llvm-project\llvm-project\build\tools\clang\tools\extra\test\clang-tidy\checkers\misc\Output\static-initialization-cycle.cpp.tmp.cpp:137:10: note: Value of 'A' may be used to compute result of 'f'
# |   137 |   return A + i;
# |       |          ^
# | 
# | ------------------------------------------------------------------
# | ------------------------------ Fixes -----------------------------
# | 
# | ------------------------------------------------------------------
# | FileCheck -input-file=C:\_work\llvm-project\llvm-project\build\tools\clang\tools\extra\test\clang-tidy\checkers\misc\Output\static-initialization-cycle.cpp.tmp.cpp.notes C:\_work\llvm-project\llvm-project\clang-tools-extra\test\clang-tidy\checkers\misc\static-initialization-cycle.cpp -check-prefixes=CHECK-NOTES -implicit-check-not={{note|warning|error}}: failed:
# | C:\_work\llvm-project\llvm-project\clang-tools-extra\test\clang-tidy\checkers\misc\static-initialization-cycle.cpp:167:17: error: CHECK-NOTES: expected string not found in input
# | 
# | // CHECK-NOTES: :[[@LINE-7]]:12: warning: Static variable initialization cycle detected involving 'A'
# | 
# |                 ^
# | 
# | C:\_work\llvm-project\llvm-project\build\tools\clang\tools\extra\test\clang-tidy\checkers\misc\Output\static-initialization-cycle.cpp.tmp.cpp.notes:89:206: note: scanning from here
# | 
# | C:\_work\llvm-project\llvm-project\build\tools\clang\tools\extra\test\clang-tidy\checkers\misc\Output\static-initialization-cycle.cpp.tmp.cpp:137:10: note: Value of 'A' may be used to compute result of 'f'
# | 
# |                                                                                                                                                                                                              ^
# | 
# | C:\_work\llvm-project\llvm-project\build\tools\clang\tools\extra\test\clang-tidy\checkers\misc\Output\static-initialization-cycle.cpp.tmp.cpp.notes:89:206: note: with "@LINE-7" equal to "160"
# | 
# | C:\_work\llvm-project\llvm-project\build\tools\clang\tools\extra\test\clang-tidy\checkers\misc\Output\static-initialization-cycle.cpp.tmp.cpp:137:10: note: Value of 'A' may be used to compute result of 'f'
# | 
# |                                                                                                                                                                                                              ^
# | 
# | 
# | 
# | Input file: C:\_work\llvm-project\llvm-project\build\tools\clang\tools\extra\test\clang-tidy\checkers\misc\Output\static-initialization-cycle.cpp.tmp.cpp.notes
# | 
# | Check file: C:\_work\llvm-project\llvm-project\clang-tools-extra\test\clang-tidy\checkers\misc\static-initialization-cycle.cpp
# | 
# | 
# | 
# | -dump-input=help explains the following input dump.
# | 
# | 
# | 
# | Input was:
# | 
# | <<<<<<
# | 
# |              .
# | 
# |              .
# | 
# |              .
# | 
# |             84:  134 | static int A = f(1); 
# | 
# |             85:  | ^ 
# | 
# |             86: C:\_work\llvm-project\llvm-project\build\tools\clang\tools\extra\test\clang-tidy\checkers\misc\Output\static-initialization-cycle.cpp.tmp.cpp:134:18: note: Result of 'f' may be used to initialize variable 'A' here 
# | 
# |             87:  134 | static int A = f(1); 
# | 
# |             88:  | ^ 
# | 
# |             89: C:\_work\llvm-project\llvm-project\build\tools\clang\tools\extra\test\clang-tidy\checkers\misc\Output\static-initialization-cycle.cpp.tmp.cpp:137:10: note: Value of 'A' may be used to compute result of 'f' 
# | 
# | check:167'0                                                                                                                                                                                                                  X error: no match found
# | 
# | check:167'1                                                                                                                                                                                                                    with "@LINE-7" equal to "160"
# | 
# |             90:  137 | return A + i; 
# | 
# | check:167'0     ~~~~~~~~~~~~~~~~~~~~~
# | 
# |             91:  | ^
# | 
# | check:167'0     ~~~~
# | 
# | >>>>>>
# | 
# | 
# `-----------------------------
# .---command stderr------------
# | Traceback (most recent call last):
# |   File "C:\_work\llvm-project\llvm-project\clang-tools-extra\test\clang-tidy\check_clang_tidy.py", line 413, in <module>
# |     main()
# |   File "C:\_work\llvm-project\llvm-project\clang-tools-extra\test\clang-tidy\check_clang_tidy.py", line 409, in main
# |     CheckRunner(args, extra_args).run()
# |   File "C:\_work\llvm-project\llvm-project\clang-tools-extra\test\clang-tidy\check_clang_tidy.py", line 313, in run
# |     self.check_notes(clang_tidy_output)
# |   File "C:\_work\llvm-project\llvm-project\clang-tools-extra\test\clang-tidy\check_clang_tidy.py", line 292, in check_notes
# |     try_run(
# |   File "C:\_work\llvm-project\llvm-project\clang-tools-extra\test\clang-tidy\check_clang_tidy.py", line 63, in try_run
# |     process_output = subprocess.check_output(args, stderr=subprocess.STDOUT).decode(
# |                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
# |   File "c:\python312\Lib\subprocess.py", line 466, in check_output
# |     return run(*popenargs, stdout=PIPE, timeout=timeout, check=True,
# |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
# |   File "c:\python312\Lib\subprocess.py", line 571, in run
# |     raise CalledProcessError(retcode, process.args,
# | subprocess.CalledProcessError: Command '['FileCheck', '-input-file=C:\\_work\\llvm-project\\llvm-project\\build\\tools\\clang\\tools\\extra\\test\\clang-tidy\\checkers\\misc\\Output\\static-initialization-cycle.cpp.tmp.cpp.notes', 'C:\\_work\\llvm-project\\llvm-project\\clang-tools-extra\\test\\clang-tidy\\checkers\\misc\\static-initialization-cycle.cpp', '-check-prefixes=CHECK-NOTES', '-implicit-check-not={{note|warning|error}}:']' returned non-zero exit status 1.
# `-----------------------------
# error: command failed with exit status: 1

--

```
</details>

If these failures are unrelated to your changes (for example tests are broken or flaky at HEAD), please open an issue at https://github.com/llvm/llvm-project/issues and add the `infrastructure` label.

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


More information about the cfe-commits mailing list