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