Home | History | Annotate | Download | only in test
      1 //===------------------------- unwind_02.cpp ------------------------------===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is dual licensed under the MIT and the University of Illinois Open
      6 // Source Licenses. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 
     10 // UNSUPPORTED: libcxxabi-no-exceptions
     11 // REQUIRES: c++98 || c++03 || c++11 || c++14
     12 
     13 #include <assert.h>
     14 
     15 #if defined(__GNUC__)
     16 #pragma GCC diagnostic ignored "-Wunreachable-code"
     17 #endif
     18 
     19 struct A
     20 {
     21     static int count;
     22     int id_;
     23     A() : id_(++count) {}
     24     ~A() {assert(id_ == count--);}
     25 
     26 private:
     27     A(const A&);
     28     A& operator=(const A&);
     29 };
     30 
     31 int A::count = 0;
     32 
     33 struct B
     34 {
     35     static int count;
     36     int id_;
     37     B() : id_(++count) {}
     38     ~B() {assert(id_ == count--);}
     39 
     40 private:
     41     B(const B&);
     42     B& operator=(const B&);
     43 };
     44 
     45 int B::count = 0;
     46 
     47 struct C
     48 {
     49     static int count;
     50     int id_;
     51     C() : id_(++count) {}
     52     ~C() {assert(id_ == count--);}
     53 
     54 private:
     55     C(const C&);
     56     C& operator=(const C&);
     57 };
     58 
     59 int C::count = 0;
     60 
     61 void f2()
     62 {
     63     C c;
     64     A a;
     65     throw 55;
     66     B b;
     67 }
     68 
     69 void f1() throw (long, char, int, double)
     70 {
     71     A a;
     72     B b;
     73     f2();
     74     C c;
     75 }
     76 
     77 int main()
     78 {
     79     try
     80     {
     81         f1();
     82         assert(false);
     83     }
     84     catch (int* i)
     85     {
     86         assert(false);
     87     }
     88     catch (long i)
     89     {
     90         assert(false);
     91     }
     92     catch (int i)
     93     {
     94         assert(i == 55);
     95     }
     96     catch (...)
     97     {
     98         assert(false);
     99     }
    100     assert(A::count == 0);
    101     assert(B::count == 0);
    102     assert(C::count == 0);
    103 }
    104