Skip to content
Snippets Groups Projects
Commit 3e3d73ed authored by Patrick Palka's avatar Patrick Palka
Browse files

c++: merge tsubst_copy into tsubst_copy_and_build


The relationship between tsubst_copy_and_build and tsubst_copy (two of
the main template argument substitution routines for expression trees)
is rather hazy.  The former is mostly a superset of the latter, with
some differences.

The main apparent difference is their handling of various tree codes,
but much of the tree code handling in tsubst_copy appears to be dead
code.  This is because tsubst_copy mostly gets (directly) called on
id-expressions rather than on arbitrary expressions.  The interesting
tree codes are PARM_DECL, VAR_DECL, BIT_NOT_EXPR, SCOPE_REF,
TEMPLATE_ID_EXPR and IDENTIFIER_NODE:

 * for PARM_DECL and VAR_DECL, tsubst_copy_and_build calls tsubst_copy
   followed by doing some extra handling of its own
 * for BIT_NOT_EXPR tsubst_copy implicitly handles unresolved destructor
   calls (i.e. the first operand is an identifier or a type)
 * for SCOPE_REF, TEMPLATE_ID_EXPR and IDENTIFIER_NODE tsubst_copy
   refrains from doing name lookup of the terminal name

Other more minor differences are that tsubst_copy exits early when
'args' is null, and it calls maybe_dependent_member_ref, and finally
it dispatches to tsubst for type trees.[1]

Thus tsubst_copy is similar enough to tsubst_copy_and_build that it
makes sense to merge the two functions, with the main difference we
want to preserve is tsubst_copy's lack of name lookup for id-expressions.
This patch achieves this via a new tsubst flag tf_no_name_lookup which
controls name lookup and resolution of a (top-level) id-expression.

[1]: Exiting early for null 'args' doesn't seem right since it means we
return templated trees even when !processing_template_decl.  And
dispatching to tsubst for type trees muddles the distinction between
type and expressions which makes things less clear at the call site.
So these properties of tsubst_copy don't seem worth preserving.

N.B. the diff for this patch looks much cleaner when generated using
the "patience diff" algorithm via Git's --patience flag.

gcc/cp/ChangeLog:

	* cp-tree.h (enum tsubst_flags): Add tf_no_name_lookup.
	* pt.cc (tsubst_pack_expansion): Use tsubst for substituting
	BASES_TYPE.
	(tsubst_decl) <case USING_DECL>: Use tsubst_name instead of
	tsubst_copy.
	(tsubst) <case TEMPLATE_TYPE_PARM>: Use tsubst_copy_and_build
	instead of tsubst_copy for substituting
	CLASS_PLACEHOLDER_TEMPLATE.
	<case TYPENAME_TYPE>: Use tsubst_name instead of tsubst_copy for
	substituting TYPENAME_TYPE_FULLNAME.
	(tsubst_name): Define.
	(tsubst_qualified_id): Use tsubst_name instead of tsubst_copy
	for substituting the component name of a SCOPE_REF.
	(tsubst_copy): Remove.
	(tsubst_copy_and_build): Clear tf_no_name_lookup at the start,
	and remember if it was set.  Call maybe_dependent_member_ref if
	tf_no_name_lookup was not set.
	<case IDENTIFIER_NODE>: Don't do name lookup if tf_no_name_lookup
	was set.
	<case TEMPLATE_ID_EXPR>: If tf_no_name_lookup was set, use
	tsubst_name instead of tsubst_copy_and_build to substitute the
	template and don't finish the template-id.
	<case BIT_NOT_EXPR>: Handle identifier and type operand (if
	tf_no_name_lookup was set).
	<case SCOPE_REF>: Avoid trying to resolve a SCOPE_REF if
	tf_no_name_lookup was set by calling build_qualified_name directly
	instead of tsubst_qualified_id.
	<case SIZEOF_EXPR>: Handling of sizeof...  copied from tsubst_copy.
	<case CALL_EXPR>: Use tsubst_name instead of tsubst_copy to
	substitute a TEMPLATE_ID_EXPR callee naming an unresolved template.
	<case COMPONENT_REF>: Likewise to substitute the member.
	<case FUNCTION_DECL>: Copied from tsubst_copy and merged with ...
	<case VAR_DECL, PARM_DECL>: ... these.  Initial handling copied
	from tsubst_copy.  Optimize local variable substitution by
	trying retrieve_local_specialization before checking
	uses_template_parms.
	<case CONST_DECL>: Copied from tsubst_copy.
	<case FIELD_DECL>: Likewise.
	<case NAMESPACE_DECL>: Likewise.
	<case OVERLOAD>: Likewise.
	<case TEMPLATE_DECL>: Likewise.
	<case TEMPLATE_PARM_INDEX>: Likewise.
	<case TYPE_DECL>: Likewise.
	<case CLEANUP_POINT_EXPR>: Likewise.
	<case OFFSET_REF>: Likewise.
	<case EXPR_PACK_EXPANSION>: Likewise.
	<case NONTYPE_ARGUMENT_PACK>: Likewise.
	<case *_CST>: Likewise.
	<case *_*_FOLD_EXPR>: Likewise.
	<case DEBUG_BEGIN_STMT>: Likewise.
	<case CO_AWAIT_EXPR>: Likewise.
	<case TRAIT_EXPR>: Use tsubst and tsubst_copy_and_build instead
	of tsubst_copy.
	<default>: Copied from tsubst_copy.
	(tsubst_initializer_list): Use tsubst and tsubst_copy_and_build
	instead of tsubst_copy.

Reviewed-by: default avatarJason Merrill <jason@redhat.com>
parent 909672f0
No related branches found
No related tags found
No related merge requests found
Loading
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment