aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2013-04-19 12:28:03 -0400
committerJason Merrill <jason@gcc.gnu.org>2013-04-19 12:28:03 -0400
commit86c0810c726e89e35cf5c0c037953164e8d38ae0 (patch)
treefefc11037e553d58909670aa93011beec49ca734
parentf6b64c35014ca111711e753be85bb99280a1e115 (diff)
downloadgcc-86c0810c726e89e35cf5c0c037953164e8d38ae0.zip
gcc-86c0810c726e89e35cf5c0c037953164e8d38ae0.tar.gz
gcc-86c0810c726e89e35cf5c0c037953164e8d38ae0.tar.bz2
DR 941
DR 941 * decl.c (duplicate_decls): Don't propagate DECL_DELETED_FN to template specializations. From-SVN: r198098
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/decl.c12
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/defaulted42.C10
3 files changed, 24 insertions, 4 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 94e29af..9d6ad14 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,9 @@
+2013-04-19 Jason Merrill <jason@redhat.com>
+
+ 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 01804d2..3328812 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 0000000..1ac25a9
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp0x/defaulted42.C
@@ -0,0 +1,10 @@
+// DR 941
+// { dg-require-effective-target c++11 }
+
+template <class T> T f(T) = delete;
+template<> int f(int) { return 42; }
+
+int main()
+{
+ f(42);
+}