comparison libcxxabi/test/unwind_01.pass.cpp @ 150:1d019706d866

LLVM10
author anatofuz
date Thu, 13 Feb 2020 15:10:13 +0900
parents
children 0572611fdcc8
comparison
equal deleted inserted replaced
147:c2174574ed3a 150:1d019706d866
1 //===------------------------- unwind_01.cpp ------------------------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8
9 // UNSUPPORTED: libcxxabi-no-exceptions
10
11 #include <assert.h>
12
13 #if defined(__GNUC__)
14 #pragma GCC diagnostic ignored "-Wunreachable-code"
15 #endif
16
17 struct A
18 {
19 static int count;
20 int id_;
21 A() : id_(++count) {}
22 ~A() {assert(id_ == count--);}
23
24 private:
25 A(const A&);
26 A& operator=(const A&);
27 };
28
29 int A::count = 0;
30
31 struct B
32 {
33 static int count;
34 int id_;
35 B() : id_(++count) {}
36 ~B() {assert(id_ == count--);}
37
38 private:
39 B(const B&);
40 B& operator=(const B&);
41 };
42
43 int B::count = 0;
44
45 struct C
46 {
47 static int count;
48 int id_;
49 C() : id_(++count) {}
50 ~C() {assert(id_ == count--);}
51
52 private:
53 C(const C&);
54 C& operator=(const C&);
55 };
56
57 int C::count = 0;
58
59 void f2()
60 {
61 C c;
62 A a;
63 throw 55;
64 B b;
65 }
66
67 void f1()
68 {
69 A a;
70 B b;
71 f2();
72 C c;
73 }
74
75 int main()
76 {
77 try
78 {
79 f1();
80 assert(false);
81 }
82 catch (int* i)
83 {
84 assert(false);
85 }
86 catch (long i)
87 {
88 assert(false);
89 }
90 catch (int i)
91 {
92 assert(i == 55);
93 }
94 catch (...)
95 {
96 assert(false);
97 }
98 assert(A::count == 0);
99 assert(B::count == 0);
100 assert(C::count == 0);
101 }