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