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-warning {{ISO C++ forbids catching a pointer to incomplete type 'A'}} 16 } catch(A &a) { // expected-warning {{ISO C++ forbids catching a 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 {{illegal goto into protected scope}} 39 goto l3; // expected-error {{illegal goto into protected scope}} 40 goto l2; // expected-error {{illegal 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 {{illegal goto into protected scope}} 46 goto l3; // expected-error {{illegal 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 {{illegal goto into protected scope}} 53 goto l3; 54 goto l2; // expected-error {{illegal 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 {{illegal goto into protected scope}} 61 goto l2; // expected-error {{illegal goto into protected scope}} 62 goto l1; 63 } 64 l5: 65 goto l5; 66 goto l4; // expected-error {{illegal goto into protected scope}} 67 goto l3; // expected-error {{illegal goto into protected scope}} 68 goto l2; // expected-error {{illegal 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