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
21struct A
22{
23    static int count;
24    int id_;
25    A() : id_(++count) {}
26    ~A() {assert(id_ == count--);}
27
28private:
29    A(const A&);
30    A& operator=(const A&);
31};
32
33int A::count = 0;
34
35struct B
36{
37    static int count;
38    int id_;
39    B() : id_(++count) {}
40    ~B() {assert(id_ == count--);}
41
42private:
43    B(const B&);
44    B& operator=(const B&);
45};
46
47int B::count = 0;
48
49struct C
50{
51    static int count;
52    int id_;
53    C() : id_(++count) {}
54    ~C() {assert(id_ == count--);}
55
56private:
57    C(const C&);
58    C& operator=(const C&);
59};
60
61int C::count = 0;
62
63void f2()
64{
65    C c;
66    A a;
67    throw 55;
68    B b;
69}
70
71void f1() throw (long, char, double)
72{
73    A a;
74    B b;
75    f2();
76    C c;
77}
78
79void u_handler()
80{
81    throw 'a';
82}
83
84int 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