1 | // RUN: %check_clang_tidy %s bugprone-reserved-identifier %t -- -- \ |
2 | // RUN: -I%S/Inputs/reserved-identifier \ |
3 | // RUN: -isystem %S/Inputs/reserved-identifier/system |
4 | |
5 | // no warnings expected without -header-filter= |
6 | #include "user-header.h" |
7 | #include <system-header.h> |
8 | |
9 | #define _MACRO(m) int m = 0 |
10 | // CHECK-MESSAGES: :[[@LINE-1]]:9: warning: declaration uses identifier '_MACRO', which is a reserved identifier [bugprone-reserved-identifier] |
11 | // CHECK-FIXES: {{^}}#define MACRO(m) int m = 0{{$}} |
12 | |
13 | namespace _Ns { |
14 | // CHECK-MESSAGES: :[[@LINE-1]]:11: warning: declaration uses identifier '_Ns', which is a reserved identifier [bugprone-reserved-identifier] |
15 | // CHECK-FIXES: {{^}}namespace Ns {{{$}} |
16 | |
17 | class _Object { |
18 | // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: declaration uses identifier '_Object', which is a reserved identifier [bugprone-reserved-identifier] |
19 | // CHECK-FIXES: {{^}}class Object {{{$}} |
20 | int _Member; |
21 | // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: declaration uses identifier '_Member', which is a reserved identifier [bugprone-reserved-identifier] |
22 | // CHECK-FIXES: {{^}} int Member;{{$}} |
23 | }; |
24 | |
25 | float _Global; |
26 | // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: declaration uses identifier '_Global', which is a reserved identifier [bugprone-reserved-identifier] |
27 | // CHECK-FIXES: {{^}}float Global;{{$}} |
28 | |
29 | void _Function() {} |
30 | // CHECK-MESSAGES: :[[@LINE-1]]:6: warning: declaration uses identifier '_Function', which is a reserved identifier [bugprone-reserved-identifier] |
31 | // CHECK-FIXES: {{^}}void Function() {}{{$}} |
32 | |
33 | using _Alias = int; |
34 | // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: declaration uses identifier '_Alias', which is a reserved identifier [bugprone-reserved-identifier] |
35 | // CHECK-FIXES: {{^}}using Alias = int;{{$}} |
36 | |
37 | template <typename _TemplateParam> |
38 | // CHECK-MESSAGES: :[[@LINE-1]]:20: warning: declaration uses identifier '_TemplateParam', which is a reserved identifier [bugprone-reserved-identifier] |
39 | // CHECK-FIXES: {{^}}template <typename TemplateParam>{{$}} |
40 | struct S {}; |
41 | |
42 | } // namespace _Ns |
43 | |
44 | // |
45 | |
46 | #define __macro(m) int m = 0 |
47 | // CHECK-MESSAGES: :[[@LINE-1]]:9: warning: declaration uses identifier '__macro', which is a reserved identifier [bugprone-reserved-identifier] |
48 | // CHECK-FIXES: {{^}}#define _macro(m) int m = 0{{$}} |
49 | |
50 | namespace __ns { |
51 | // CHECK-MESSAGES: :[[@LINE-1]]:11: warning: declaration uses identifier '__ns', which is a reserved identifier [bugprone-reserved-identifier] |
52 | // CHECK-FIXES: {{^}}namespace ns {{{$}} |
53 | class __object { |
54 | // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: declaration uses identifier '__object', which is a reserved identifier [bugprone-reserved-identifier] |
55 | // CHECK-FIXES: {{^}}class _object {{{$}} |
56 | int __member; |
57 | // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: declaration uses identifier '__member', which is a reserved identifier [bugprone-reserved-identifier] |
58 | // CHECK-FIXES: {{^}} int _member;{{$}} |
59 | }; |
60 | |
61 | float __global; |
62 | // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: declaration uses identifier '__global', which is a reserved identifier [bugprone-reserved-identifier] |
63 | // CHECK-FIXES: {{^}}float _global;{{$}} |
64 | |
65 | void __function() {} |
66 | // CHECK-MESSAGES: :[[@LINE-1]]:6: warning: declaration uses identifier '__function', which is a reserved identifier [bugprone-reserved-identifier] |
67 | // CHECK-FIXES: {{^}}void _function() {}{{$}} |
68 | |
69 | using __alias = int; |
70 | // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: declaration uses identifier '__alias', which is a reserved identifier [bugprone-reserved-identifier] |
71 | // CHECK-FIXES: {{^}}using _alias = int;{{$}} |
72 | |
73 | template <typename __templateParam> |
74 | // CHECK-MESSAGES: :[[@LINE-1]]:20: warning: declaration uses identifier '__templateParam', which is a reserved identifier [bugprone-reserved-identifier] |
75 | // CHECK-FIXES: {{^}}template <typename _templateParam>{{$}} |
76 | struct S {}; |
77 | |
78 | } // namespace __ns |
79 | |
80 | // |
81 | |
82 | #define macro___m(m) int m = 0 |
83 | // CHECK-MESSAGES: :[[@LINE-1]]:9: warning: declaration uses identifier 'macro___m', which is a reserved identifier [bugprone-reserved-identifier] |
84 | // CHECK-FIXES: {{^}}#define macro_m(m) int m = 0{{$}} |
85 | |
86 | namespace ns___n { |
87 | // CHECK-MESSAGES: :[[@LINE-1]]:11: warning: declaration uses identifier 'ns___n', which is a reserved identifier [bugprone-reserved-identifier] |
88 | // CHECK-FIXES: {{^}}namespace ns_n {{{$}} |
89 | class object___o { |
90 | // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: declaration uses identifier 'object___o', which is a reserved identifier [bugprone-reserved-identifier] |
91 | // CHECK-FIXES: {{^}}class object_o {{{$}} |
92 | int member___m; |
93 | // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: declaration uses identifier 'member___m', which is a reserved identifier [bugprone-reserved-identifier] |
94 | // CHECK-FIXES: {{^}} int member_m;{{$}} |
95 | }; |
96 | |
97 | float global___g; |
98 | // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: declaration uses identifier 'global___g', which is a reserved identifier [bugprone-reserved-identifier] |
99 | // CHECK-FIXES: {{^}}float global_g;{{$}} |
100 | |
101 | void function___f() {} |
102 | // CHECK-MESSAGES: :[[@LINE-1]]:6: warning: declaration uses identifier 'function___f', which is a reserved identifier [bugprone-reserved-identifier] |
103 | // CHECK-FIXES: {{^}}void function_f() {}{{$}} |
104 | |
105 | using alias___a = int; |
106 | // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: declaration uses identifier 'alias___a', which is a reserved identifier [bugprone-reserved-identifier] |
107 | // CHECK-FIXES: {{^}}using alias_a = int;{{$}} |
108 | |
109 | template <typename templateParam___t> |
110 | // CHECK-MESSAGES: :[[@LINE-1]]:20: warning: declaration uses identifier 'templateParam___t', which is a reserved identifier [bugprone-reserved-identifier] |
111 | // CHECK-FIXES: {{^}}template <typename templateParam_t>{{$}} |
112 | struct S {}; |
113 | |
114 | } // namespace ns___n |
115 | |
116 | // |
117 | |
118 | // OK, this rule does not apply to macros: |
119 | // https://github.com/llvm/llvm-project/issues/64130#issuecomment-1655751676 |
120 | #define _macro(m) int m = 0 |
121 | |
122 | namespace _ns { |
123 | // CHECK-MESSAGES: :[[@LINE-1]]:11: warning: declaration uses identifier '_ns', which is reserved in the global namespace [bugprone-reserved-identifier] |
124 | // CHECK-FIXES: {{^}}namespace ns {{{$}} |
125 | int _i; |
126 | // no warning |
127 | } // namespace _ns |
128 | class _object { |
129 | // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: declaration uses identifier '_object', which is reserved in the global namespace [bugprone-reserved-identifier] |
130 | // CHECK-FIXES: {{^}}class object {{{$}} |
131 | int _member; |
132 | // no warning |
133 | }; |
134 | float _global; |
135 | // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: declaration uses identifier '_global', which is reserved in the global namespace [bugprone-reserved-identifier] |
136 | // CHECK-FIXES: {{^}}float global;{{$}} |
137 | void _function() {} |
138 | // CHECK-MESSAGES: :[[@LINE-1]]:6: warning: declaration uses identifier '_function', which is reserved in the global namespace [bugprone-reserved-identifier] |
139 | // CHECK-FIXES: {{^}}void function() {}{{$}} |
140 | using _alias = int; |
141 | // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: declaration uses identifier '_alias', which is reserved in the global namespace [bugprone-reserved-identifier] |
142 | // CHECK-FIXES: {{^}}using alias = int;{{$}} |
143 | template <typename _templateParam> // no warning, template params are not in the global namespace |
144 | struct S {}; |
145 | |
146 | void _float() {} |
147 | // CHECK-MESSAGES: :[[@LINE-1]]:6: warning: declaration uses identifier '_float', which is reserved in the global namespace; cannot be fixed because 'float' would conflict with a keyword [bugprone-reserved-identifier] |
148 | // CHECK-FIXES: {{^}}void _float() {}{{$}} |
149 | |
150 | #define SOME_MACRO |
151 | int SOME__MACRO; |
152 | // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: declaration uses identifier 'SOME__MACRO', which is a reserved identifier; cannot be fixed because 'SOME_MACRO' would conflict with a macro definition [bugprone-reserved-identifier] |
153 | // CHECK-FIXES: {{^}}int SOME__MACRO;{{$}} |
154 | |
155 | void _TWO__PROBLEMS() {} |
156 | // CHECK-MESSAGES: :[[@LINE-1]]:6: warning: declaration uses identifier '_TWO__PROBLEMS', which is a reserved identifier [bugprone-reserved-identifier] |
157 | // CHECK-FIXES: {{^}}void TWO_PROBLEMS() {}{{$}} |
158 | void _two__problems() {} |
159 | // CHECK-MESSAGES: :[[@LINE-1]]:6: warning: declaration uses identifier '_two__problems', which is a reserved identifier [bugprone-reserved-identifier] |
160 | // CHECK-FIXES: {{^}}void two_problems() {}{{$}} |
161 | |
162 | int __; |
163 | // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: declaration uses identifier '__', which is a reserved identifier; cannot be fixed automatically [bugprone-reserved-identifier] |
164 | // CHECK-FIXES: {{^}}int __;{{$}} |
165 | |
166 | int _________; |
167 | // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: declaration uses identifier '_________', which is a reserved identifier; cannot be fixed automatically [bugprone-reserved-identifier] |
168 | // CHECK-FIXES: {{^}}int _________;{{$}} |
169 | |
170 | int _; |
171 | // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: declaration uses identifier '_', which is reserved in the global namespace; cannot be fixed automatically [bugprone-reserved-identifier] |
172 | // CHECK-FIXES: {{^}}int _;{{$}} |
173 | |
174 | // This should not trigger a warning |
175 | // https://github.com/llvm/llvm-project/issues/52895 |
176 | #define _5_kmph_rpm 459 |
177 | |
178 | // these should pass |
179 | #define MACRO(m) int m = 0 |
180 | |
181 | namespace Ns { |
182 | class Object { |
183 | int Member; |
184 | }; |
185 | float Global; |
186 | |
187 | void Function() {} |
188 | using Alias = int; |
189 | template <typename TemplateParam> |
190 | struct S {}; |
191 | } // namespace Ns |
192 | namespace ns_ { |
193 | class object_ { |
194 | int member_; |
195 | }; |
196 | float global_; |
197 | void function_() {} |
198 | using alias_ = int; |
199 | template <typename templateParam_> |
200 | struct S {}; |
201 | } // namespace ns_ |
202 | |
203 | class object_ { |
204 | int member_; |
205 | }; |
206 | float global_; |
207 | void function_() {} |
208 | using alias_ = int; |
209 | template <typename templateParam_> |
210 | struct S_ {}; |
211 | |