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 
9 // UNSUPPORTED: no-exceptions
10 
11 #include <cassert>
12 
13 struct A
14 {
AA15     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 {
BB25     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 
test1()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.
test2()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.
test3()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.
test4()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.
test5()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 
main(int,char **)167 int main(int, char**)
168 {
169     test1();
170     test2();
171     test3();
172     test4();
173     test5();
174 
175     return 0;
176 }
177