1e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert//===--------------------- inherited_exception.cpp ------------------------===//
2e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert//
3e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert//                     The LLVM Compiler Infrastructure
4e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert//
5e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert// This file is dual licensed under the MIT and the University of Illinois Open
6e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert// Source Licenses. See LICENSE.TXT for details.
7e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert//
8e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert//===----------------------------------------------------------------------===//
9e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert//
10e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert// This test case checks specifically the cases under C++ ABI 15.3.1, and 15.3.2
11e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert//
12e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert//  C++ ABI 15.3:
13e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert//  A handler is a match for an exception object of type E if
14e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert//  /  *  The handler is of type cv T or cv T& and E and T are the same type   \
15e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert//  |     (ignoring the top-level cv-qualifiers), or                           |
16e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert//  |  *  the handler is of type cv T or cv T& and T is an unambiguous base    |
17e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert//  \     class of E, or                                                       /
18e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert//     *  the handler is of type cv1 T* cv2 and E is a pointer type that can
19e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert//        be converted to the type of the handler by either or both of
20e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert//          o  a standard pointer conversion (4.10 [conv.ptr]) not involving
21e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert//             conversions to private or protected or ambiguous classes
22e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert//          o  a qualification conversion
23e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert//     *  the handler is a pointer or pointer to member type and E is
24e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert//        std::nullptr_t
25e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert//
26e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert//===----------------------------------------------------------------------===//
27e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert
28e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert#include <assert.h>
29e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert
30e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albertstruct Base {
31e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert  int b1;
32e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert};
33e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert
34e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albertstruct Base2 {
35e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert  int b2;
36e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert};
37e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert
38e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albertstruct Child : public Base, public Base2 {
39e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert  int c;
40e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert};
41e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert
42e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albertvoid f1() {
43e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert  Child child;
44e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert  child.b1 = 10;
45e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert  child.b2 = 11;
46e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert  child.c = 12;
47e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert  throw child;
48e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert}
49e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert
50e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albertvoid f2() {
51e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert  Child child;
52e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert  child.b1 = 10;
53e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert  child.b2 = 11;
54e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert  child.c = 12;
55e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert  throw static_cast<Base2&>(child);
56e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert}
57e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert
58e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albertvoid f3() {
59e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert  Child* child  = new Child;
60e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert  child->b1 = 10;
61e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert  child->b2 = 11;
62e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert  child->c = 12;
63e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert  throw static_cast<Base2*>(child);
64e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert}
65e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert
66e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albertint main()
67e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert{
68e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert    try
69e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert    {
70e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert        f1();
71e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert        assert(false);
72e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert    }
73e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert    catch (const Child& c)
74e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert    {
75e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert        assert(true);
76e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert    }
77e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert    catch (const Base& b)
78e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert    {
79e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert        assert(false);
80e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert    }
81e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert    catch (...)
82e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert    {
83e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert        assert(false);
84e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert    }
85e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert
86e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert    try
87e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert    {
88e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert        f1();
89e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert        assert(false);
90e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert    }
91e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert    catch (const Base& c)
92e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert    {
93e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert        assert(true);
94e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert    }
95e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert    catch (const Child& b)
96e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert    {
97e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert        assert(false);
98e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert    }
99e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert    catch (...)
100e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert    {
101e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert        assert(false);
102e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert    }
103e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert
104e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert    try
105e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert    {
106e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert        f1();
107e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert        assert(false);
108e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert    }
109e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert    catch (const Base2& c)
110e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert    {
111e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert        assert(true);
112e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert    }
113e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert    catch (const Child& b)
114e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert    {
115e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert        assert(false);
116e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert    }
117e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert    catch (...)
118e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert    {
119e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert        assert(false);
120e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert    }
121e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert
122e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert    try
123e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert    {
124e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert        f2();
125e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert        assert(false);
126e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert    }
127e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert    catch (const Child& c)
128e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert    {
129e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert        assert(false);
130e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert    }
131e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert    catch (const Base& b)
132e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert    {
133e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert        assert(false);
134e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert    }
135e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert    catch (const Base2& b)
136e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert    {
137e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert        assert(true);
138e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert    }
139e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert    catch (...)
140e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert    {
141e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert        assert(false);
142e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert    }
143e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert
144e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert    try
145e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert    {
146e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert        f3();
147e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert        assert(false);
148e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert    }
149e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert    catch (const Base* c)
150e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert    {
151e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert        assert(false);
152e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert    }
153e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert    catch (const Child* b)
154e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert    {
155e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert        assert(false);
156e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert    }
157e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert    catch (const Base2* c)
158e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert    {
159e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert        assert(true);
160e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert    }
161e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert    catch (...)
162e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert    {
163e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert        assert(false);
164e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert    }
165e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert}
166