diff options
author | Dimitry Andric <dim@FreeBSD.org> | 2019-01-19 10:04:05 +0000 |
---|---|---|
committer | Dimitry Andric <dim@FreeBSD.org> | 2019-01-19 10:04:05 +0000 |
commit | 676fbe8105eeb6ff4bb2ed261cb212fcfdbe7b63 (patch) | |
tree | 02a1ac369cb734d0abfa5000dd86e5b7797e6a74 /test/SemaCXX/exception-spec.cpp | |
parent | c7e70c433efc6953dc3888b9fbf9f3512d7da2b0 (diff) |
Diffstat (limited to 'test/SemaCXX/exception-spec.cpp')
-rw-r--r-- | test/SemaCXX/exception-spec.cpp | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/test/SemaCXX/exception-spec.cpp b/test/SemaCXX/exception-spec.cpp index f301a63503dd4..6ad19aab397bd 100644 --- a/test/SemaCXX/exception-spec.cpp +++ b/test/SemaCXX/exception-spec.cpp @@ -5,3 +5,50 @@ namespace MissingOnTemplate { template<typename T> void foo(T); // expected-error {{missing exception specification 'noexcept(true)'}} void test() { foo(0); } } + +struct UseBeforeComplete1 { + ~UseBeforeComplete1(); // expected-note {{previous}} + struct X { + friend UseBeforeComplete1::~UseBeforeComplete1() noexcept; // expected-warning {{previously declared with an implicit}} + }; +}; + +struct ThrowingDtor { ~ThrowingDtor() noexcept(false); }; +struct UseBeforeComplete2 { + ~UseBeforeComplete2(); // expected-note {{previous}} + struct X { + friend UseBeforeComplete2::~UseBeforeComplete2() noexcept; // expected-error {{does not match previous}} + }; + ThrowingDtor td; +}; + +struct UseBeforeComplete3 { + ~UseBeforeComplete3(); + struct X { + friend UseBeforeComplete3::~UseBeforeComplete3(); // ok, implicitly noexcept(true) + }; +}; +static_assert(noexcept(UseBeforeComplete3()), ""); + +struct UseBeforeComplete4 { + ~UseBeforeComplete4(); + struct X { + friend UseBeforeComplete4::~UseBeforeComplete4(); // ok, implicitly noexcept(false) + }; + ThrowingDtor td; +}; +static_assert(!noexcept(UseBeforeComplete4()), ""); + +namespace AssignmentOp { + struct D1; + struct D2; + struct B { + B &operator=(const B&); + virtual D1 &operator=(const D1&) noexcept; // expected-note {{overridden}} + virtual D2 &operator=(const D2&) noexcept; // expected-note {{overridden}} + }; + struct D1 : B {}; // expected-error {{more lax}} + struct D2 : B { + D2 &operator=(const D2&); // expected-error {{more lax}} + }; +} |