diff options
author | Jakub Jelinek <jakub@redhat.com> | 2017-04-05 21:10:17 +0200 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2017-04-05 21:10:17 +0200 |
commit | 98568e0337010d21eb43a6939070162f89aad841 (patch) | |
tree | a88f0920e818d5625e3a88928da6fe6af397f5f0 /gcc | |
parent | 37d6671d0727e6773e1cd713f3b3589974270357 (diff) | |
download | gcc-98568e0337010d21eb43a6939070162f89aad841.zip gcc-98568e0337010d21eb43a6939070162f89aad841.tar.gz gcc-98568e0337010d21eb43a6939070162f89aad841.tar.bz2 |
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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/cp/pt.c | 15 |
2 files changed, 16 insertions, 7 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 6cacac1..9b1f89d 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,11 @@ +2017-04-05 Jakub Jelinek <jakub@redhat.com> + + 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 <v.reichelt@netcologne.de> PR c++/80296 diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 24b01e7..f9f4921 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; } |