Adjust C++17 class deduction use of DECL_ABSTRACT_ORIGIN.
authorJason Merrill <jason@redhat.com>
Tue, 29 Aug 2017 19:40:32 +0000 (15:40 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Tue, 29 Aug 2017 19:40:32 +0000 (15:40 -0400)
* pt.c (build_deduction_guide): Set DECL_ABSTRACT_ORIGIN on the
template, not the function.
(template_guide_p): Adjust.

From-SVN: r251425

gcc/cp/ChangeLog
gcc/cp/pt.c

index b4e21f6f0643169419f897fd5ae64f678d854b10..ea410c1063af0f39eaff29642805e1dab44124be 100644 (file)
@@ -1,5 +1,9 @@
 2017-08-29  Jason Merrill  <jason@redhat.com>
 
+       * pt.c (build_deduction_guide): Set DECL_ABSTRACT_ORIGIN on the
+       template, not the function.
+       (template_guide_p): Adjust.
+
        Support copying local_specializations.
        * cp-tree.h (enum lss_policy): New.
        (local_specialization_stack): Add policy parameter to default ctor.
index 1b726ff53985e8b76d22f0e9e0e718d6642ec73d..416d17b5d18e4dfce7ad35b8e18ebc45c7bd3553 100644 (file)
@@ -25079,11 +25079,9 @@ template_guide_p (const_tree fn)
   gcc_assert (deduction_guide_p (fn));
   if (!DECL_ARTIFICIAL (fn))
     return false;
-  if (tree ctor = DECL_ABSTRACT_ORIGIN (fn))
-    {
-      tree tmpl = DECL_TI_TEMPLATE (ctor);
-      return PRIMARY_TEMPLATE_P (tmpl);
-    }
+  tree tmpl = DECL_TI_TEMPLATE (fn);
+  if (tree org = DECL_ABSTRACT_ORIGIN (tmpl))
+    return PRIMARY_TEMPLATE_P (org);
   return false;
 }
 
@@ -25194,6 +25192,7 @@ build_deduction_guide (tree ctor, tree outer_args, tsubst_flags_t complain)
   bool memtmpl = false;
   bool explicit_p;
   location_t loc;
+  tree fn_tmpl = NULL_TREE;
 
   if (TYPE_P (ctor))
     {
@@ -25219,7 +25218,7 @@ build_deduction_guide (tree ctor, tree outer_args, tsubst_flags_t complain)
     {
       ++processing_template_decl;
 
-      tree fn_tmpl
+      fn_tmpl
        = (TREE_CODE (ctor) == TEMPLATE_DECL ? ctor
           : DECL_TI_TEMPLATE (ctor));
       if (outer_args)
@@ -25334,7 +25333,7 @@ build_deduction_guide (tree ctor, tree outer_args, tsubst_flags_t complain)
   DECL_TEMPLATE_INFO (ded_fn) = build_template_info (ded_tmpl, targs);
   DECL_PRIMARY_TEMPLATE (ded_tmpl) = ded_tmpl;
   if (DECL_P (ctor))
-    DECL_ABSTRACT_ORIGIN (ded_fn) = ctor;
+    DECL_ABSTRACT_ORIGIN (ded_tmpl) = fn_tmpl;
   if (ci)
     set_constraints (ded_tmpl, ci);