xref: /llvm-project/libcxxabi/test/unwind_05.pass.cpp (revision eb8650a75793b2bd079d0c8901ff066f129061da)
1*eb8650a7SLouis Dionne //===----------------------------------------------------------------------===//
2ac18e063SSaleem Abdulrasool //
357b08b09SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
457b08b09SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
557b08b09SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6ac18e063SSaleem Abdulrasool //
7ac18e063SSaleem Abdulrasool //===----------------------------------------------------------------------===//
8ac18e063SSaleem Abdulrasool 
98c61114cSLouis Dionne // UNSUPPORTED: no-exceptions
1031cbe0f2SLouis Dionne // REQUIRES: c++03 || c++11 || c++14
1157e446daSAsiri Rathnayake 
12ac18e063SSaleem Abdulrasool #include <exception>
13ac18e063SSaleem Abdulrasool #include <stdlib.h>
14ac18e063SSaleem Abdulrasool #include <assert.h>
15ac18e063SSaleem Abdulrasool 
1647570b8dSEric Fiselier #if defined(__GNUC__)
1747570b8dSEric Fiselier #pragma GCC diagnostic ignored "-Wunreachable-code"
18851a335bSLouis Dionne #pragma GCC diagnostic ignored "-Wdeprecated" // dynamic exception specifications are deprecated
1947570b8dSEric Fiselier #endif
2047570b8dSEric Fiselier 
21ac18e063SSaleem Abdulrasool struct A
22ac18e063SSaleem Abdulrasool {
23ac18e063SSaleem Abdulrasool     static int count;
24ac18e063SSaleem Abdulrasool     int id_;
AA25ac18e063SSaleem Abdulrasool     A() : id_(++count) {}
~AA26ac18e063SSaleem Abdulrasool     ~A() {assert(id_ == count--);}
27ac18e063SSaleem Abdulrasool 
28ac18e063SSaleem Abdulrasool private:
29ac18e063SSaleem Abdulrasool     A(const A&);
30ac18e063SSaleem Abdulrasool     A& operator=(const A&);
31ac18e063SSaleem Abdulrasool };
32ac18e063SSaleem Abdulrasool 
33ac18e063SSaleem Abdulrasool int A::count = 0;
34ac18e063SSaleem Abdulrasool 
35ac18e063SSaleem Abdulrasool struct B
36ac18e063SSaleem Abdulrasool {
37ac18e063SSaleem Abdulrasool     static int count;
38ac18e063SSaleem Abdulrasool     int id_;
BB39ac18e063SSaleem Abdulrasool     B() : id_(++count) {}
~BB40ac18e063SSaleem Abdulrasool     ~B() {assert(id_ == count--);}
41ac18e063SSaleem Abdulrasool 
42ac18e063SSaleem Abdulrasool private:
43ac18e063SSaleem Abdulrasool     B(const B&);
44ac18e063SSaleem Abdulrasool     B& operator=(const B&);
45ac18e063SSaleem Abdulrasool };
46ac18e063SSaleem Abdulrasool 
47ac18e063SSaleem Abdulrasool int B::count = 0;
48ac18e063SSaleem Abdulrasool 
49ac18e063SSaleem Abdulrasool struct C
50ac18e063SSaleem Abdulrasool {
51ac18e063SSaleem Abdulrasool     static int count;
52ac18e063SSaleem Abdulrasool     int id_;
CC53ac18e063SSaleem Abdulrasool     C() : id_(++count) {}
~CC54ac18e063SSaleem Abdulrasool     ~C() {assert(id_ == count--);}
55ac18e063SSaleem Abdulrasool 
56ac18e063SSaleem Abdulrasool private:
57ac18e063SSaleem Abdulrasool     C(const C&);
58ac18e063SSaleem Abdulrasool     C& operator=(const C&);
59ac18e063SSaleem Abdulrasool };
60ac18e063SSaleem Abdulrasool 
61ac18e063SSaleem Abdulrasool int C::count = 0;
62ac18e063SSaleem Abdulrasool 
f2()63ac18e063SSaleem Abdulrasool void f2()
64ac18e063SSaleem Abdulrasool {
65ac18e063SSaleem Abdulrasool     C c;
66ac18e063SSaleem Abdulrasool     A a;
67ac18e063SSaleem Abdulrasool     throw 55;
68ac18e063SSaleem Abdulrasool     B b;
69ac18e063SSaleem Abdulrasool }
70ac18e063SSaleem Abdulrasool 
f1()71ac18e063SSaleem Abdulrasool void f1() throw (long, char, double, std::bad_exception)
72ac18e063SSaleem Abdulrasool {
73ac18e063SSaleem Abdulrasool     A a;
74ac18e063SSaleem Abdulrasool     B b;
75ac18e063SSaleem Abdulrasool     f2();
76ac18e063SSaleem Abdulrasool     C c;
77ac18e063SSaleem Abdulrasool }
78ac18e063SSaleem Abdulrasool 
u_handler()79ac18e063SSaleem Abdulrasool void u_handler()
80ac18e063SSaleem Abdulrasool {
81ac18e063SSaleem Abdulrasool     throw;
82ac18e063SSaleem Abdulrasool }
83ac18e063SSaleem Abdulrasool 
main(int,char **)84504bc07dSLouis Dionne int main(int, char**)
85ac18e063SSaleem Abdulrasool {
86ac18e063SSaleem Abdulrasool     std::set_unexpected(u_handler);
87ac18e063SSaleem Abdulrasool     try
88ac18e063SSaleem Abdulrasool     {
89ac18e063SSaleem Abdulrasool         f1();
90ac18e063SSaleem Abdulrasool         assert(false);
91ac18e063SSaleem Abdulrasool     }
92ac18e063SSaleem Abdulrasool     catch (int* i)
93ac18e063SSaleem Abdulrasool     {
94ac18e063SSaleem Abdulrasool         assert(false);
95ac18e063SSaleem Abdulrasool     }
96ac18e063SSaleem Abdulrasool     catch (long i)
97ac18e063SSaleem Abdulrasool     {
98ac18e063SSaleem Abdulrasool         assert(false);
99ac18e063SSaleem Abdulrasool     }
100ac18e063SSaleem Abdulrasool     catch (int i)
101ac18e063SSaleem Abdulrasool     {
102ac18e063SSaleem Abdulrasool         assert(false);
103ac18e063SSaleem Abdulrasool     }
104ac18e063SSaleem Abdulrasool     catch (char c)
105ac18e063SSaleem Abdulrasool     {
106ac18e063SSaleem Abdulrasool         assert(false);
107ac18e063SSaleem Abdulrasool     }
108ac18e063SSaleem Abdulrasool     catch (const std::bad_exception& e)
109ac18e063SSaleem Abdulrasool     {
110ac18e063SSaleem Abdulrasool         assert(true);
111ac18e063SSaleem Abdulrasool     }
112ac18e063SSaleem Abdulrasool     catch (...)
113ac18e063SSaleem Abdulrasool     {
114ac18e063SSaleem Abdulrasool         assert(false);
115ac18e063SSaleem Abdulrasool     }
116ac18e063SSaleem Abdulrasool     assert(A::count == 0);
117ac18e063SSaleem Abdulrasool     assert(B::count == 0);
118ac18e063SSaleem Abdulrasool     assert(C::count == 0);
119504bc07dSLouis Dionne 
120504bc07dSLouis Dionne     return 0;
121ac18e063SSaleem Abdulrasool }
122