annotate libcxxabi/test/catch_member_function_pointer_02.pass.cpp @ 266:00f31e85ec16 default tip

Added tag current for changeset 31d058e83c98
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Sat, 14 Oct 2023 10:13:55 +0900
parents 1f2b6ac9f198
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
1 //===----------------------------------------------------------------------===//
150
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
223
5f17cb93ff66 LLVM13 (2021/7/18)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 221
diff changeset
9 // Can a noexcept member function pointer be caught by a non-noexcept catch clause?
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
10 // UNSUPPORTED: c++03, c++11, c++14
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
11 // UNSUPPORTED: no-exceptions
223
5f17cb93ff66 LLVM13 (2021/7/18)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 221
diff changeset
12
5f17cb93ff66 LLVM13 (2021/7/18)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 221
diff changeset
13 // Support for catching a function pointer including noexcept was shipped in macOS 10.13
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
14 // XFAIL: stdlib=apple-libc++ && target={{.+}}-apple-macosx10.{{9|10|11|12}}
150
anatofuz
parents:
diff changeset
15
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
16 // GCC supports noexcept function types but this test still fails.
150
anatofuz
parents:
diff changeset
17 // This is likely a bug in their implementation. Investigation needed.
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
18 // XFAIL: gcc-11, gcc-12
150
anatofuz
parents:
diff changeset
19
anatofuz
parents:
diff changeset
20 #include <cassert>
anatofuz
parents:
diff changeset
21
anatofuz
parents:
diff changeset
22 struct X {
anatofuz
parents:
diff changeset
23 template<bool Noexcept> void f() noexcept(Noexcept) {}
anatofuz
parents:
diff changeset
24 };
anatofuz
parents:
diff changeset
25 template<bool Noexcept> using FnType = void (X::*)() noexcept(Noexcept);
anatofuz
parents:
diff changeset
26
anatofuz
parents:
diff changeset
27 template<bool ThrowNoexcept, bool CatchNoexcept>
anatofuz
parents:
diff changeset
28 void check()
anatofuz
parents:
diff changeset
29 {
anatofuz
parents:
diff changeset
30 try
anatofuz
parents:
diff changeset
31 {
anatofuz
parents:
diff changeset
32 auto p = &X::f<ThrowNoexcept>;
anatofuz
parents:
diff changeset
33 throw p;
anatofuz
parents:
diff changeset
34 assert(false);
anatofuz
parents:
diff changeset
35 }
anatofuz
parents:
diff changeset
36 catch (FnType<CatchNoexcept> p)
anatofuz
parents:
diff changeset
37 {
anatofuz
parents:
diff changeset
38 assert(ThrowNoexcept || !CatchNoexcept);
anatofuz
parents:
diff changeset
39 assert(p == &X::f<ThrowNoexcept>);
anatofuz
parents:
diff changeset
40 }
anatofuz
parents:
diff changeset
41 catch (...)
anatofuz
parents:
diff changeset
42 {
anatofuz
parents:
diff changeset
43 assert(!ThrowNoexcept && CatchNoexcept);
anatofuz
parents:
diff changeset
44 }
anatofuz
parents:
diff changeset
45 }
anatofuz
parents:
diff changeset
46
anatofuz
parents:
diff changeset
47 void check_deep() {
anatofuz
parents:
diff changeset
48 FnType<true> p = &X::f<true>;
anatofuz
parents:
diff changeset
49 try
anatofuz
parents:
diff changeset
50 {
anatofuz
parents:
diff changeset
51 throw &p;
anatofuz
parents:
diff changeset
52 }
anatofuz
parents:
diff changeset
53 catch (FnType<false> *q)
anatofuz
parents:
diff changeset
54 {
anatofuz
parents:
diff changeset
55 assert(false);
anatofuz
parents:
diff changeset
56 }
anatofuz
parents:
diff changeset
57 catch (FnType<true> *q)
anatofuz
parents:
diff changeset
58 {
anatofuz
parents:
diff changeset
59 }
anatofuz
parents:
diff changeset
60 catch (...)
anatofuz
parents:
diff changeset
61 {
anatofuz
parents:
diff changeset
62 assert(false);
anatofuz
parents:
diff changeset
63 }
anatofuz
parents:
diff changeset
64 }
anatofuz
parents:
diff changeset
65
221
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
66 int main(int, char**)
150
anatofuz
parents:
diff changeset
67 {
anatofuz
parents:
diff changeset
68 check<false, false>();
anatofuz
parents:
diff changeset
69 check<false, true>();
anatofuz
parents:
diff changeset
70 check<true, false>();
anatofuz
parents:
diff changeset
71 check<true, true>();
anatofuz
parents:
diff changeset
72 check_deep();
221
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
73
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
74 return 0;
150
anatofuz
parents:
diff changeset
75 }