diff options
author | jason <jason@138bc75d-0d04-0410-961f-82ee72b054a4> | 2017-01-09 21:51:08 +0000 |
---|---|---|
committer | jason <jason@138bc75d-0d04-0410-961f-82ee72b054a4> | 2017-01-09 21:51:08 +0000 |
commit | caba101ff33a763b444090b9c073bd84972ee552 (patch) | |
tree | a6a25a2bcfc6d78bd787d7257b26a8242a21c0c6 /gcc/cp/pt.c | |
parent | d0abd9e0edd7dd5373956957211e3620e6d65931 (diff) |
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
Diffstat (limited to 'gcc/cp/pt.c')
-rw-r--r-- | gcc/cp/pt.c | 40 |
1 files changed, 33 insertions, 7 deletions
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 |