aboutsummaryrefslogtreecommitdiff
path: root/libcpp/line-map.c
diff options
context:
space:
mode:
authorPatrick Palka <ppalka@redhat.com>2021-03-02 07:38:41 -0500
committerPatrick Palka <ppalka@redhat.com>2021-03-02 07:38:41 -0500
commit276cb81bec63906543b79915d9ff542a34910b2d (patch)
treeed9f9233bc9f3919bd45d385c9edb03775e5362a /libcpp/line-map.c
parent04b10596fe2fec1aa6652c15fd389087a78a235f (diff)
downloadgcc-276cb81bec63906543b79915d9ff542a34910b2d.zip
gcc-276cb81bec63906543b79915d9ff542a34910b2d.tar.gz
gcc-276cb81bec63906543b79915d9ff542a34910b2d.tar.bz2
c++: Delay normalizing nested requirements until satisfaction
This sets up the functionality for controlling the initial set of template parameters to pass to normalization when dealing with a constraint-expression that is not associated with some constrained declaration, for instance when normalizing a nested requirement of a requires expression, or the constraints on a placeholder type. The main new ingredient here is the data member norm_info::initial_parms which can be set by callers of the normalization routines to communicate the in-scope template parameters for the supplied constraint-expression, rather than always falling back to using current_template_parms. This patch then uses this functionality in our handling of nested requirements so that we can delay normalizing them until needed for satisfaction. We currently immediately normalize nested requirements at parse time, where we have the necessary template context, and cache the normal form in their TREE_TYPE node. With this patch, we now delay normalization until needed (as with other constraint expressions), and instead store the current value of current_template_parms in their TREE_TYPE node (which we use to restore the template context at normalization time). In the subsequent patch, this functionality will also be used to normalize placeholder type constraints during auto deduction. gcc/cp/ChangeLog: * constraint.cc (build_parameter_mapping): Rely on the caller to determine the in-scope template parameters. (norm_info::norm_info): Delegate the tsubst_flags_t constructor to the two-parameter constructor. In the two-parameter constructor, fold in the definition of make_context, set initial_parms appropriately, and don't set the now-removed orig_decl member. (norm_info::make_context): Remove, now that its only use is inlined into the caller. (norm_info::update_context): Adjust call to build_parameter_mapping to pass in the relevant set of in-scope template parameters. (norm_info::ctx_parms): Define this member function. (norm_info::context): Initialize to NULL_TREE. (norm_info::orig_decl): Remove this data member. (norm_info::initial_parms): Define this data member. (normalize_atom): Adjust call to build_parameter_mapping to pass in the relevant set of in-scope template parameters. Use info.initial_parms instead of info.orig_decl. (normalize_constraint_expression): Take a norm_info object instead of a bool. Cache the result of normalization. (tsubst_nested_requirement): Call satisfy_constraint_expression instead of satisfy_constraint, so that we normalize on demand. (satisfy_constraint_expression): Handle a NESTED_REQ argument. Adjust call to normalize_constraint_expression. (finish_nested_requirement): Set the TREE_TYPE of the NESTED_REQ to current_template_parms. (diagnose_nested_requirements): Go through satisfy_constraint_expression, as with tsubst_nested_requirement.
Diffstat (limited to 'libcpp/line-map.c')
0 files changed, 0 insertions, 0 deletions