aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2012-03-05 13:07:12 -0500
committerJason Merrill <jason@gcc.gnu.org>2012-03-05 13:07:12 -0500
commitbb828cc7f3150eee83a0f3d4d26a85806d93fb0c (patch)
treebd476b349706604dfb078049fff767d0a2db5e56
parentc3f87aa90913654a711c671568ec5bf9488a4440 (diff)
downloadgcc-bb828cc7f3150eee83a0f3d4d26a85806d93fb0c.zip
gcc-bb828cc7f3150eee83a0f3d4d26a85806d93fb0c.tar.gz
gcc-bb828cc7f3150eee83a0f3d4d26a85806d93fb0c.tar.bz2
method.c (synthesized_method_walk): Cleanups don't affect the EH spec either.
* method.c (synthesized_method_walk): Cleanups don't affect the EH spec either. From-SVN: r184945
-rw-r--r--gcc/cp/ChangeLog5
-rw-r--r--gcc/cp/method.c7
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/implicit13.C24
4 files changed, 38 insertions, 2 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index f837570..71af797 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,8 @@
+2012-03-05 Jason Merrill <jason@redhat.com>
+
+ * method.c (synthesized_method_walk): Cleanups don't affect the EH
+ spec either.
+
2012-03-03 Jason Merrill <jason@redhat.com>
* init.c (perform_member_init): Cope with uninstantiated NSDMI.
diff --git a/gcc/cp/method.c b/gcc/cp/method.c
index cf2a713..0718916 100644
--- a/gcc/cp/method.c
+++ b/gcc/cp/method.c
@@ -1272,8 +1272,11 @@ synthesized_method_walk (tree ctype, special_function_kind sfk, bool const_p,
rval = locate_fn_flags (base_binfo, complete_dtor_identifier,
NULL_TREE, flags, complain);
/* Note that we don't pass down trivial_p; the subobject
- destructors don't affect triviality of the constructor. */
- process_subob_fn (rval, false, spec_p, NULL,
+ destructors don't affect triviality of the constructor. Nor
+ do they affect constexpr-ness (a constant expression doesn't
+ throw) or exception-specification (a throw from one of the
+ dtors would be a double-fault). */
+ process_subob_fn (rval, false, NULL, NULL,
deleted_p, NULL, NULL,
basetype);
}
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 85a4410..5fbd14f 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2012-03-05 Jason Merrill <jason@redhat.com>
+
+ * g++.dg/cpp0x/implicit13.C: New.
+
2012-03-05 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/51721
diff --git a/gcc/testsuite/g++.dg/cpp0x/implicit13.C b/gcc/testsuite/g++.dg/cpp0x/implicit13.C
new file mode 100644
index 0000000..96bc770
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp0x/implicit13.C
@@ -0,0 +1,24 @@
+// Make sure that A's destructor doesn't affect constexpr
+// or exception-spec on D's default constructor.
+// { dg-do compile { target c++11 } }
+
+struct A {
+ constexpr A() noexcept: i(0) { }
+ int i;
+ ~A() noexcept(false);
+};
+
+struct B: A { };
+
+// Should get static initialization, so no constructor call.
+// { dg-final { scan-assembler-not "_ZN1BC1Ev" } }
+B b;
+
+struct C { C() noexcept; ~C(); };
+struct D: C { };
+extern D d;
+
+void *operator new(__SIZE_TYPE__, void*) noexcept;
+
+#define SA(X) static_assert((X),#X)
+SA(noexcept(new (&d) D));