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