]> git.proxmox.com Git - rustc.git/blob - src/llvm/tools/clang/test/SemaCXX/attr-noreturn.cpp
Imported Upstream version 0.6
[rustc.git] / src / llvm / tools / clang / test / SemaCXX / attr-noreturn.cpp
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 }