From 98568e0337010d21eb43a6939070162f89aad841 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Wed, 5 Apr 2017 21:10:17 +0200 Subject: [PATCH] re PR c++/80309 (ICE: canonical types differ for identical types _Args2 and _Args2) PR c++/80309 * pt.c (canonical_type_parameter): Use vec_safe_grow_cleared instead of a loop doing vec_safe_push of NULL. Formatting fixes. (rewrite_template_parm): Copy TEMPLATE_PARM_PARAMETER_PACK from oldidx to newidx before calling canonical_type_parameter on newtype. From-SVN: r246717 --- gcc/cp/ChangeLog | 8 ++++++++ gcc/cp/pt.c | 15 ++++++++------- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 6cacac15525..9b1f89d8ccd 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,11 @@ +2017-04-05 Jakub Jelinek + + PR c++/80309 + * pt.c (canonical_type_parameter): Use vec_safe_grow_cleared instead + of a loop doing vec_safe_push of NULL. Formatting fixes. + (rewrite_template_parm): Copy TEMPLATE_PARM_PARAMETER_PACK from oldidx + to newidx before calling canonical_type_parameter on newtype. + 2017-04-04 Volker Reichelt PR c++/80296 diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 24b01e70ba6..f9f4921a11a 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -3997,10 +3997,10 @@ canonical_type_parameter (tree type) tree list; int idx = TEMPLATE_TYPE_IDX (type); if (!canonical_template_parms) - vec_alloc (canonical_template_parms, idx+1); + vec_alloc (canonical_template_parms, idx + 1); - while (canonical_template_parms->length () <= (unsigned)idx) - vec_safe_push (canonical_template_parms, NULL_TREE); + if (canonical_template_parms->length () <= (unsigned) idx) + vec_safe_grow_cleared (canonical_template_parms, idx + 1); list = (*canonical_template_parms)[idx]; while (list && !comptypes (type, TREE_VALUE (list), COMPARE_STRUCTURAL)) @@ -4011,8 +4011,7 @@ canonical_type_parameter (tree type) else { (*canonical_template_parms)[idx] - = tree_cons (NULL_TREE, type, - (*canonical_template_parms)[idx]); + = tree_cons (NULL_TREE, type, (*canonical_template_parms)[idx]); return type; } } @@ -24955,6 +24954,8 @@ rewrite_template_parm (tree olddecl, unsigned index, unsigned level, newidx = TEMPLATE_TYPE_PARM_INDEX (newtype) = build_template_parm_index (index, level, level, newdecl, newtype); + TEMPLATE_PARM_PARAMETER_PACK (newidx) + = TEMPLATE_PARM_PARAMETER_PACK (oldidx); TYPE_STUB_DECL (newtype) = TYPE_NAME (newtype) = newdecl; TYPE_CANONICAL (newtype) = canonical_type_parameter (newtype); @@ -25002,11 +25003,11 @@ rewrite_template_parm (tree olddecl, unsigned index, unsigned level, SET_DECL_TEMPLATE_PARM_P (newconst); newidx = build_template_parm_index (index, level, level, newconst, newtype); + TEMPLATE_PARM_PARAMETER_PACK (newidx) + = TEMPLATE_PARM_PARAMETER_PACK (oldidx); DECL_INITIAL (newdecl) = DECL_INITIAL (newconst) = newidx; } - TEMPLATE_PARM_PARAMETER_PACK (newidx) - = TEMPLATE_PARM_PARAMETER_PACK (oldidx); return newdecl; } -- 2.30.2