From 86c0810c726e89e35cf5c0c037953164e8d38ae0 Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Fri, 19 Apr 2013 12:28:03 -0400 Subject: [PATCH] DR 941 DR 941 * decl.c (duplicate_decls): Don't propagate DECL_DELETED_FN to template specializations. From-SVN: r198098 --- gcc/cp/ChangeLog | 6 ++++++ gcc/cp/decl.c | 12 ++++++++---- gcc/testsuite/g++.dg/cpp0x/defaulted42.C | 10 ++++++++++ 3 files changed, 24 insertions(+), 4 deletions(-) create mode 100644 gcc/testsuite/g++.dg/cpp0x/defaulted42.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 94e29afae07..9d6ad149cc9 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2013-04-19 Jason Merrill + + DR 941 + * decl.c (duplicate_decls): Don't propagate DECL_DELETED_FN to + template specializations. + 2013-04-16 Ed Smith-Rowland <3dw4rd@verizon.net> Implement n3599 - Literal operator templates for strings. diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 01804d2cf68..3328812d5c3 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -1764,12 +1764,16 @@ duplicate_decls (tree newdecl, tree olddecl, bool newdecl_is_friend) warning (OPT_Wredundant_decls, "previous declaration of %q+D", olddecl); } - if (DECL_DELETED_FN (newdecl)) + if (!(DECL_TEMPLATE_INSTANTIATION (olddecl) + && DECL_TEMPLATE_SPECIALIZATION (newdecl))) { - error ("deleted definition of %qD", newdecl); - error ("after previous declaration %q+D", olddecl); + if (DECL_DELETED_FN (newdecl)) + { + error ("deleted definition of %qD", newdecl); + error ("after previous declaration %q+D", olddecl); + } + DECL_DELETED_FN (newdecl) |= DECL_DELETED_FN (olddecl); } - DECL_DELETED_FN (newdecl) |= DECL_DELETED_FN (olddecl); } /* Deal with C++: must preserve virtual function table size. */ diff --git a/gcc/testsuite/g++.dg/cpp0x/defaulted42.C b/gcc/testsuite/g++.dg/cpp0x/defaulted42.C new file mode 100644 index 00000000000..1ac25a90b27 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/defaulted42.C @@ -0,0 +1,10 @@ +// DR 941 +// { dg-require-effective-target c++11 } + +template T f(T) = delete; +template<> int f(int) { return 42; } + +int main() +{ + f(42); +} -- 2.30.2