]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - test/SemaCXX/warn-missing-noreturn.cpp
Vendor import of clang trunk r162107:
[FreeBSD/FreeBSD.git] / test / SemaCXX / warn-missing-noreturn.cpp
1 // RUN: %clang_cc1 -fsyntax-only -verify %s -Wmissing-noreturn -Wreturn-type
2 void f() __attribute__((noreturn));
3
4 template<typename T> void g(T) {
5   f();
6 }
7
8 template void g<int>(int);
9
10 template<typename T> struct A {
11   void g() {
12     f();
13   }
14 };
15
16 template struct A<int>;
17
18 struct B {
19   template<typename T> void g(T) {
20     f();
21   }
22 };
23
24 template void B::g<int>(int);
25
26 // We don't want a warning here.
27 struct X {
28   virtual void g() { f(); }
29 };
30
31 namespace test1 {
32   bool condition();
33
34   // We don't want a warning here.
35   void foo() {
36     while (condition()) {}
37   }
38 }
39
40
41 // <rdar://problem/7880658> - This test case previously had a false "missing return"
42 // warning.
43 struct R7880658 {
44   R7880658 &operator++();
45   bool operator==(const R7880658 &) const;
46   bool operator!=(const R7880658 &) const;
47 };
48
49 void f_R7880658(R7880658 f, R7880658 l) {  // no-warning
50   for (; f != l; ++f) {
51   }
52 }
53
54 namespace test2 {
55
56   bool g();
57   void *h() __attribute__((noreturn));
58   void *j();
59
60   struct A {
61     void *f;
62
63     A() : f(0) { }
64     A(int) : f(h()) { } // expected-warning {{function 'A' could be declared with attribute 'noreturn'}}
65     A(char) : f(j()) { }
66     A(bool b) : f(b ? h() : j()) { }
67   };
68 }
69
70 namespace test3 {
71   struct A {
72     ~A();
73   };
74
75   struct B {
76     ~B() { }
77
78     A a;
79   };
80
81   struct C : A { 
82     ~C() { }
83   };
84 }
85
86 // <rdar://problem/8875247> - Properly handle CFGs with destructors.
87 struct rdar8875247 {
88   ~rdar8875247 ();
89 };
90 void rdar8875247_aux();
91
92 int rdar8875247_test() {
93   rdar8875247 f;
94 } // expected-warning{{control reaches end of non-void function}}
95
96 struct rdar8875247_B {
97   rdar8875247_B();
98   ~rdar8875247_B();
99 };
100
101 rdar8875247_B test_rdar8875247_B() {
102   rdar8875247_B f;
103   return f;
104 } // no-warning
105
106 namespace PR10801 {
107   struct Foo {
108     void wibble() __attribute((__noreturn__));
109   };
110
111   struct Bar {
112     void wibble();
113   };
114
115   template <typename T> void thingy(T thing) {
116     thing.wibble();
117   }
118
119   void test() {
120     Foo f;
121     Bar b;
122     thingy(f);
123     thingy(b);
124   }
125 }