diff options
author | Jason Merrill <jason@redhat.com> | 2019-10-23 20:41:26 +0000 |
---|---|---|
committer | Jason Merrill <jason@redhat.com> | 2019-10-23 20:41:26 +0000 |
commit | 421e9b156df0b300c0446d9818ce6d59e31b1ae2 (patch) | |
tree | 18bcab37dfecdae810feb52e18f4461f970f4fbe /gcc/testsuite | |
parent | 2a68eea06ea1f566ba3ab45ec20cd304f0982aaa (diff) |
Implement P1286R2, Contra CWG1778
The C++11 requirement that an explicit exception-specification on a
defaulted function match the implicit one was found to be problematic for
std::atomic. This paper, adopted in February, simply removes that
requirement: if an explicitly defaulted function has a different
exception-specification, that now works just like a user-written function:
either it isn't noexcept when it could be, or it is noexcept and will call
terminate if an exception is thrown.
* method.c (defaulted_late_check): Don't check explicit
exception-specification on defaulted function.
(after_nsdmi_defaulted_late_checks): Remove.
* parser.h (struct cp_unparsed_functions_entry): Remove classes.
* parser.c (unparsed_classes): Remove.
(push_unparsed_function_queues, cp_parser_class_specifier_1):
Adjust.
git-svn-id: https://gcc.gnu.org/svn/gcc/trunk@277351 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/testsuite')
-rw-r--r-- | gcc/testsuite/g++.dg/DRs/dr1778.C | 7 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/defaulted23.C | 4 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/defaulted43.C | 10 |
3 files changed, 14 insertions, 7 deletions
diff --git a/gcc/testsuite/g++.dg/DRs/dr1778.C b/gcc/testsuite/g++.dg/DRs/dr1778.C new file mode 100644 index 00000000000..8db937fc0bf --- /dev/null +++ b/gcc/testsuite/g++.dg/DRs/dr1778.C @@ -0,0 +1,7 @@ +// P1286R2: Contra CWG1778 +// { dg-do compile { target c++11 } } + +struct T { T(); T(T &&) noexcept(false); }; +struct U { T t; U(); U(U &&) noexcept = default; }; +U u1; +U u2 = static_cast<U&&>(u1); // OK, calls std::terminate if T::T(T&&) throws diff --git a/gcc/testsuite/g++.dg/cpp0x/defaulted23.C b/gcc/testsuite/g++.dg/cpp0x/defaulted23.C index dfbdd2f2ed1..23848633c3c 100644 --- a/gcc/testsuite/g++.dg/cpp0x/defaulted23.C +++ b/gcc/testsuite/g++.dg/cpp0x/defaulted23.C @@ -10,10 +10,10 @@ A a; struct B { - B() throw (int) = default; // { dg-message "exception-specification" "" { target { ! c++17 } } } + B() throw (int) = default; }; // { dg-error "dynamic exception specification" "" { target c++17 } .-1 } // { dg-warning "deprecated" "" { target { ! c++17 } } .-2 } -B b; // { dg-error "deleted" "" { target { ! c++17 } } } +B b; struct C { diff --git a/gcc/testsuite/g++.dg/cpp0x/defaulted43.C b/gcc/testsuite/g++.dg/cpp0x/defaulted43.C index f2846fe390c..1fe7818ec67 100644 --- a/gcc/testsuite/g++.dg/cpp0x/defaulted43.C +++ b/gcc/testsuite/g++.dg/cpp0x/defaulted43.C @@ -17,8 +17,8 @@ struct A T t; }; -A::A() noexcept = default; // { dg-error "defaulted" } -A::~A() noexcept = default; // { dg-error "defaulted" } +A::A() noexcept = default; +A::~A() noexcept = default; struct U { @@ -51,10 +51,10 @@ V v; struct C { - C() noexcept = default; // { dg-message "exception-specification" } - ~C() noexcept = default; // { dg-message "exception-specification" } + C() noexcept = default; + ~C() noexcept = default; V v; }; -C c; // { dg-error "deleted" } +C c; |