Home | History | Annotate | Download | only in SemaCXX
      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