aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorNathan Sidwell <nathan@acm.org>2020-05-04 09:49:52 -0700
committerNathan Sidwell <nathan@acm.org>2020-05-04 09:49:52 -0700
commit97268c374a348a60c53366a4bee67626c840e4a1 (patch)
treea3c16ad18bf78578e36e74665e41ed27c298483f /gcc
parentf1621d18f5517977c161f0fb29c54b4ef7d8245c (diff)
downloadgcc-97268c374a348a60c53366a4bee67626c840e4a1.zip
gcc-97268c374a348a60c53366a4bee67626c840e4a1.tar.gz
gcc-97268c374a348a60c53366a4bee67626c840e4a1.tar.bz2
c++: Simplify process_template_parm
Process_template_parm ends up walking the parameter list twice. There's not need to do this. Just rember the final node and modify its CHAIN directly. Also comment on why end_template_parm_list does a pop and a push, rather than modifying the header in place. pt.c (process_template_parm): Don't walk the template list twice, remember the final node instead. (end_template_parm_list): Refactor. Comment on why we do a pop and a push.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog5
-rw-r--r--gcc/cp/pt.c47
2 files changed, 31 insertions, 21 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 3d5f273..334899d 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,5 +1,10 @@
2020-05-04 Nathan Sidwell <nathan@acm.org>
+ pt.c (process_template_parm): Don't walk the template list twice,
+ remember the final node instead.
+ (end_template_parm_list): Refactor. Comment on why we do a pop
+ and a push.
+
PR c++/94827 -- don't save parms in nested requirement
* constraint.cc (tsubst_nested_requirement): TYPE directly holds
notmalized requirement.
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index 8106c25..61cb75b 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -4496,29 +4496,27 @@ tree
process_template_parm (tree list, location_t parm_loc, tree parm,
bool is_non_type, bool is_parameter_pack)
{
- tree decl = 0;
- int idx = 0;
-
gcc_assert (TREE_CODE (parm) == TREE_LIST);
- tree defval = TREE_PURPOSE (parm);
- tree constr = TREE_TYPE (parm);
+ tree prev = NULL_TREE;
+ int idx = 0;
if (list)
{
- tree p = tree_last (list);
+ prev = tree_last (list);
- if (p && TREE_VALUE (p) != error_mark_node)
- {
- p = TREE_VALUE (p);
- if (TREE_CODE (p) == TYPE_DECL || TREE_CODE (p) == TEMPLATE_DECL)
- idx = TEMPLATE_TYPE_IDX (TREE_TYPE (p));
- else
- idx = TEMPLATE_PARM_IDX (DECL_INITIAL (p));
- }
+ tree p = TREE_VALUE (prev);
+ if (TREE_CODE (p) == TYPE_DECL || TREE_CODE (p) == TEMPLATE_DECL)
+ idx = TEMPLATE_TYPE_IDX (TREE_TYPE (p));
+ else if (TREE_CODE (p) == PARM_DECL)
+ idx = TEMPLATE_PARM_IDX (DECL_INITIAL (p));
++idx;
}
+ tree decl = NULL_TREE;
+ tree defval = TREE_PURPOSE (parm);
+ tree constr = TREE_TYPE (parm);
+
if (is_non_type)
{
parm = TREE_VALUE (parm);
@@ -4616,7 +4614,12 @@ process_template_parm (tree list, location_t parm_loc, tree parm,
parm = build_tree_list (defval, parm);
TEMPLATE_PARM_CONSTRAINTS (parm) = reqs;
- return chainon (list, parm);
+ if (prev)
+ TREE_CHAIN (prev) = parm;
+ else
+ list = parm;
+
+ return list;
}
/* The end of a template parameter list has been reached. Process the
@@ -4627,22 +4630,24 @@ process_template_parm (tree list, location_t parm_loc, tree parm,
tree
end_template_parm_list (tree parms)
{
- int nparms;
- tree parm, next;
tree saved_parmlist = make_tree_vec (list_length (parms));
- /* Pop the dummy parameter level and add the real one. */
+ /* Pop the dummy parameter level and add the real one. We do not
+ morph the dummy parameter in place, as it might have been
+ captured by a (nested) template-template-parm. */
current_template_parms = TREE_CHAIN (current_template_parms);
current_template_parms
= tree_cons (size_int (processing_template_decl),
saved_parmlist, current_template_parms);
- for (parm = parms, nparms = 0; parm; parm = next, nparms++)
+ for (unsigned ix = 0; parms; ix++)
{
- next = TREE_CHAIN (parm);
- TREE_VEC_ELT (saved_parmlist, nparms) = parm;
+ tree parm = parms;
+ parms = TREE_CHAIN (parms);
TREE_CHAIN (parm) = NULL_TREE;
+
+ TREE_VEC_ELT (saved_parmlist, ix) = parm;
}
--processing_template_parmlist;