aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2019-10-23 20:41:26 +0000
committerJason Merrill <jason@redhat.com>2019-10-23 20:41:26 +0000
commit421e9b156df0b300c0446d9818ce6d59e31b1ae2 (patch)
tree18bcab37dfecdae810feb52e18f4461f970f4fbe /gcc/testsuite
parent2a68eea06ea1f566ba3ab45ec20cd304f0982aaa (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.C7
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/defaulted23.C4
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/defaulted43.C10
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;