| | |
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| | |
| | |
| |
|
| | #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(); |
| | } |
| |
|