// 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() { 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() { 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() { 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; }