1 // RUN: %clang_cc1 -fcxx-exceptions -fexceptions -fsyntax-only -verify %s
2 
3 struct A; // expected-note 4 {{forward declaration of 'A'}}
4 
5 struct Abstract { virtual void f() = 0; }; // expected-note {{unimplemented pure virtual method 'f'}}
6 
7 void trys() {
8   try {
9   } catch(int i) { // expected-note {{previous definition}}
10     int j = i;
11     int i; // expected-error {{redefinition of 'i'}}
12   } catch(float i) {
13   } catch(void v) { // expected-error {{cannot catch incomplete type 'void'}}
14   } catch(A a) { // expected-error {{cannot catch incomplete type 'A'}}
15   } catch(A *a) { // expected-error {{cannot catch pointer to incomplete type 'A'}}
16   } catch(A &a) { // expected-error {{cannot catch reference to incomplete type 'A'}}
17   } catch(Abstract) { // expected-error {{variable type 'Abstract' is an abstract class}}
18   } catch(...) {
19     int j = i; // expected-error {{use of undeclared identifier 'i'}}
20   }
21 
22   try {
23   } catch(...) { // expected-error {{catch-all handler must come last}}
24   } catch(int) {
25   }
26 }
27 
28 void throws() {
29   throw;
30   throw 0;
31   throw throw; // expected-error {{cannot throw object of incomplete type 'void'}}
32   throw (A*)0; // expected-error {{cannot throw pointer to object of incomplete type 'A'}}
33 }
34 
35 void jumps() {
36 l1:
37   goto l5;
38   goto l4; // expected-error {{goto into protected scope}}
39   goto l3; // expected-error {{goto into protected scope}}
40   goto l2; // expected-error {{goto into protected scope}}
41   goto l1;
42   try { // expected-note 4 {{jump bypasses initialization of try block}}
43   l2:
44     goto l5;
45     goto l4; // expected-error {{goto into protected scope}}
46     goto l3; // expected-error {{goto into protected scope}}
47     goto l2;
48     goto l1;
49   } catch(int) { // expected-note 4 {{jump bypasses initialization of catch block}}
50   l3:
51     goto l5;
52     goto l4; // expected-error {{goto into protected scope}}
53     goto l3;
54     goto l2; // expected-error {{goto into protected scope}}
55     goto l1;
56   } catch(...) { // expected-note 4 {{jump bypasses initialization of catch block}}
57   l4:
58     goto l5;
59     goto l4;
60     goto l3; // expected-error {{goto into protected scope}}
61     goto l2; // expected-error {{goto into protected scope}}
62     goto l1;
63   }
64 l5:
65   goto l5;
66   goto l4; // expected-error {{goto into protected scope}}
67   goto l3; // expected-error {{goto into protected scope}}
68   goto l2; // expected-error {{goto into protected scope}}
69   goto l1;
70 }
71 
72 struct BadReturn {
73   BadReturn() try {
74   } catch(...) {
75     // Try to hide
76     try {
77     } catch(...) {
78       {
79         if (0)
80           return; // expected-error {{return in the catch of a function try block of a constructor is illegal}}
81       }
82     }
83   }
84   BadReturn(int);
85 };
86 
87 BadReturn::BadReturn(int) try {
88 } catch(...) {
89   // Try to hide
90   try {
91   } catch(int) {
92     return; // expected-error {{return in the catch of a function try block of a constructor is illegal}}
93   } catch(...) {
94     {
95       if (0)
96         return; // expected-error {{return in the catch of a function try block of a constructor is illegal}}
97     }
98   }
99 }
100 
101 // Cannot throw an abstract type.
102 class foo {
103 public:
104   foo() {}
105   void bar () {
106     throw *this; // expected-error{{cannot throw an object of abstract type 'foo'}}
107   }
108   virtual void test () = 0; // expected-note{{unimplemented pure virtual method 'test'}}
109 };
110 
111 namespace PR6831 {
112   namespace NA { struct S; }
113   namespace NB { struct S; }
114 
115   void f() {
116     using namespace NA;
117     using namespace NB;
118     try {
119     } catch (int S) {
120     }
121   }
122 }
123 
124 namespace Decay {
125   struct A {
126     void f() throw (A[10]);
127   };
128 
129   template<typename T> struct B {
130     void f() throw (B[10]);
131   };
132   template struct B<int>;
133 
134   void f() throw (int[10], int(*)());
135   void f() throw (int*, int());
136 
137   template<typename T> struct C {
138     void f() throw (T); // expected-error {{pointer to incomplete type 'Decay::E' is not allowed in exception specification}}
139   };
140   struct D {
141     C<D[10]> c;
142   };
143   struct E; // expected-note {{forward declaration}}
144   C<E[10]> e; // expected-note {{in instantiation of}}
145 }
146 
147 void rval_ref() throw (int &&); // expected-error {{rvalue reference type 'int &&' is not allowed in exception specification}} expected-warning {{C++11}}
148