150
|
1 //===----------------- catch_member_data_pointer_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
|
173
|
9 // UNSUPPORTED: no-exceptions
|
150
|
10
|
|
11 #include <cassert>
|
|
12
|
|
13 struct A
|
|
14 {
|
|
15 A() : i(0), j(0) {} // explicitly initialize 'i' to prevent warnings
|
|
16 const int i;
|
|
17 int j;
|
|
18 };
|
|
19
|
|
20 typedef const int A::*md1;
|
|
21 typedef int A::*md2;
|
|
22
|
|
23 struct B : public A
|
|
24 {
|
|
25 B() : k(0), l(0) {} // explicitly initialize 'k' to prevent warnings.
|
|
26 const int k;
|
|
27 int l;
|
|
28 };
|
|
29
|
|
30 typedef const int B::*der1;
|
|
31 typedef int B::*der2;
|
|
32
|
|
33 void test1()
|
|
34 {
|
|
35 try
|
|
36 {
|
|
37 throw &A::i;
|
|
38 assert(false);
|
|
39 }
|
|
40 catch (md2)
|
|
41 {
|
|
42 assert(false);
|
|
43 }
|
|
44 catch (md1)
|
|
45 {
|
|
46 }
|
|
47 }
|
|
48
|
|
49 // Check that cv qualified conversions are allowed.
|
|
50 void test2()
|
|
51 {
|
|
52 try
|
|
53 {
|
|
54 throw &A::j;
|
|
55 }
|
|
56 catch (md2)
|
|
57 {
|
|
58 }
|
|
59 catch (...)
|
|
60 {
|
|
61 assert(false);
|
|
62 }
|
|
63
|
|
64 try
|
|
65 {
|
|
66 throw &A::j;
|
|
67 assert(false);
|
|
68 }
|
|
69 catch (md1)
|
|
70 {
|
|
71 }
|
|
72 catch (...)
|
|
73 {
|
|
74 assert(false);
|
|
75 }
|
|
76 }
|
|
77
|
|
78 // Check that Base -> Derived conversions are NOT allowed.
|
|
79 void test3()
|
|
80 {
|
|
81 try
|
|
82 {
|
|
83 throw &A::i;
|
|
84 assert(false);
|
|
85 }
|
|
86 catch (md2)
|
|
87 {
|
|
88 assert(false);
|
|
89 }
|
|
90 catch (der2)
|
|
91 {
|
|
92 assert(false);
|
|
93 }
|
|
94 catch (der1)
|
|
95 {
|
|
96 assert(false);
|
|
97 }
|
|
98 catch (md1)
|
|
99 {
|
|
100 }
|
|
101 }
|
|
102
|
|
103 // Check that Base -> Derived conversions NOT are allowed with different cv
|
|
104 // qualifiers.
|
|
105 void test4()
|
|
106 {
|
|
107 try
|
|
108 {
|
|
109 throw &A::j;
|
|
110 assert(false);
|
|
111 }
|
|
112 catch (der2)
|
|
113 {
|
|
114 assert(false);
|
|
115 }
|
|
116 catch (der1)
|
|
117 {
|
|
118 assert(false);
|
|
119 }
|
|
120 catch (md2)
|
|
121 {
|
|
122 }
|
|
123 catch (...)
|
|
124 {
|
|
125 assert(false);
|
|
126 }
|
|
127 }
|
|
128
|
|
129 // Check that no Derived -> Base conversions are allowed.
|
|
130 void test5()
|
|
131 {
|
|
132 try
|
|
133 {
|
|
134 throw &B::k;
|
|
135 assert(false);
|
|
136 }
|
|
137 catch (md1)
|
|
138 {
|
|
139 assert(false);
|
|
140 }
|
|
141 catch (md2)
|
|
142 {
|
|
143 assert(false);
|
|
144 }
|
|
145 catch (der1)
|
|
146 {
|
|
147 }
|
|
148
|
|
149 try
|
|
150 {
|
|
151 throw &B::l;
|
|
152 assert(false);
|
|
153 }
|
|
154 catch (md1)
|
|
155 {
|
|
156 assert(false);
|
|
157 }
|
|
158 catch (md2)
|
|
159 {
|
|
160 assert(false);
|
|
161 }
|
|
162 catch (der2)
|
|
163 {
|
|
164 }
|
|
165 }
|
|
166
|
|
167 int main()
|
|
168 {
|
|
169 test1();
|
|
170 test2();
|
|
171 test3();
|
|
172 test4();
|
|
173 test5();
|
|
174 }
|