• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //===--------------- catch_member_function_pointer_02.cpp -----------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is dual licensed under the MIT and the University of Illinois Open
6 // Source Licenses. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 
10 // Can a noexcept member function pointer be caught by a non-noexcept catch
11 // clause?
12 // UNSUPPORTED: libcxxabi-no-exceptions, libcxxabi-no-noexcept-function-type
13 
14 #include <cassert>
15 
16 struct X {
fX17   template<bool Noexcept> void f() noexcept(Noexcept) {}
18 };
19 template<bool Noexcept> using FnType = void (X::*)() noexcept(Noexcept);
20 
21 template<bool ThrowNoexcept, bool CatchNoexcept>
check()22 void check()
23 {
24     try
25     {
26         auto p = &X::f<ThrowNoexcept>;
27         throw p;
28         assert(false);
29     }
30     catch (FnType<CatchNoexcept> p)
31     {
32         assert(ThrowNoexcept || !CatchNoexcept);
33         assert(p == &X::f<ThrowNoexcept>);
34     }
35     catch (...)
36     {
37         assert(!ThrowNoexcept && CatchNoexcept);
38     }
39 }
40 
check_deep()41 void check_deep() {
42     FnType<true> p = &X::f<true>;
43     try
44     {
45         throw &p;
46     }
47     catch (FnType<false> *q)
48     {
49         assert(false);
50     }
51     catch (FnType<true> *q)
52     {
53     }
54     catch (...)
55     {
56         assert(false);
57     }
58 }
59 
main()60 int main()
61 {
62     check<false, false>();
63     check<false, true>();
64     check<true, false>();
65     check<true, true>();
66     check_deep();
67 }
68