re PR c++/39164 ([C++0x] defaulted dtor redefinition not caught)
authorJason Merrill <jason@redhat.com>
Thu, 6 Oct 2011 19:56:53 +0000 (15:56 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Thu, 6 Oct 2011 19:56:53 +0000 (15:56 -0400)
PR c++/39164
* decl.c (grokfndecl): Diagnose redefinition of defaulted fn.

From-SVN: r179634

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

index c8ca7c5f85a57831118d4df3b5e5e034842a7b58..3d8442b1c2d12c0893986b41fadc30b0e2dd4592 100644 (file)
@@ -1,3 +1,8 @@
+2011-10-06  Jason Merrill  <jason@redhat.com>
+
+       PR c++/39164
+       * decl.c (grokfndecl): Diagnose redefinition of defaulted fn.
+
 2011-10-02  Jason Merrill  <jason@redhat.com>
 
        * pt.c (tsubst_pack_expansion): Re-use ARGUMENT_PACK_SELECTs.
index 30f92dae24396c1405f674b52f0d0eee7d935733..984d1f2f3729f112c91b1249dfab3550ead5f3f8 100644 (file)
@@ -7418,6 +7418,12 @@ grokfndecl (tree ctype,
              error ("definition of implicitly-declared %qD", old_decl);
              return NULL_TREE;
            }
+         else if (DECL_DEFAULTED_FN (old_decl))
+           {
+             error ("definition of explicitly-defaulted %q+D", decl);
+             error ("%q+#D explicitly defaulted here", old_decl);
+             return NULL_TREE;
+           }
 
          /* Since we've smashed OLD_DECL to its
             DECL_TEMPLATE_RESULT, we must do the same to DECL.  */
index ccd5187fb6b75d92fe0870c2e60b67087462432e..97dac1722e77eaa9f57b9075449bfbe0c2586dca 100644 (file)
@@ -1,3 +1,8 @@
+2011-10-06  Jason Merrill  <jason@redhat.com>
+
+       PR c++/39164
+       * g++.dg/cpp0x/default31.C: New.
+
 2011-10-06  Jakub Jelinek  <jakub@redhat.com>
 
        PR tree-optimization/50596
diff --git a/gcc/testsuite/g++.dg/cpp0x/defaulted31.C b/gcc/testsuite/g++.dg/cpp0x/defaulted31.C
new file mode 100644 (file)
index 0000000..de6a298
--- /dev/null
@@ -0,0 +1,16 @@
+// PR c++/39164
+// { dg-options -std=c++0x }
+
+struct A
+{
+  A() { }                      // { dg-error "defined" }
+  ~A() = default;              // { dg-error "defaulted" }
+};
+
+A::A() = default;              // { dg-error "redefinition" }
+A::~A() noexcept (true) { }    // { dg-error "defaulted" }
+
+int main()
+{
+  A a;
+}