blob: f3d548b793b055bc87927555dc06d77516e298a6 [file] [log] [blame]
Daniel Dunbara5728872009-12-15 20:14:24 +00001// RUN: %clang_cc1 -fsyntax-only -verify %s
Douglas Gregor43c79c22009-12-09 00:47:37 +00002
John McCall1de85332011-05-11 07:19:11 +00003// Reachability tests have to come first because they get suppressed
4// if any errors have occurred.
5namespace 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
Douglas Gregor43c79c22009-12-09 00:47:37 +000020// PR5620
21void f0() __attribute__((__noreturn__));
22void f1(void (*)());
23void f2() { f1(f0); }
24
25// Taking the address of a noreturn function
26void test_f0a() {
27 void (*fp)() = f0;
28 void (*fp1)() __attribute__((noreturn)) = f0;
29}
30
31// Taking the address of an overloaded noreturn function
32void f0(int) __attribute__((__noreturn__));
33
34void test_f0b() {
35 void (*fp)() = f0;
36 void (*fp1)() __attribute__((noreturn)) = f0;
37}
38
39// No-returned function pointers
40typedef void (* noreturn_fp)() __attribute__((noreturn));
41
42void f3(noreturn_fp); // expected-note{{candidate function}}
43
44void test_f3() {
45 f3(f0); // okay
46 f3(f2); // expected-error{{no matching function for call}}
47}
Nuno Lopesf75b8302009-12-23 23:40:33 +000048
49
50class xpto {
Anders Carlsson5d1d7ae2010-09-03 00:25:02 +000051 int blah() __attribute__((noreturn));
Nuno Lopesf75b8302009-12-23 23:40:33 +000052};
53
54int xpto::blah() {
55 return 3; // expected-warning {{function 'blah' declared 'noreturn' should not return}}
56}
Douglas Gregor71074fd2012-09-13 21:56:43 +000057
58// PR12948
59
60namespace 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}