]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
c++: maybe_substitute_reqs_for fix
authorJason Merrill <jason@redhat.com>
Fri, 18 Aug 2023 22:24:53 +0000 (18:24 -0400)
committerJason Merrill <jason@redhat.com>
Tue, 22 Aug 2023 18:35:47 +0000 (14:35 -0400)
While working on PR109751 I found that maybe_substitute_reqs_for was doing
the wrong thing for a non-template friend, substituting in the template args
of the scope's original template rather than those of the instantiation.
This didn't end up being necessary to fix the PR, but it's still an
improvement.

gcc/cp/ChangeLog:

* pt.cc (outer_template_args): Handle non-template argument.
* constraint.cc (maybe_substitute_reqs_for): Pass decl to it.
* cp-tree.h (outer_template_args): Adjust.

gcc/cp/constraint.cc
gcc/cp/cp-tree.h
gcc/cp/pt.cc

index 8cf0f2d097465aa6c0a49512da8cbcb789eae9de..c9e4e7043cdcd7f2ec930cf5134b0354c8af83e4 100644 (file)
@@ -1339,7 +1339,7 @@ maybe_substitute_reqs_for (tree reqs, const_tree decl)
   if (DECL_UNIQUE_FRIEND_P (decl) && DECL_TEMPLATE_INFO (decl))
     {
       tree tmpl = DECL_TI_TEMPLATE (decl);
-      tree outer_args = outer_template_args (tmpl);
+      tree outer_args = outer_template_args (decl);
       processing_template_decl_sentinel s;
       if (PRIMARY_TEMPLATE_P (tmpl)
          || uses_template_parms (outer_args))
index 356d7ffb6d610376f0fabbcdfcca48a05c139470..eb901683b6dc6681f582f08fc715162c750c0e42 100644 (file)
@@ -7083,7 +7083,7 @@ extern tree maybe_set_retval_sentinel             (void);
 extern tree template_parms_to_args             (tree);
 extern tree template_parms_level_to_args       (tree);
 extern tree generic_targs_for                  (tree);
-extern tree outer_template_args                        (tree);
+extern tree outer_template_args                        (const_tree);
 
 /* in expr.cc */
 extern tree cplus_expand_constant              (tree);
index f4e77d172b9d9e990e0640c29dd2c11af6f0e224..c017591f235b30ff202748c8dc954437452ecf3d 100644 (file)
@@ -4966,19 +4966,21 @@ generic_targs_for (tree tmpl)
 }
 
 /* Return the template arguments corresponding to the template parameters of
-   TMPL's enclosing scope.  When TMPL is a member of a partial specialization,
+   DECL's enclosing scope.  When DECL is a member of a partial specialization,
    this returns the arguments for the partial specialization as opposed to those
    for the primary template, which is the main difference between this function
-   and simply using e.g. the TYPE_TI_ARGS of TMPL's DECL_CONTEXT.  */
+   and simply using e.g. the TYPE_TI_ARGS of DECL's DECL_CONTEXT.  */
 
 tree
-outer_template_args (tree tmpl)
+outer_template_args (const_tree decl)
 {
-  tree ti = get_template_info (DECL_TEMPLATE_RESULT (tmpl));
+  if (TREE_CODE (decl) == TEMPLATE_DECL)
+    decl = DECL_TEMPLATE_RESULT (decl);
+  tree ti = get_template_info (decl);
   if (!ti)
     return NULL_TREE;
   tree args = TI_ARGS (ti);
-  if (!PRIMARY_TEMPLATE_P (tmpl))
+  if (!PRIMARY_TEMPLATE_P (TI_TEMPLATE (ti)))
     return args;
   if (TMPL_ARGS_DEPTH (args) == 1)
     return NULL_TREE;