|  | // RUN: %clang_cc1 -x c -fsyntax-only -verify %s | 
|  | // RUN: %clang_cc1 -std=c++17 -fsyntax-only -verify -Wall -Wno-unused -Wno-misleading-indentation -DCXX17 %s | 
|  | // RUN: %clang_cc1 -x c -fsyntax-only -verify -Wmisleading-indentation -DWITH_WARN -ftabstop 8 -DTAB_SIZE=8 %s | 
|  | // RUN: %clang_cc1 -std=c++17 -fsyntax-only -verify -Wall -Wno-unused -DWITH_WARN  -ftabstop 4 -DTAB_SIZE=4 -DCXX17 %s | 
|  | // RUN: %clang_cc1 -x c -fsyntax-only -verify -Wall -Wno-unused -DWITH_WARN -ftabstop 1 -DTAB_SIZE=1 %s | 
|  | // RUN: %clang_cc1 -std=c++17 -fsyntax-only -verify -Wall -Wno-unused -Wmisleading-indentation -DCXX17 -DWITH_WARN -ftabstop 2 -DTAB_SIZE=2 %s | 
|  |  | 
|  | #ifndef WITH_WARN | 
|  | // expected-no-diagnostics | 
|  | #endif | 
|  |  | 
|  | void f0(int i) { | 
|  | if (i) | 
|  | #ifdef WITH_WARN | 
|  | // expected-note@-2 {{here}} | 
|  | #endif | 
|  | i = i + 1; | 
|  | int x = 0; | 
|  | #ifdef WITH_WARN | 
|  | // expected-warning@-2 {{misleading indentation; statement is not part of the previous 'if'}} | 
|  | #endif | 
|  | return; | 
|  | #ifdef CXX17 | 
|  | if constexpr (false) | 
|  | #ifdef WITH_WARN | 
|  | // expected-note@-2 {{here}} | 
|  | #endif | 
|  | i = 0; | 
|  | i += 1; | 
|  | #ifdef WITH_WARN | 
|  | // expected-warning@-2 {{misleading indentation; statement is not part of the previous 'if'}} | 
|  | #endif | 
|  | #endif | 
|  | } | 
|  |  | 
|  | void f1(int i) { | 
|  | for (;i;) | 
|  | #ifdef WITH_WARN | 
|  | // expected-note@-2 {{here}} | 
|  | #endif | 
|  | i = i + 1; | 
|  | i *= 2; | 
|  | #ifdef WITH_WARN | 
|  | // expected-warning@-2 {{misleading indentation; statement is not part of the previous 'for'}} | 
|  | #endif | 
|  | return; | 
|  | } | 
|  |  | 
|  | void f2(int i) { | 
|  | while (i) | 
|  | #ifdef WITH_WARN | 
|  | // expected-note@-2 {{here}} | 
|  | #endif | 
|  | i = i + 1; i *= 2; | 
|  | #ifdef WITH_WARN | 
|  | // expected-warning@-2 {{misleading indentation; statement is not part of the previous 'while'}} | 
|  | #endif | 
|  | return; | 
|  | } | 
|  |  | 
|  | void f3(int i) { | 
|  | if (i) | 
|  | i = i + 1; | 
|  | else | 
|  | #ifdef WITH_WARN | 
|  | // expected-note@-2 {{here}} | 
|  | #endif | 
|  | i *= 2; | 
|  | const int x = 0; | 
|  | #ifdef WITH_WARN | 
|  | // expected-warning@-2 {{misleading indentation; statement is not part of the previous 'else'}} | 
|  | #endif | 
|  | } | 
|  |  | 
|  | #ifdef CXX17 | 
|  | struct Range { | 
|  | int *begin() {return nullptr;} | 
|  | int *end() {return nullptr;} | 
|  | }; | 
|  | #endif | 
|  |  | 
|  | void f4(int i) { | 
|  | if (i) | 
|  | i *= 2; | 
|  | return; | 
|  | if (i) | 
|  | i *= 2; | 
|  | ; | 
|  | if (i) | 
|  | #ifdef WITH_WARN | 
|  | // expected-note@-2 {{here}} | 
|  | #endif | 
|  | i *= 2; | 
|  | typedef int Int; | 
|  | #ifdef WITH_WARN | 
|  | // expected-warning@-2 {{misleading indentation; statement is not part of the previous 'if'}} | 
|  | #endif | 
|  | #ifdef CXX17 | 
|  | Range R; | 
|  | for (auto e : R) | 
|  | #ifdef WITH_WARN | 
|  | // expected-note@-2 {{here}} | 
|  | #endif | 
|  | i *= 2; | 
|  | using Int2 = int; | 
|  | #ifdef WITH_WARN | 
|  | // expected-warning@-2 {{misleading indentation; statement is not part of the previous 'for'}} | 
|  | #endif | 
|  | #endif | 
|  | } | 
|  |  | 
|  | int bar(void); | 
|  |  | 
|  | int foo(int* dst) | 
|  | { | 
|  | if (dst) | 
|  | return | 
|  | bar(); | 
|  | if (dst) | 
|  | dst = dst + \ | 
|  | bar(); | 
|  | return 0; | 
|  | } | 
|  |  | 
|  | void g(int i) { | 
|  | if (1) | 
|  | i = 2; | 
|  | else | 
|  | if (i == 3) | 
|  | #ifdef WITH_WARN | 
|  | // expected-note@-3 {{here}} | 
|  | #endif | 
|  | i = 4; | 
|  | i = 5; | 
|  | #ifdef WITH_WARN | 
|  | // expected-warning@-2 {{misleading indentation; statement is not part of the previous 'if'}} | 
|  | #endif | 
|  | } | 
|  |  | 
|  | // Or this | 
|  | #define TEST i = 5 | 
|  | void g0(int i) { | 
|  | if (1) | 
|  | i = 2; | 
|  | else | 
|  | i = 5; | 
|  | TEST; | 
|  | } | 
|  |  | 
|  | void g1(int i) { | 
|  | if (1) | 
|  | i = 2; | 
|  | else if (i == 3) | 
|  | #ifdef WITH_WARN | 
|  | // expected-note@-2 {{here}} | 
|  | #endif | 
|  | i = 4; | 
|  | i = 5; | 
|  | #ifdef WITH_WARN | 
|  | // expected-warning@-2 {{misleading indentation; statement is not part of the previous 'if'}} | 
|  | #endif | 
|  | } | 
|  |  | 
|  | void g2(int i) { | 
|  | if (1) | 
|  | i = 2; | 
|  | else | 
|  | if (i == 3) | 
|  | {i = 4;} | 
|  | i = 5; | 
|  | } | 
|  |  | 
|  | void g6(int i) { | 
|  | if (1) | 
|  | if (i == 3) | 
|  | #ifdef WITH_WARN | 
|  | // expected-note@-2 {{here}} | 
|  | #endif | 
|  | i = 4; | 
|  | i = 5; | 
|  | #ifdef WITH_WARN | 
|  | // expected-warning@-2 {{misleading indentation; statement is not part of the previous 'if'}} | 
|  | #endif | 
|  | } | 
|  |  | 
|  | void g7(int i) { | 
|  | if (1) | 
|  | i = 4; | 
|  | #ifdef TEST1 | 
|  | #endif | 
|  | i = 5; | 
|  | } | 
|  |  | 
|  | void a1(int i) { if (1) i = 4; return; } | 
|  |  | 
|  | void a2(int i) { | 
|  | { | 
|  | if (1) | 
|  | i = 4; | 
|  | } | 
|  | return; | 
|  | } | 
|  |  | 
|  | void a3(int i) { | 
|  | if (1) | 
|  | { | 
|  | i = 4; | 
|  | } | 
|  | return; | 
|  | } | 
|  |  | 
|  | void s(int num) { | 
|  | { | 
|  | if (1) | 
|  | return; | 
|  | else | 
|  | return; | 
|  | return; | 
|  | } | 
|  | if (0) | 
|  | #ifdef WITH_WARN | 
|  | // expected-note@-2 {{here}} | 
|  | #endif | 
|  | return; | 
|  | return; | 
|  | #ifdef WITH_WARN | 
|  | // expected-warning@-2 {{misleading indentation; statement is not part of the previous 'if'}} | 
|  | #endif | 
|  | } | 
|  | int a4(void) | 
|  | { | 
|  | if (0) | 
|  | return 1; | 
|  | return 0; | 
|  | #if (TAB_SIZE == 1) | 
|  | // expected-warning@-2 {{misleading indentation; statement is not part of the previous 'if'}} | 
|  | // expected-note@-5 {{here}} | 
|  | #endif | 
|  | } | 
|  |  | 
|  | int a5(void) | 
|  | { | 
|  | if (0) | 
|  | return 1; | 
|  | return 0; | 
|  | #if WITH_WARN | 
|  | // expected-warning@-2 {{misleading indentation; statement is not part of the previous 'if'}} | 
|  | // expected-note@-5 {{here}} | 
|  | #endif | 
|  | } | 
|  |  | 
|  | int a6(void) | 
|  | { | 
|  | if (0) | 
|  | return 1; | 
|  | return 0; | 
|  | #if (TAB_SIZE == 8) | 
|  | // expected-warning@-2 {{misleading indentation; statement is not part of the previous 'if'}} | 
|  | // expected-note@-5 {{here}} | 
|  | #endif | 
|  | } | 
|  |  | 
|  | #define FOO \ | 
|  | goto fail | 
|  |  | 
|  | int main(int argc, char* argv[]) { | 
|  | if (5 != 0) | 
|  | goto fail; | 
|  | else | 
|  | goto fail; | 
|  |  | 
|  | if (1) { | 
|  | if (1) | 
|  | goto fail; | 
|  | else if (1) | 
|  | goto fail; | 
|  | else if (1) | 
|  | goto fail; | 
|  | else | 
|  | goto fail; | 
|  | } else if (1) { | 
|  | if (1) | 
|  | goto fail; | 
|  | } | 
|  |  | 
|  | if (1) { | 
|  | if (1) | 
|  | goto fail; | 
|  | } else if (1) | 
|  | goto fail; | 
|  |  | 
|  |  | 
|  | if (1) goto fail; goto fail; | 
|  |  | 
|  | if (0) | 
|  | goto fail; | 
|  |  | 
|  | goto fail; | 
|  |  | 
|  | if (0) | 
|  | FOO; | 
|  |  | 
|  | goto fail; | 
|  |  | 
|  | fail:; | 
|  | } | 
|  |  | 
|  | void f_label(int b) { | 
|  | if (b) | 
|  | return; | 
|  | a: | 
|  | return; | 
|  | goto a; | 
|  | } |