re PR c++/80309 (ICE: canonical types differ for identical types _Args2 and _Args2)
authorJakub Jelinek <jakub@redhat.com>
Wed, 5 Apr 2017 19:10:17 +0000 (21:10 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Wed, 5 Apr 2017 19:10:17 +0000 (21:10 +0200)
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
gcc/cp/pt.c

index 6cacac1552587d02e231402151e47e8031ad47a3..9b1f89d8ccda3e1f66bcc8e72c30afe91f522180 100644 (file)
@@ -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
index 24b01e70ba6a1ca3e78694a734d510b86f4511b0..f9f4921a11a9959ee6c39511d88472877178e28d 100644 (file)
@@ -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;
 }