annotate libcxxabi/test/catch_member_function_pointer_01.pass.cpp @ 192:d7606dcf6fce

Added tag llvm10 for changeset 0572611fdcc8
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 14 Dec 2020 18:01:34 +0900
parents 0572611fdcc8
children 2e18cbf3894f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
150
anatofuz
parents:
diff changeset
1 //===--------------- catch_member_function_pointer_01.cpp -----------------===//
anatofuz
parents:
diff changeset
2 //
anatofuz
parents:
diff changeset
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
anatofuz
parents:
diff changeset
4 // See https://llvm.org/LICENSE.txt for license information.
anatofuz
parents:
diff changeset
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
anatofuz
parents:
diff changeset
6 //
anatofuz
parents:
diff changeset
7 //===----------------------------------------------------------------------===//
anatofuz
parents:
diff changeset
8
anatofuz
parents:
diff changeset
9 // GCC incorrectly allows PMF type "void (T::*)()" to be caught as "void (T::*)() const"
anatofuz
parents:
diff changeset
10 // See https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69375
anatofuz
parents:
diff changeset
11 // XFAIL: gcc
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
12 // UNSUPPORTED: no-exceptions
150
anatofuz
parents:
diff changeset
13 #include <cassert>
anatofuz
parents:
diff changeset
14
anatofuz
parents:
diff changeset
15 struct A
anatofuz
parents:
diff changeset
16 {
anatofuz
parents:
diff changeset
17 void foo() {}
anatofuz
parents:
diff changeset
18 void bar() const {}
anatofuz
parents:
diff changeset
19 };
anatofuz
parents:
diff changeset
20
anatofuz
parents:
diff changeset
21 typedef void (A::*mf1)();
anatofuz
parents:
diff changeset
22 typedef void (A::*mf2)() const;
anatofuz
parents:
diff changeset
23
anatofuz
parents:
diff changeset
24 struct B : public A
anatofuz
parents:
diff changeset
25 {
anatofuz
parents:
diff changeset
26 };
anatofuz
parents:
diff changeset
27
anatofuz
parents:
diff changeset
28 typedef void (B::*dmf1)();
anatofuz
parents:
diff changeset
29 typedef void (B::*dmf2)() const;
anatofuz
parents:
diff changeset
30
anatofuz
parents:
diff changeset
31 template <class Tp>
anatofuz
parents:
diff changeset
32 bool can_convert(Tp) { return true; }
anatofuz
parents:
diff changeset
33
anatofuz
parents:
diff changeset
34 template <class>
anatofuz
parents:
diff changeset
35 bool can_convert(...) { return false; }
anatofuz
parents:
diff changeset
36
anatofuz
parents:
diff changeset
37
anatofuz
parents:
diff changeset
38 void test1()
anatofuz
parents:
diff changeset
39 {
anatofuz
parents:
diff changeset
40 try
anatofuz
parents:
diff changeset
41 {
anatofuz
parents:
diff changeset
42 throw &A::foo;
anatofuz
parents:
diff changeset
43 assert(false);
anatofuz
parents:
diff changeset
44 }
anatofuz
parents:
diff changeset
45 catch (mf2)
anatofuz
parents:
diff changeset
46 {
anatofuz
parents:
diff changeset
47 assert(false);
anatofuz
parents:
diff changeset
48 }
anatofuz
parents:
diff changeset
49 catch (mf1)
anatofuz
parents:
diff changeset
50 {
anatofuz
parents:
diff changeset
51 }
anatofuz
parents:
diff changeset
52 }
anatofuz
parents:
diff changeset
53
anatofuz
parents:
diff changeset
54 void test2()
anatofuz
parents:
diff changeset
55 {
anatofuz
parents:
diff changeset
56 try
anatofuz
parents:
diff changeset
57 {
anatofuz
parents:
diff changeset
58 throw &A::bar;
anatofuz
parents:
diff changeset
59 assert(false);
anatofuz
parents:
diff changeset
60 }
anatofuz
parents:
diff changeset
61 catch (mf1)
anatofuz
parents:
diff changeset
62 {
anatofuz
parents:
diff changeset
63 assert(false);
anatofuz
parents:
diff changeset
64 }
anatofuz
parents:
diff changeset
65 catch (mf2)
anatofuz
parents:
diff changeset
66 {
anatofuz
parents:
diff changeset
67 }
anatofuz
parents:
diff changeset
68 }
anatofuz
parents:
diff changeset
69
anatofuz
parents:
diff changeset
70
anatofuz
parents:
diff changeset
71
anatofuz
parents:
diff changeset
72 void test_derived()
anatofuz
parents:
diff changeset
73 {
anatofuz
parents:
diff changeset
74 try
anatofuz
parents:
diff changeset
75 {
anatofuz
parents:
diff changeset
76 throw (mf1)0;
anatofuz
parents:
diff changeset
77 assert(false);
anatofuz
parents:
diff changeset
78 }
anatofuz
parents:
diff changeset
79 catch (dmf2)
anatofuz
parents:
diff changeset
80 {
anatofuz
parents:
diff changeset
81 assert(false);
anatofuz
parents:
diff changeset
82 }
anatofuz
parents:
diff changeset
83 catch (dmf1)
anatofuz
parents:
diff changeset
84 {
anatofuz
parents:
diff changeset
85 assert(false);
anatofuz
parents:
diff changeset
86 }
anatofuz
parents:
diff changeset
87 catch (mf1)
anatofuz
parents:
diff changeset
88 {
anatofuz
parents:
diff changeset
89 }
anatofuz
parents:
diff changeset
90
anatofuz
parents:
diff changeset
91 try
anatofuz
parents:
diff changeset
92 {
anatofuz
parents:
diff changeset
93 throw (mf2)0;
anatofuz
parents:
diff changeset
94 assert(false);
anatofuz
parents:
diff changeset
95 }
anatofuz
parents:
diff changeset
96 catch (dmf1)
anatofuz
parents:
diff changeset
97 {
anatofuz
parents:
diff changeset
98 assert(false);
anatofuz
parents:
diff changeset
99 }
anatofuz
parents:
diff changeset
100 catch (dmf2)
anatofuz
parents:
diff changeset
101 {
anatofuz
parents:
diff changeset
102 assert(false);
anatofuz
parents:
diff changeset
103 }
anatofuz
parents:
diff changeset
104 catch (mf2)
anatofuz
parents:
diff changeset
105 {
anatofuz
parents:
diff changeset
106 }
anatofuz
parents:
diff changeset
107
anatofuz
parents:
diff changeset
108 assert(!can_convert<mf1>((dmf1)0));
anatofuz
parents:
diff changeset
109 assert(!can_convert<mf2>((dmf1)0));
anatofuz
parents:
diff changeset
110 try
anatofuz
parents:
diff changeset
111 {
anatofuz
parents:
diff changeset
112 throw (dmf1)0;
anatofuz
parents:
diff changeset
113 assert(false);
anatofuz
parents:
diff changeset
114 }
anatofuz
parents:
diff changeset
115 catch (mf2)
anatofuz
parents:
diff changeset
116 {
anatofuz
parents:
diff changeset
117 assert(false);
anatofuz
parents:
diff changeset
118 }
anatofuz
parents:
diff changeset
119 catch (mf1)
anatofuz
parents:
diff changeset
120 {
anatofuz
parents:
diff changeset
121 assert(false);
anatofuz
parents:
diff changeset
122 }
anatofuz
parents:
diff changeset
123 catch (...)
anatofuz
parents:
diff changeset
124 {
anatofuz
parents:
diff changeset
125 }
anatofuz
parents:
diff changeset
126
anatofuz
parents:
diff changeset
127 assert(!can_convert<mf1>((dmf2)0));
anatofuz
parents:
diff changeset
128 assert(!can_convert<mf2>((dmf2)0));
anatofuz
parents:
diff changeset
129 try
anatofuz
parents:
diff changeset
130 {
anatofuz
parents:
diff changeset
131 throw (dmf2)0;
anatofuz
parents:
diff changeset
132 assert(false);
anatofuz
parents:
diff changeset
133 }
anatofuz
parents:
diff changeset
134 catch (mf2)
anatofuz
parents:
diff changeset
135 {
anatofuz
parents:
diff changeset
136 assert(false);
anatofuz
parents:
diff changeset
137 }
anatofuz
parents:
diff changeset
138 catch (mf1)
anatofuz
parents:
diff changeset
139 {
anatofuz
parents:
diff changeset
140 assert(false);
anatofuz
parents:
diff changeset
141 }
anatofuz
parents:
diff changeset
142 catch (...)
anatofuz
parents:
diff changeset
143 {
anatofuz
parents:
diff changeset
144 }
anatofuz
parents:
diff changeset
145 }
anatofuz
parents:
diff changeset
146
anatofuz
parents:
diff changeset
147 void test_void()
anatofuz
parents:
diff changeset
148 {
anatofuz
parents:
diff changeset
149 assert(!can_convert<void*>(&A::foo));
anatofuz
parents:
diff changeset
150 try
anatofuz
parents:
diff changeset
151 {
anatofuz
parents:
diff changeset
152 throw &A::foo;
anatofuz
parents:
diff changeset
153 assert(false);
anatofuz
parents:
diff changeset
154 }
anatofuz
parents:
diff changeset
155 catch (void*)
anatofuz
parents:
diff changeset
156 {
anatofuz
parents:
diff changeset
157 assert(false);
anatofuz
parents:
diff changeset
158 }
anatofuz
parents:
diff changeset
159 catch(...)
anatofuz
parents:
diff changeset
160 {
anatofuz
parents:
diff changeset
161 }
anatofuz
parents:
diff changeset
162 }
anatofuz
parents:
diff changeset
163
anatofuz
parents:
diff changeset
164 int main()
anatofuz
parents:
diff changeset
165 {
anatofuz
parents:
diff changeset
166 test1();
anatofuz
parents:
diff changeset
167 test2();
anatofuz
parents:
diff changeset
168 test_derived();
anatofuz
parents:
diff changeset
169 test_void();
anatofuz
parents:
diff changeset
170 }