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