blob: 2c6e1d62190dd66729ca5979c3144fea1dc77604 [file] [log] [blame]
Saleem Abdulrasoolb8771592015-04-24 20:20:54 +00001//===------------------------- 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
Asiri Rathnayake4174e8b2016-05-31 12:01:32 +000010// UNSUPPORTED: libcxxabi-no-exceptions
Eric Fiselier279d6482017-01-24 10:28:23 +000011// REQUIRES: c++98 || c++03 || c++11 || c++14
Asiri Rathnayake4174e8b2016-05-31 12:01:32 +000012
Saleem Abdulrasoolb8771592015-04-24 20:20:54 +000013#include <assert.h>
14
Eric Fiseliera3f48932016-12-24 05:01:55 +000015#if defined(__GNUC__)
16#pragma GCC diagnostic ignored "-Wunreachable-code"
17#endif
18
Saleem Abdulrasoolb8771592015-04-24 20:20:54 +000019struct 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}