| 1 | // RUN: %clang_cc1 %s -fsyntax-only -verify -fblocks -Wmissing-noreturn -Wno-unreachable-code |
| 2 | |
| 3 | int j; |
| 4 | void test1() { // expected-warning {{function 'test1' could be declared with attribute 'noreturn'}} |
| 5 | ^ (void) { while (1) { } }(); |
| 6 | ^ (void) { if (j) while (1) { } }(); |
| 7 | while (1) { } |
| 8 | } |
| 9 | |
| 10 | void test2() { |
| 11 | if (j) while (1) { } |
| 12 | } |
| 13 | |
| 14 | __attribute__((__noreturn__)) |
| 15 | void test2_positive() { |
| 16 | if (j) while (1) { } |
| 17 | } // expected-warning{{function declared 'noreturn' should not return}} |
| 18 | |
| 19 | |
| 20 | // This test case illustrates that we don't warn about the missing return |
| 21 | // because the function is marked noreturn and there is an infinite loop. |
| 22 | extern int foo_test_3(); |
| 23 | __attribute__((__noreturn__)) void* test3(int arg) { |
| 24 | while (1) foo_test_3(); |
| 25 | } |
| 26 | |
| 27 | __attribute__((__noreturn__)) void* test3_positive(int arg) { |
| 28 | while (0) foo_test_3(); |
| 29 | } // expected-warning{{function declared 'noreturn' should not return}} |
| 30 | |
| 31 | |
| 32 | // PR5298 - -Wmissing-noreturn shouldn't warn if the function is already |
| 33 | // declared noreturn. |
| 34 | void __attribute__((noreturn)) |
| 35 | test4() { |
| 36 | test2_positive(); |
| 37 | } |
| 38 | |
| 39 | // Do not warn here. |
| 40 | _Noreturn void test5() { |
| 41 | test2_positive(); |
| 42 | } |
| 43 | |
| 44 | // rdar://16274746 |
| 45 | void test6() |
| 46 | { |
| 47 | (void)^{ |
| 48 | for(;;) |
| 49 | ; |
| 50 | }; |
| 51 | } |
| 52 | |
| 53 | |