From 098eae0067631ae7a8d98ac19ff47cb89ec2ba25 Mon Sep 17 00:00:00 2001 From: Nathan Sidwell Date: Wed, 7 Dec 2016 13:00:02 +0000 Subject: [PATCH] pt.c (tsubst <{NON,}TYPE_ARGUMENT_PACK>): Simplify control flow and avoid re-tsubsting type. * pt.c (tsubst <{NON,}TYPE_ARGUMENT_PACK>: Simplify control flow and avoid re-tsubsting type. From-SVN: r243343 --- gcc/cp/ChangeLog | 3 +++ gcc/cp/pt.c | 27 ++++++++++++++------------- 2 files changed, 17 insertions(+), 13 deletions(-) diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 3964cfd5aa9..c666f168965 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,8 @@ 2016-12-07 Nathan Sidwell + * 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. diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 3b80ca402e7..97d0b4840fc 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -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); + tree r; - /* 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); + if (code == NONTYPE_ARGUMENT_PACK) + { + r = make_node (code); + /* Set the already-substituted type. */ + TREE_TYPE (r) = type; + } + else + r = cxx_make_type (code); - return r; + 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: