From 7e8ec1ec7028923fb402a5f0db4c86352afd1f6e Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Thu, 6 Oct 2011 15:56:53 -0400 Subject: [PATCH] re PR c++/39164 ([C++0x] defaulted dtor redefinition not caught) PR c++/39164 * decl.c (grokfndecl): Diagnose redefinition of defaulted fn. From-SVN: r179634 --- gcc/cp/ChangeLog | 5 +++++ gcc/cp/decl.c | 6 ++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/cpp0x/defaulted31.C | 16 ++++++++++++++++ 4 files changed, 32 insertions(+) create mode 100644 gcc/testsuite/g++.dg/cpp0x/defaulted31.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index c8ca7c5f85a..3d8442b1c2d 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2011-10-06 Jason Merrill + + PR c++/39164 + * decl.c (grokfndecl): Diagnose redefinition of defaulted fn. + 2011-10-02 Jason Merrill * pt.c (tsubst_pack_expansion): Re-use ARGUMENT_PACK_SELECTs. diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 30f92dae243..984d1f2f372 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -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. */ diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index ccd5187fb6b..97dac1722e7 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2011-10-06 Jason Merrill + + PR c++/39164 + * g++.dg/cpp0x/default31.C: New. + 2011-10-06 Jakub Jelinek 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 index 00000000000..de6a29854a5 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/defaulted31.C @@ -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; +} -- 2.30.2