1 //===------------------------- unwind_03.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     exit(0);
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(i == 55);
103     }
104     catch (...)
105     {
106         assert(false);
107     }
108     assert(false);
109 }
110