]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR c++/60216 ([c++11] Trouble with deleted template functions)
authorJason Merrill <jason@redhat.com>
Fri, 21 Feb 2014 14:57:07 +0000 (09:57 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Fri, 21 Feb 2014 14:57:07 +0000 (09:57 -0500)
PR c++/60216
* pt.c (register_specialization): Copy DECL_DELETED_FN to clones.
(check_explicit_specialization): Don't clone.

From-SVN: r208004

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

index 9ddd8f81bc8999fa9fc28d2d16fbadbd75cf56d5..5a91dcfb3a4003246b0462ef19d1ebac1c756d07 100644 (file)
@@ -1,5 +1,9 @@
 2014-02-21  Jason Merrill  <jason@redhat.com>
 
+       PR c++/60216
+       * pt.c (register_specialization): Copy DECL_DELETED_FN to clones.
+       (check_explicit_specialization): Don't clone.
+
        PR c++/60219
        * pt.c (coerce_template_parms): Bail if argument packing fails.
 
index bf41e8650984f2c8094f876a846588cc754da752..a39444104d6c684e923d91643f5c085621d243f8 100644 (file)
@@ -1440,6 +1440,8 @@ register_specialization (tree spec, tree tmpl, tree args, bool is_friend,
                    = DECL_DECLARED_INLINE_P (fn);
                  DECL_SOURCE_LOCATION (clone)
                    = DECL_SOURCE_LOCATION (fn);
+                 DECL_DELETED_FN (clone)
+                   = DECL_DELETED_FN (fn);
                }
              check_specialization_namespace (tmpl);
 
@@ -2770,15 +2772,16 @@ check_explicit_specialization (tree declarator,
               It's just the name of an instantiation.  But, it's not
               a request for an instantiation, either.  */
            SET_DECL_IMPLICIT_INSTANTIATION (decl);
-         else if (DECL_CONSTRUCTOR_P (decl) || DECL_DESTRUCTOR_P (decl))
-           /* This is indeed a specialization.  In case of constructors
-              and destructors, we need in-charge and not-in-charge
-              versions in V3 ABI.  */
-           clone_function_decl (decl, /*update_method_vec_p=*/0);
 
          /* Register this specialization so that we can find it
             again.  */
          decl = register_specialization (decl, gen_tmpl, targs, is_friend, 0);
+
+         /* A 'structor should already have clones.  */
+         gcc_assert (decl == error_mark_node
+                     || !(DECL_CONSTRUCTOR_P (decl)
+                          || DECL_DESTRUCTOR_P (decl))
+                     || DECL_CLONED_FUNCTION_P (DECL_CHAIN (decl)));
        }
     }
 
diff --git a/gcc/testsuite/g++.dg/cpp0x/deleted3.C b/gcc/testsuite/g++.dg/cpp0x/deleted3.C
new file mode 100644 (file)
index 0000000..6783677
--- /dev/null
@@ -0,0 +1,11 @@
+// PR c++/60216
+// { dg-require-effective-target c++11 }
+
+struct A
+{
+  template<typename T> A(T) = delete;
+};
+
+template<> A::A<int>(int) {}
+
+A a(0);