1dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant//===------------------------- unwind_05.cpp ------------------------------===//
2dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant//
3dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant//                     The LLVM Compiler Infrastructure
4dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant//
5dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant// This file is dual licensed under the MIT and the University of Illinois Open
6dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant// Source Licenses. See LICENSE.TXT for details.
7dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant//
8dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant//===----------------------------------------------------------------------===//
9dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant
10dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant#include <exception>
11dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant#include <stdlib.h>
12dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant#include <assert.h>
13dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant
14dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnantstruct A
15dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant{
16dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant    static int count;
17dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant    int id_;
18dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant    A() : id_(++count) {}
19dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant    ~A() {assert(id_ == count--);}
20dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant
21dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnantprivate:
22dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant    A(const A&);
23dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant    A& operator=(const A&);
24dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant};
25dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant
26dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnantint A::count = 0;
27dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant
28dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnantstruct B
29dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant{
30dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant    static int count;
31dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant    int id_;
32dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant    B() : id_(++count) {}
33dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant    ~B() {assert(id_ == count--);}
34dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant
35dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnantprivate:
36dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant    B(const B&);
37dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant    B& operator=(const B&);
38dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant};
39dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant
40dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnantint B::count = 0;
41dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant
42dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnantstruct C
43dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant{
44dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant    static int count;
45dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant    int id_;
46dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant    C() : id_(++count) {}
47dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant    ~C() {assert(id_ == count--);}
48dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant
49dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnantprivate:
50dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant    C(const C&);
51dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant    C& operator=(const C&);
52dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant};
53dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant
54dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnantint C::count = 0;
55dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant
56dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnantvoid f2()
57dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant{
58dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant    C c;
59dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant    A a;
60dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant    throw 55;
61dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant    B b;
62dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant}
63dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant
64dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnantvoid f1() throw (long, char, double, std::bad_exception)
65dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant{
66dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant    A a;
67dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant    B b;
68dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant    f2();
69dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant    C c;
70dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant}
71dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant
72dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnantvoid u_handler()
73dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant{
74dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant    throw;
75dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant}
76dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant
77dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnantint main()
78dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant{
79dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant    std::set_unexpected(u_handler);
80dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant    try
81dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant    {
82dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant        f1();
83dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant        assert(false);
84dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant    }
85dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant    catch (int* i)
86dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant    {
87dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant        assert(false);
88dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant    }
89dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant    catch (long i)
90dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant    {
91dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant        assert(false);
92dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant    }
93dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant    catch (int i)
94dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant    {
95dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant        assert(false);
96dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant    }
97dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant    catch (char c)
98dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant    {
99dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant        assert(false);
100dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant    }
101dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant    catch (const std::bad_exception& e)
102dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant    {
103dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant        assert(true);
104dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant    }
105dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant    catch (...)
106dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant    {
107dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant        assert(false);
108dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant    }
109dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant    assert(A::count == 0);
110dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant    assert(B::count == 0);
111dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant    assert(C::count == 0);
112dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant}
113