pt.c (tsubst <{NON,}TYPE_ARGUMENT_PACK>): Simplify control flow and avoid re-tsubstin...
authorNathan Sidwell <nathan@acm.org>
Wed, 7 Dec 2016 13:00:02 +0000 (13:00 +0000)
committerNathan Sidwell <nathan@gcc.gnu.org>
Wed, 7 Dec 2016 13:00:02 +0000 (13:00 +0000)
* pt.c (tsubst <{NON,}TYPE_ARGUMENT_PACK>: Simplify control flow
and avoid re-tsubsting type.

From-SVN: r243343

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

index 3964cfd5aa952d60499bb71df5b9e50bebd71f96..c666f1689652fe5a2553330639cff7cb36800b44 100644 (file)
@@ -1,5 +1,8 @@
 2016-12-07  Nathan Sidwell  <nathan@acm.org>
 
+       * pt.c (tsubst <{NON,}TYPE_ARGUMENT_PACK>: Simplify control flow
+       and avoid re-tsubsting type.
+
        * cp-tree.h (enum cp_tree_index): Add CPTI_AUTO_IDENTIFIER &
        CPTI_DECLTYPE_AUTO_IDENTIFIER.
        (auto_identifier, decltype_auto_identifier): New.
index 3b80ca402e7d9de75be830da5b5fe5476c7b9e9e..97d0b4840fcb12d827ad1e686e4e5f90560b446b 100644 (file)
@@ -13795,22 +13795,23 @@ tsubst (tree t, tree args, tsubst_flags_t complain, tree in_decl)
     case TYPE_ARGUMENT_PACK:
     case NONTYPE_ARGUMENT_PACK:
       {
-        tree r = TYPE_P (t) ? cxx_make_type (code) : make_node (code);
-        tree packed_out = 
-          tsubst_template_args (ARGUMENT_PACK_ARGS (t), 
-                                args,
-                                complain,
-                                in_decl);
-        SET_ARGUMENT_PACK_ARGS (r, packed_out);
-
-        /* For template nontype argument packs, also substitute into
-           the type.  */
-        if (code == NONTYPE_ARGUMENT_PACK)
-          TREE_TYPE (r) = tsubst (TREE_TYPE (t), args, complain, in_decl);
-
-        return r;
+        tree r;
+
+       if (code == NONTYPE_ARGUMENT_PACK)
+         {
+           r = make_node (code);
+           /* Set the already-substituted type.  */
+           TREE_TYPE (r) = type;
+         }
+       else
+         r = cxx_make_type (code);
+
+       tree pack_args = ARGUMENT_PACK_ARGS (t);
+       pack_args = tsubst_template_args (pack_args, args, complain, in_decl);
+       SET_ARGUMENT_PACK_ARGS (r, pack_args);
+
+       return r;
       }
-      break;
 
     case VOID_CST:
     case INTEGER_CST: