From caba101ff33a763b444090b9c073bd84972ee552 Mon Sep 17 00:00:00 2001 From: jason Date: Mon, 9 Jan 2017 21:51:08 +0000 Subject: Implement P0195R2, C++17 variadic using. * parser.c (cp_parser_using_declaration): Handle ellipsis and comma. * pt.c (tsubst_decl): Handle pack expansion in USING_DECL_SCOPE. * error.c (dump_decl): Likewise. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@244246 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/cp/pt.c | 40 +++++++++++++++++++++++++++++++++------- 1 file changed, 33 insertions(+), 7 deletions(-) (limited to 'gcc/cp/pt.c') diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 366c59a2486..dec7d39f0d0 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -12591,16 +12591,42 @@ tsubst_decl (tree t, tree args, tsubst_flags_t complain) if (DECL_DEPENDENT_P (t) || uses_template_parms (USING_DECL_SCOPE (t))) { - tree inst_scope = tsubst_copy (USING_DECL_SCOPE (t), args, - complain, in_decl); + tree scope = USING_DECL_SCOPE (t); tree name = tsubst_copy (DECL_NAME (t), args, complain, in_decl); - r = do_class_using_decl (inst_scope, name); - if (!r) - r = error_mark_node; + if (PACK_EXPANSION_P (scope)) + { + tree vec = tsubst_pack_expansion (scope, args, complain, in_decl); + int len = TREE_VEC_LENGTH (vec); + r = make_tree_vec (len); + for (int i = 0; i < len; ++i) + { + tree escope = TREE_VEC_ELT (vec, i); + tree elt = do_class_using_decl (escope, name); + if (!elt) + { + r = error_mark_node; + break; + } + else + { + TREE_PROTECTED (elt) = TREE_PROTECTED (t); + TREE_PRIVATE (elt) = TREE_PRIVATE (t); + } + TREE_VEC_ELT (r, i) = elt; + } + } else { - TREE_PROTECTED (r) = TREE_PROTECTED (t); - TREE_PRIVATE (r) = TREE_PRIVATE (t); + tree inst_scope = tsubst_copy (USING_DECL_SCOPE (t), args, + complain, in_decl); + r = do_class_using_decl (inst_scope, name); + if (!r) + r = error_mark_node; + else + { + TREE_PROTECTED (r) = TREE_PROTECTED (t); + TREE_PRIVATE (r) = TREE_PRIVATE (t); + } } } else -- cgit v1.2.3