c++: maybe_substitute_reqs_for fix
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.
This commit is contained in:
parent
810bcc0015
commit
f40d24cda7
3 changed files with 9 additions and 7 deletions
|
@ -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))
|
||||
|
|
|
@ -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);
|
||||
|
|
12
gcc/cp/pt.cc
12
gcc/cp/pt.cc
|
@ -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;
|
||||
|
|
Loading…
Add table
Reference in a new issue