]>
Commit | Line | Data |
---|---|---|
223e47cc LB |
1 | // RUN: %clang_cc1 -fsyntax-only -verify %s |
2 | ||
3 | // Reachability tests have to come first because they get suppressed | |
4 | // if any errors have occurred. | |
5 | namespace test5 { | |
6 | struct A { | |
7 | __attribute__((noreturn)) void fail(); | |
8 | void nofail(); | |
9 | } a; | |
10 | ||
11 | int &test1() { | |
12 | a.nofail(); | |
13 | } // expected-warning {{control reaches end of non-void function}} | |
14 | ||
15 | int &test2() { | |
16 | a.fail(); | |
17 | } | |
18 | } | |
19 | ||
20 | // PR5620 | |
21 | void f0() __attribute__((__noreturn__)); | |
22 | void f1(void (*)()); | |
23 | void f2() { f1(f0); } | |
24 | ||
25 | // Taking the address of a noreturn function | |
26 | void test_f0a() { | |
27 | void (*fp)() = f0; | |
28 | void (*fp1)() __attribute__((noreturn)) = f0; | |
29 | } | |
30 | ||
31 | // Taking the address of an overloaded noreturn function | |
32 | void f0(int) __attribute__((__noreturn__)); | |
33 | ||
34 | void test_f0b() { | |
35 | void (*fp)() = f0; | |
36 | void (*fp1)() __attribute__((noreturn)) = f0; | |
37 | } | |
38 | ||
39 | // No-returned function pointers | |
40 | typedef void (* noreturn_fp)() __attribute__((noreturn)); | |
41 | ||
42 | void f3(noreturn_fp); // expected-note{{candidate function}} | |
43 | ||
44 | void test_f3() { | |
45 | f3(f0); // okay | |
46 | f3(f2); // expected-error{{no matching function for call}} | |
47 | } | |
48 | ||
49 | ||
50 | class xpto { | |
51 | int blah() __attribute__((noreturn)); | |
52 | }; | |
53 | ||
54 | int xpto::blah() { | |
55 | return 3; // expected-warning {{function 'blah' declared 'noreturn' should not return}} | |
56 | } | |
57 | ||
58 | // PR12948 | |
59 | ||
60 | namespace PR12948 { | |
61 | template<int> | |
62 | void foo() __attribute__((__noreturn__)); | |
63 | ||
64 | template<int> | |
65 | void foo() { | |
66 | while (1) continue; | |
67 | } | |
68 | ||
69 | void bar() __attribute__((__noreturn__)); | |
70 | ||
71 | void bar() { | |
72 | foo<0>(); | |
73 | } | |
74 | ||
75 | ||
76 | void baz() __attribute__((__noreturn__)); | |
77 | typedef void voidfn(); | |
78 | voidfn baz; | |
79 | ||
80 | template<typename> void wibble() __attribute__((__noreturn__)); | |
81 | template<typename> voidfn wibble; | |
82 | } |