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)12bc840b21STykervoid 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)36bc840b21STykervoid 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)49bc840b21STykervoid 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)61bc840b21STykervoid 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)82bc840b21STykervoid 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)114bc840b21STykerint 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)125bc840b21STykervoid 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)142bc840b21STykervoid g0(int i) { 143bc840b21STyker if (1) 144bc840b21STyker i = 2; 145bc840b21STyker else 146bc840b21STyker i = 5; 147bc840b21STyker TEST; 148bc840b21STyker } 149bc840b21STyker g1(int i)150bc840b21STykervoid 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)164bc840b21STykervoid 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)173bc840b21STykervoid 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)186bc840b21STykervoid g7(int i) { 187bc840b21STyker if (1) 188bc840b21STyker i = 4; 189bc840b21STyker #ifdef TEST1 190bc840b21STyker #endif 191bc840b21STyker i = 5; 192bc840b21STyker } 193bc840b21STyker a1(int i)194bc840b21STykervoid a1(int i) { if (1) i = 4; return; } 195bc840b21STyker a2(int i)196bc840b21STykervoid a2(int i) { 197bc840b21STyker { 198bc840b21STyker if (1) 199bc840b21STyker i = 4; 200bc840b21STyker } 201bc840b21STyker return; 202bc840b21STyker } 203bc840b21STyker a3(int i)204bc840b21STykervoid a3(int i) { 205bc840b21STyker if (1) 206bc840b21STyker { 207bc840b21STyker i = 4; 208bc840b21STyker } 209bc840b21STyker return; 210bc840b21STyker } 2119c8cfa09STyker s(int num)2129c8cfa09STykervoid 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 Ballmanint 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 Ballmanint 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 Ballmanint 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[])266b4b904e1STykerint 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)308f5329bfcSTykervoid f_label(int b) { 309f5329bfcSTyker if (b) 310f5329bfcSTyker return; 311f5329bfcSTyker a: 312f5329bfcSTyker return; 313f5329bfcSTyker goto a; 314f5329bfcSTyker } 315