xref: /llvm-project/clang/test/Parser/warn-misleading-indentation.cpp (revision 25098736c1b6a716711a64fa45f7f34ccdbef6d1)
1bc840b21STyker // RUN: %clang_cc1 -x c -fsyntax-only -verify %s
2bc840b21STyker // RUN: %clang_cc1 -std=c++17 -fsyntax-only -verify -Wall -Wno-unused -Wno-misleading-indentation -DCXX17 %s
3b4b904e1STyker // RUN: %clang_cc1 -x c -fsyntax-only -verify -Wmisleading-indentation -DWITH_WARN -ftabstop 8 -DTAB_SIZE=8 %s
4b4b904e1STyker // RUN: %clang_cc1 -std=c++17 -fsyntax-only -verify -Wall -Wno-unused -DWITH_WARN  -ftabstop 4 -DTAB_SIZE=4 -DCXX17 %s
5b4b904e1STyker // RUN: %clang_cc1 -x c -fsyntax-only -verify -Wall -Wno-unused -DWITH_WARN -ftabstop 1 -DTAB_SIZE=1 %s
6b4b904e1STyker // RUN: %clang_cc1 -std=c++17 -fsyntax-only -verify -Wall -Wno-unused -Wmisleading-indentation -DCXX17 -DWITH_WARN -ftabstop 2 -DTAB_SIZE=2 %s
7bc840b21STyker 
8bc840b21STyker #ifndef WITH_WARN
9bc840b21STyker // expected-no-diagnostics
10bc840b21STyker #endif
11bc840b21STyker 
f0(int i)12bc840b21STyker void f0(int i) {
13bc840b21STyker   if (i)
14bc840b21STyker #ifdef WITH_WARN
15bc840b21STyker // expected-note@-2 {{here}}
16bc840b21STyker #endif
17bc840b21STyker     i = i + 1;
18bc840b21STyker     int x = 0;
19bc840b21STyker #ifdef WITH_WARN
20bc840b21STyker // expected-warning@-2 {{misleading indentation; statement is not part of the previous 'if'}}
21bc840b21STyker #endif
22bc840b21STyker   return;
23bc840b21STyker #ifdef CXX17
24bc840b21STyker   if constexpr (false)
25bc840b21STyker #ifdef WITH_WARN
26bc840b21STyker // expected-note@-2 {{here}}
27bc840b21STyker #endif
28bc840b21STyker     i = 0;
29bc840b21STyker     i += 1;
30bc840b21STyker #ifdef WITH_WARN
31bc840b21STyker // expected-warning@-2 {{misleading indentation; statement is not part of the previous 'if'}}
32bc840b21STyker #endif
33bc840b21STyker #endif
34bc840b21STyker }
35bc840b21STyker 
f1(int i)36bc840b21STyker void f1(int i) {
37bc840b21STyker   for (;i;)
38bc840b21STyker #ifdef WITH_WARN
39bc840b21STyker // expected-note@-2 {{here}}
40bc840b21STyker #endif
41bc840b21STyker     i = i + 1;
42bc840b21STyker     i *= 2;
43bc840b21STyker #ifdef WITH_WARN
44bc840b21STyker // expected-warning@-2 {{misleading indentation; statement is not part of the previous 'for'}}
45bc840b21STyker #endif
46bc840b21STyker   return;
47bc840b21STyker }
48bc840b21STyker 
f2(int i)49bc840b21STyker void f2(int i) {
50bc840b21STyker   while (i)
51bc840b21STyker #ifdef WITH_WARN
52bc840b21STyker // expected-note@-2 {{here}}
53bc840b21STyker #endif
54bc840b21STyker     i = i + 1; i *= 2;
55bc840b21STyker #ifdef WITH_WARN
56bc840b21STyker // expected-warning@-2 {{misleading indentation; statement is not part of the previous 'while'}}
57bc840b21STyker #endif
58bc840b21STyker   return;
59bc840b21STyker }
60bc840b21STyker 
f3(int i)61bc840b21STyker void f3(int i) {
62bc840b21STyker   if (i)
63bc840b21STyker     i = i + 1;
64bc840b21STyker   else
65bc840b21STyker #ifdef WITH_WARN
66bc840b21STyker // expected-note@-2 {{here}}
67bc840b21STyker #endif
68bc840b21STyker     i *= 2;
69bc840b21STyker     const int x = 0;
70bc840b21STyker #ifdef WITH_WARN
71bc840b21STyker // expected-warning@-2 {{misleading indentation; statement is not part of the previous 'else'}}
72bc840b21STyker #endif
73bc840b21STyker }
74bc840b21STyker 
75bc840b21STyker #ifdef CXX17
76bc840b21STyker struct Range {
beginRange77bc840b21STyker   int *begin() {return nullptr;}
endRange78bc840b21STyker   int *end() {return nullptr;}
79bc840b21STyker };
80bc840b21STyker #endif
81bc840b21STyker 
f4(int i)82bc840b21STyker void f4(int i) {
83bc840b21STyker   if (i)
84bc840b21STyker   i *= 2;
85bc840b21STyker   return;
86bc840b21STyker   if (i)
87bc840b21STyker     i *= 2;
88bc840b21STyker     ;
89bc840b21STyker   if (i)
90bc840b21STyker #ifdef WITH_WARN
91bc840b21STyker // expected-note@-2 {{here}}
92bc840b21STyker #endif
93bc840b21STyker     i *= 2;
94bc840b21STyker     typedef int Int;
95bc840b21STyker #ifdef WITH_WARN
96bc840b21STyker // expected-warning@-2 {{misleading indentation; statement is not part of the previous 'if'}}
97bc840b21STyker #endif
98bc840b21STyker #ifdef CXX17
99bc840b21STyker   Range R;
100bc840b21STyker   for (auto e : R)
101bc840b21STyker #ifdef WITH_WARN
102bc840b21STyker // expected-note@-2 {{here}}
103bc840b21STyker #endif
104bc840b21STyker     i *= 2;
105bc840b21STyker     using Int2 = int;
106bc840b21STyker #ifdef WITH_WARN
107bc840b21STyker // expected-warning@-2 {{misleading indentation; statement is not part of the previous 'for'}}
108bc840b21STyker #endif
109bc840b21STyker #endif
110bc840b21STyker }
111bc840b21STyker 
112bc840b21STyker int bar(void);
113bc840b21STyker 
foo(int * dst)114bc840b21STyker int foo(int* dst)
115bc840b21STyker {
116bc840b21STyker     if (dst)
117bc840b21STyker        return
118bc840b21STyker     bar();
119bc840b21STyker   if (dst)
120bc840b21STyker     dst = dst + \
121bc840b21STyker     bar();
122bc840b21STyker   return 0;
123bc840b21STyker }
124bc840b21STyker 
g(int i)125bc840b21STyker void g(int i) {
126bc840b21STyker   if (1)
127bc840b21STyker     i = 2;
128bc840b21STyker   else
129bc840b21STyker          if (i == 3)
130bc840b21STyker #ifdef WITH_WARN
131bc840b21STyker // expected-note@-3 {{here}}
132bc840b21STyker #endif
133bc840b21STyker     i = 4;
134bc840b21STyker     i = 5;
135bc840b21STyker #ifdef WITH_WARN
136bc840b21STyker // expected-warning@-2 {{misleading indentation; statement is not part of the previous 'if'}}
137bc840b21STyker #endif
138bc840b21STyker }
139bc840b21STyker 
140bc840b21STyker // Or this
141bc840b21STyker #define TEST i = 5
g0(int i)142bc840b21STyker void g0(int i) {
143bc840b21STyker   if (1)
144bc840b21STyker     i = 2;
145bc840b21STyker   else
146bc840b21STyker     i = 5;
147bc840b21STyker     TEST;
148bc840b21STyker }
149bc840b21STyker 
g1(int i)150bc840b21STyker void g1(int i) {
151bc840b21STyker   if (1)
152bc840b21STyker     i = 2;
153bc840b21STyker   else if (i == 3)
154bc840b21STyker #ifdef WITH_WARN
155bc840b21STyker // expected-note@-2 {{here}}
156bc840b21STyker #endif
157bc840b21STyker       i = 4;
158bc840b21STyker       i = 5;
159bc840b21STyker #ifdef WITH_WARN
160bc840b21STyker // expected-warning@-2 {{misleading indentation; statement is not part of the previous 'if'}}
161bc840b21STyker #endif
162bc840b21STyker }
163bc840b21STyker 
g2(int i)164bc840b21STyker void g2(int i) {
165bc840b21STyker   if (1)
166bc840b21STyker     i = 2;
167bc840b21STyker   else
168bc840b21STyker     if (i == 3)
169bc840b21STyker     {i = 4;}
170bc840b21STyker     i = 5;
171bc840b21STyker }
172bc840b21STyker 
g6(int i)173bc840b21STyker void g6(int i) {
174bc840b21STyker         if (1)
175bc840b21STyker                 if (i == 3)
176bc840b21STyker #ifdef WITH_WARN
177bc840b21STyker // expected-note@-2 {{here}}
178bc840b21STyker #endif
179bc840b21STyker                         i = 4;
180bc840b21STyker                         i = 5;
181bc840b21STyker #ifdef WITH_WARN
182bc840b21STyker // expected-warning@-2 {{misleading indentation; statement is not part of the previous 'if'}}
183bc840b21STyker #endif
184bc840b21STyker }
185bc840b21STyker 
g7(int i)186bc840b21STyker void g7(int i) {
187bc840b21STyker   if (1)
188bc840b21STyker     i = 4;
189bc840b21STyker #ifdef TEST1
190bc840b21STyker #endif
191bc840b21STyker     i = 5;
192bc840b21STyker }
193bc840b21STyker 
a1(int i)194bc840b21STyker void a1(int i) { if (1) i = 4; return; }
195bc840b21STyker 
a2(int i)196bc840b21STyker void a2(int i) {
197bc840b21STyker   {
198bc840b21STyker     if (1)
199bc840b21STyker       i = 4;
200bc840b21STyker       }
201bc840b21STyker   return;
202bc840b21STyker }
203bc840b21STyker 
a3(int i)204bc840b21STyker void a3(int i) {
205bc840b21STyker   if (1)
206bc840b21STyker     {
207bc840b21STyker     i = 4;
208bc840b21STyker     }
209bc840b21STyker     return;
210bc840b21STyker }
2119c8cfa09STyker 
s(int num)2129c8cfa09STyker void s(int num) {
2139c8cfa09STyker     {
2149c8cfa09STyker         if (1)
2159c8cfa09STyker             return;
2169c8cfa09STyker         else
2179c8cfa09STyker             return;
2189c8cfa09STyker         return;
2199c8cfa09STyker     }
2209c8cfa09STyker     if (0)
2219c8cfa09STyker #ifdef WITH_WARN
2229c8cfa09STyker // expected-note@-2 {{here}}
2239c8cfa09STyker #endif
2249c8cfa09STyker         return;
2259c8cfa09STyker         return;
2269c8cfa09STyker #ifdef WITH_WARN
2279c8cfa09STyker // expected-warning@-2 {{misleading indentation; statement is not part of the previous 'if'}}
2289c8cfa09STyker #endif
2299c8cfa09STyker }
a4(void)230*25098736SAaron Ballman int a4(void)
231b4b904e1STyker {
232b4b904e1STyker 	if (0)
233b4b904e1STyker 		return 1;
234b4b904e1STyker  	return 0;
235b4b904e1STyker #if (TAB_SIZE == 1)
236b4b904e1STyker // expected-warning@-2 {{misleading indentation; statement is not part of the previous 'if'}}
237b4b904e1STyker // expected-note@-5 {{here}}
238b4b904e1STyker #endif
239b4b904e1STyker }
240b4b904e1STyker 
a5(void)241*25098736SAaron Ballman int a5(void)
242b4b904e1STyker {
243b4b904e1STyker 	if (0)
244b4b904e1STyker 		return 1;
245b4b904e1STyker 		return 0;
246b4b904e1STyker #if WITH_WARN
247b4b904e1STyker // expected-warning@-2 {{misleading indentation; statement is not part of the previous 'if'}}
248b4b904e1STyker // expected-note@-5 {{here}}
249b4b904e1STyker #endif
250b4b904e1STyker }
251b4b904e1STyker 
a6(void)252*25098736SAaron Ballman int a6(void)
253b4b904e1STyker {
254b4b904e1STyker 	if (0)
255b4b904e1STyker 		return 1;
256b4b904e1STyker       		return 0;
257b4b904e1STyker #if (TAB_SIZE == 8)
258b4b904e1STyker // expected-warning@-2 {{misleading indentation; statement is not part of the previous 'if'}}
259b4b904e1STyker // expected-note@-5 {{here}}
260b4b904e1STyker #endif
261b4b904e1STyker }
262b4b904e1STyker 
263b4b904e1STyker #define FOO \
264b4b904e1STyker  goto fail
265b4b904e1STyker 
main(int argc,char * argv[])266b4b904e1STyker int main(int argc, char* argv[]) {
267b4b904e1STyker   if (5 != 0)
268b4b904e1STyker     goto fail;
269b4b904e1STyker   else
270b4b904e1STyker     goto fail;
271b4b904e1STyker 
272b4b904e1STyker   if (1) {
273b4b904e1STyker     if (1)
274b4b904e1STyker       goto fail;
275b4b904e1STyker     else if (1)
276b4b904e1STyker       goto fail;
277b4b904e1STyker     else if (1)
278b4b904e1STyker       goto fail;
279b4b904e1STyker     else
280b4b904e1STyker       goto fail;
281b4b904e1STyker   } else if (1) {
282b4b904e1STyker     if (1)
283b4b904e1STyker       goto fail;
284b4b904e1STyker   }
285b4b904e1STyker 
286b4b904e1STyker   if (1) {
287b4b904e1STyker     if (1)
288b4b904e1STyker       goto fail;
289b4b904e1STyker   } else if (1)
290b4b904e1STyker     goto fail;
291b4b904e1STyker 
292b4b904e1STyker 
293b4b904e1STyker   if (1) goto fail; goto fail;
294b4b904e1STyker 
295b4b904e1STyker     if (0)
296b4b904e1STyker         goto fail;
297b4b904e1STyker 
298b4b904e1STyker     goto fail;
299b4b904e1STyker 
300b4b904e1STyker     if (0)
301b4b904e1STyker         FOO;
302b4b904e1STyker 
303b4b904e1STyker     goto fail;
304b4b904e1STyker 
305b4b904e1STyker fail:;
306b4b904e1STyker }
307b4b904e1STyker 
f_label(int b)308f5329bfcSTyker void f_label(int b) {
309f5329bfcSTyker   if (b)
310f5329bfcSTyker     return;
311f5329bfcSTyker     a:
312f5329bfcSTyker   return;
313f5329bfcSTyker   goto a;
314f5329bfcSTyker }
315