aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorPaolo Carlini <paolo.carlini@oracle.com>2013-06-29 00:11:03 +0000
committerPaolo Carlini <paolo@gcc.gnu.org>2013-06-29 00:11:03 +0000
commita5e90b2af35e879ce1f310c0639f907009b6c3cb (patch)
tree2d9629e027b6b3b04e0ce3733a3886cd5b90c184 /gcc
parente6631d3801d00b095af3325d69b9b4cbdc48535f (diff)
downloadgcc-a5e90b2af35e879ce1f310c0639f907009b6c3cb.zip
gcc-a5e90b2af35e879ce1f310c0639f907009b6c3cb.tar.gz
gcc-a5e90b2af35e879ce1f310c0639f907009b6c3cb.tar.bz2
re PR c++/57645 (Explicitly-declared destructor with no exception specification is always noexcept(true))
/cp 2013-06-28 Paolo Carlini <paolo.carlini@oracle.com> PR c++/57645 * class.c (deduce_noexcept_on_destructors): Save, set, and restore TYPE_HAS_NONTRIVIAL_DESTRUCTOR (t) around the main loop over the destructors. /testsuite 2013-06-28 Paolo Carlini <paolo.carlini@oracle.com> PR c++/57645 * g++.dg/cpp0x/noexcept21.C: New. From-SVN: r200559
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog7
-rw-r--r--gcc/cp/class.c11
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/noexcept21.C87
4 files changed, 107 insertions, 3 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index cffed31..c00f24c 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,10 @@
+2013-06-28 Paolo Carlini <paolo.carlini@oracle.com>
+
+ PR c++/57645
+ * class.c (deduce_noexcept_on_destructors): Save, set, and restore
+ TYPE_HAS_NONTRIVIAL_DESTRUCTOR (t) around the main loop over the
+ destructors.
+
2013-06-28 Balaji V. Iyer <balaji.v.iyer@intel.com>
* parser.c (cp_parser_array_notation): Removed rejection array notation
diff --git a/gcc/cp/class.c b/gcc/cp/class.c
index 0067605..bb2c3fe 100644
--- a/gcc/cp/class.c
+++ b/gcc/cp/class.c
@@ -4593,15 +4593,20 @@ deduce_noexcept_on_destructor (tree dtor)
static void
deduce_noexcept_on_destructors (tree t)
{
- tree fns;
-
/* If for some reason we don't have a CLASSTYPE_METHOD_VEC, we bail
out now. */
if (!CLASSTYPE_METHOD_VEC (t))
return;
- for (fns = CLASSTYPE_DESTRUCTORS (t); fns; fns = OVL_NEXT (fns))
+ bool saved_nontrivial_dtor = TYPE_HAS_NONTRIVIAL_DESTRUCTOR (t);
+
+ /* Avoid early exit from synthesized_method_walk (c++/57645). */
+ TYPE_HAS_NONTRIVIAL_DESTRUCTOR (t) = true;
+
+ for (tree fns = CLASSTYPE_DESTRUCTORS (t); fns; fns = OVL_NEXT (fns))
deduce_noexcept_on_destructor (OVL_CURRENT (fns));
+
+ TYPE_HAS_NONTRIVIAL_DESTRUCTOR (t) = saved_nontrivial_dtor;
}
/* Subroutine of set_one_vmethod_tm_attributes. Search base classes
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 28874b0..1ab4a98 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2013-06-28 Paolo Carlini <paolo.carlini@oracle.com>
+
+ PR c++/57645
+ * g++.dg/cpp0x/noexcept21.C: New.
+
2013-06-28 Jakub Jelinek <jakub@redhat.com>
PR target/57736
diff --git a/gcc/testsuite/g++.dg/cpp0x/noexcept21.C b/gcc/testsuite/g++.dg/cpp0x/noexcept21.C
new file mode 100644
index 0000000..ec88e1d
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp0x/noexcept21.C
@@ -0,0 +1,87 @@
+// PR c++/57645
+// { dg-do compile { target c++11 } }
+
+struct Thrower
+{
+ ~Thrower() noexcept(false) { throw 1; }
+};
+
+struct ExplicitA
+{
+ ~ExplicitA() {}
+
+ Thrower t;
+};
+
+struct ExplicitB
+{
+ ~ExplicitB();
+
+ Thrower t;
+};
+
+ExplicitB::~ExplicitB() {}
+
+struct ExplicitC
+{
+ ~ExplicitC() = default;
+
+ Thrower t;
+};
+
+struct ExplicitD
+{
+ ~ExplicitD();
+
+ Thrower t;
+};
+
+ExplicitD::~ExplicitD() = default;
+
+struct NoThrower
+{
+ ~NoThrower() noexcept(true) {}
+};
+
+struct ExplicitE
+{
+ ~ExplicitE() {}
+
+ NoThrower t;
+};
+
+struct ExplicitF
+{
+ ~ExplicitF();
+
+ NoThrower t;
+};
+
+ExplicitF::~ExplicitF() {}
+
+struct ExplicitG
+{
+ ~ExplicitG() = default;
+
+ NoThrower t;
+};
+
+struct ExplicitH
+{
+ ~ExplicitH();
+
+ NoThrower t;
+};
+
+ExplicitH::~ExplicitH() = default;
+
+#define SA(X) static_assert(X, #X)
+
+SA( !noexcept(ExplicitA()) );
+SA( !noexcept(ExplicitB()) );
+SA( !noexcept(ExplicitC()) );
+SA( !noexcept(ExplicitD()) );
+SA( noexcept(ExplicitE()) );
+SA( noexcept(ExplicitF()) );
+SA( noexcept(ExplicitG()) );
+SA( noexcept(ExplicitH()) );