[C++ PATCH] Template parm index fix
authorNathan Sidwell <nathan@acm.org>
Thu, 24 Oct 2019 16:11:42 +0000 (16:11 +0000)
committerNathan Sidwell <nathan@gcc.gnu.org>
Thu, 24 Oct 2019 16:11:42 +0000 (16:11 +0000)
https://gcc.gnu.org/ml/gcc-patches/2019-10/msg01761.html
* pt.c (reduce_template_parm_level): Attach the new TPI to the new
DECL.
(convert_generic_types_to_packs): Pass the copied type to
reduce_template_parm_level.

From-SVN: r277416

gcc/cp/ChangeLog
gcc/cp/pt.c

index 1917b8c4f595f94c8cc22247d091e08776534495..d28eea373d4c5232550571fb1d7fc7d4f5a59a78 100644 (file)
@@ -1,3 +1,10 @@
+2019-10-24  Nathan Sidwell  <nathan@acm.org>
+
+       * pt.c (reduce_template_parm_level): Attach the new TPI to the new
+       DECL.
+       (convert_generic_types_to_packs): Pass the copied type to
+       reduce_templatE_parm_level.
+
 2019-10-23  Nathan Sidwell  <nathan@acm.org>
 
        * cp-tree.c (CPTI_STD_IDENTIFIER): Delete.
index 095bc32c542d446086987a60cbcadf8cb78f4c71..c5675dd8e3f37098b3cc5a051ec0cbb7225ec6ce 100644 (file)
@@ -4429,33 +4429,40 @@ reduce_template_parm_level (tree index, tree type, int levels, tree args,
       || !same_type_p (type, TREE_TYPE (TEMPLATE_PARM_DESCENDANTS (index))))
     {
       tree orig_decl = TEMPLATE_PARM_DECL (index);
-      tree decl, t;
 
-      decl = build_decl (DECL_SOURCE_LOCATION (orig_decl),
-                        TREE_CODE (orig_decl), DECL_NAME (orig_decl), type);
+      tree decl = build_decl (DECL_SOURCE_LOCATION (orig_decl),
+                             TREE_CODE (orig_decl), DECL_NAME (orig_decl),
+                             type);
       TREE_CONSTANT (decl) = TREE_CONSTANT (orig_decl);
       TREE_READONLY (decl) = TREE_READONLY (orig_decl);
       DECL_ARTIFICIAL (decl) = 1;
       SET_DECL_TEMPLATE_PARM_P (decl);
 
-      t = build_template_parm_index (TEMPLATE_PARM_IDX (index),
-                                    TEMPLATE_PARM_LEVEL (index) - levels,
-                                    TEMPLATE_PARM_ORIG_LEVEL (index),
-                                    decl, type);
-      TEMPLATE_PARM_DESCENDANTS (index) = t;
-      TEMPLATE_PARM_PARAMETER_PACK (t)
+      tree tpi = build_template_parm_index (TEMPLATE_PARM_IDX (index),
+                                           TEMPLATE_PARM_LEVEL (index) - levels,
+                                           TEMPLATE_PARM_ORIG_LEVEL (index),
+                                           decl, type);
+      TEMPLATE_PARM_DESCENDANTS (index) = tpi;
+      TEMPLATE_PARM_PARAMETER_PACK (tpi)
        = TEMPLATE_PARM_PARAMETER_PACK (index);
 
        /* Template template parameters need this.  */
+      tree inner = decl;
       if (TREE_CODE (decl) == TEMPLATE_DECL)
        {
-         DECL_TEMPLATE_RESULT (decl)
-           = build_decl (DECL_SOURCE_LOCATION (decl),
-                         TYPE_DECL, DECL_NAME (decl), type);
-         DECL_ARTIFICIAL (DECL_TEMPLATE_RESULT (decl)) = true;
+         inner = build_decl (DECL_SOURCE_LOCATION (decl),
+                             TYPE_DECL, DECL_NAME (decl), type);
+         DECL_TEMPLATE_RESULT (decl) = inner;
+         DECL_ARTIFICIAL (inner) = true;
          DECL_TEMPLATE_PARMS (decl) = tsubst_template_parms
            (DECL_TEMPLATE_PARMS (orig_decl), args, complain);
        }
+
+      /* Attach the TPI to the decl.  */
+      if (TREE_CODE (inner) == TYPE_DECL)
+       TEMPLATE_TYPE_PARM_INDEX (type) = tpi;
+      else
+       DECL_INITIAL (decl) = tpi;
     }
 
   return TEMPLATE_PARM_DESCENDANTS (index);
@@ -28440,7 +28447,7 @@ convert_generic_types_to_packs (tree parm, int start_idx, int end_idx)
       tree t = copy_type (o);
       TEMPLATE_TYPE_PARM_INDEX (t)
        = reduce_template_parm_level (TEMPLATE_TYPE_PARM_INDEX (o),
-                                     o, 0, 0, tf_none);
+                                     t, 0, 0, tf_none);
       TREE_TYPE (TEMPLATE_TYPE_DECL (t)) = t;
       TYPE_STUB_DECL (t) = TYPE_NAME (t) = TEMPLATE_TYPE_DECL (t);
       TYPE_MAIN_VARIANT (t) = t;