1 //===----------------------------------------------------------------------===// 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 // Can a noexcept function pointer be caught by a non-noexcept catch clause? 10 // UNSUPPORTED: c++03, c++11, c++14 11 // UNSUPPORTED: no-exceptions 12 13 // Support for catching a function pointer including noexcept was shipped in macOS 10.13 14 // XFAIL: use_system_cxx_lib && {{.+}}-apple-macosx10.{{9|10|11|12}} 15 16 #include <cassert> 17 18 template<bool Noexcept> void f() noexcept(Noexcept) {} 19 template<bool Noexcept> using FnType = void() noexcept(Noexcept); 20 21 template<bool ThrowNoexcept, bool CatchNoexcept> 22 void check() 23 { 24 try 25 { 26 auto *p = f<ThrowNoexcept>; 27 throw p; 28 assert(false); 29 } 30 catch (FnType<CatchNoexcept> *p) 31 { 32 assert(ThrowNoexcept || !CatchNoexcept); 33 assert(p == &f<ThrowNoexcept>); 34 } 35 catch (...) 36 { 37 assert(!ThrowNoexcept && CatchNoexcept); 38 } 39 } 40 41 void check_deep() { 42 auto *p = 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 60 int main(int, char**) 61 { 62 check<false, false>(); 63 check<false, true>(); 64 check<true, false>(); 65 check<true, true>(); 66 check_deep(); 67 68 return 0; 69 } 70