Home | History | Annotate | Download | only in test
      1 //===------------------------- unwind_01.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 
     12 #include <assert.h>
     13 
     14 #if defined(__GNUC__)
     15 #pragma GCC diagnostic ignored "-Wunreachable-code"
     16 #endif
     17 
     18 struct A
     19 {
     20     static int count;
     21     int id_;
     22     A() : id_(++count) {}
     23     ~A() {assert(id_ == count--);}
     24 
     25 private:
     26     A(const A&);
     27     A& operator=(const A&);
     28 };
     29 
     30 int A::count = 0;
     31 
     32 struct B
     33 {
     34     static int count;
     35     int id_;
     36     B() : id_(++count) {}
     37     ~B() {assert(id_ == count--);}
     38 
     39 private:
     40     B(const B&);
     41     B& operator=(const B&);
     42 };
     43 
     44 int B::count = 0;
     45 
     46 struct C
     47 {
     48     static int count;
     49     int id_;
     50     C() : id_(++count) {}
     51     ~C() {assert(id_ == count--);}
     52 
     53 private:
     54     C(const C&);
     55     C& operator=(const C&);
     56 };
     57 
     58 int C::count = 0;
     59 
     60 void f2()
     61 {
     62     C c;
     63     A a;
     64     throw 55;
     65     B b;
     66 }
     67 
     68 void f1()
     69 {
     70     A a;
     71     B b;
     72     f2();
     73     C c;
     74 }
     75 
     76 int main()
     77 {
     78     try
     79     {
     80         f1();
     81         assert(false);
     82     }
     83     catch (int* i)
     84     {
     85         assert(false);
     86     }
     87     catch (long i)
     88     {
     89         assert(false);
     90     }
     91     catch (int i)
     92     {
     93         assert(i == 55);
     94     }
     95     catch (...)
     96     {
     97         assert(false);
     98     }
     99     assert(A::count == 0);
    100     assert(B::count == 0);
    101     assert(C::count == 0);
    102 }
    103