re PR c++/56343 ([C++11] Destructor defaulted on first declaration has wrong implicit...
authorJason Merrill <jason@redhat.com>
Fri, 15 Feb 2013 17:19:45 +0000 (12:19 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Fri, 15 Feb 2013 17:19:45 +0000 (12:19 -0500)
PR c++/56343
* class.c (check_bases_and_members): Deduce noexcept after
checking bases.

From-SVN: r196082

gcc/cp/ChangeLog
gcc/cp/class.c
gcc/testsuite/g++.dg/cpp0x/defaulted41.C [new file with mode: 0644]

index 70dcc20..2dab029 100644 (file)
@@ -1,5 +1,9 @@
 2013-02-15  Jason Merrill  <jason@redhat.com>
 
+       PR c++/56343
+       * class.c (check_bases_and_members): Deduce noexcept after
+       checking bases.
+
        PR c++/52026
        * semantics.c (finish_id_expression): In a template, return
        the identifier for a constant variable.
index 38339f2..eaa109a 100644 (file)
@@ -5245,14 +5245,15 @@ check_bases_and_members (tree t)
   cant_have_const_ctor = 0;
   no_const_asn_ref = 0;
 
-  /* Deduce noexcept on destructors.  */
-  if (cxx_dialect >= cxx0x)
-    deduce_noexcept_on_destructors (t);
-
   /* Check all the base-classes.  */
   check_bases (t, &cant_have_const_ctor,
               &no_const_asn_ref);
 
+  /* Deduce noexcept on destructors.  This needs to happen after we've set
+     triviality flags appropriately for our bases.  */
+  if (cxx_dialect >= cxx0x)
+    deduce_noexcept_on_destructors (t);
+
   /* Check all the method declarations.  */
   check_methods (t);
 
diff --git a/gcc/testsuite/g++.dg/cpp0x/defaulted41.C b/gcc/testsuite/g++.dg/cpp0x/defaulted41.C
new file mode 100644 (file)
index 0000000..4272012
--- /dev/null
@@ -0,0 +1,14 @@
+// PR c++/56343
+// { dg-do compile { target c++11 } }
+
+class B
+{
+public:
+  virtual ~B() noexcept(false) { }
+};
+
+class D : public B
+{
+public:
+  virtual ~D() = default;
+};