mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-27 08:46:06 +00:00

catching as non-noexcept This implements the following proposal from cxx-abi-dev: http://sourcerytools.com/pipermail/cxx-abi-dev/2016-October/002988.html ... which is necessary for complete support of http://wg21.link/p0012, specifically throwing noexcept function and member function pointers and catching them as non-noexcept pointers. Differential Review: https://reviews.llvm.org/D26178 llvm-svn: 285867
66 lines
1.4 KiB
C++
66 lines
1.4 KiB
C++
//===---------------------- catch_function_03.cpp -------------------------===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is dual licensed under the MIT and the University of Illinois Open
|
|
// Source Licenses. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
// Can a noexcept function pointer be caught by a non-noexcept catch clause?
|
|
// UNSUPPORTED: c++98, c++03, c++11, c++14
|
|
// UNSUPPORTED: libcxxabi-no-exceptions, libcxxabi-no-qualified-function-types
|
|
|
|
#include <cassert>
|
|
|
|
template<bool Noexcept> void f() noexcept(Noexcept) {}
|
|
template<bool Noexcept> using FnType = void() noexcept(Noexcept);
|
|
|
|
template<bool ThrowNoexcept, bool CatchNoexcept>
|
|
void check()
|
|
{
|
|
try
|
|
{
|
|
auto *p = f<ThrowNoexcept>;
|
|
throw p;
|
|
assert(false);
|
|
}
|
|
catch (FnType<CatchNoexcept> *p)
|
|
{
|
|
assert(ThrowNoexcept || !CatchNoexcept);
|
|
assert(p == &f<ThrowNoexcept>);
|
|
}
|
|
catch (...)
|
|
{
|
|
assert(!ThrowNoexcept && CatchNoexcept);
|
|
}
|
|
}
|
|
|
|
void check_deep() {
|
|
auto *p = f<true>;
|
|
try
|
|
{
|
|
throw &p;
|
|
}
|
|
catch (FnType<false> **q)
|
|
{
|
|
assert(false);
|
|
}
|
|
catch (FnType<true> **q)
|
|
{
|
|
}
|
|
catch (...)
|
|
{
|
|
assert(false);
|
|
}
|
|
}
|
|
|
|
int main()
|
|
{
|
|
check<false, false>();
|
|
check<false, true>();
|
|
check<true, false>();
|
|
check<true, true>();
|
|
check_deep();
|
|
}
|