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 | |