aboutsummaryrefslogtreecommitdiff
path: root/gcc/cp/pt.c
diff options
context:
space:
mode:
authorjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>2017-01-09 21:51:08 +0000
committerjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>2017-01-09 21:51:08 +0000
commitcaba101ff33a763b444090b9c073bd84972ee552 (patch)
treea6a25a2bcfc6d78bd787d7257b26a8242a21c0c6 /gcc/cp/pt.c
parentd0abd9e0edd7dd5373956957211e3620e6d65931 (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.c40
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