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