diff options
author | Jason Merrill <jason@redhat.com> | 2012-07-06 11:45:10 -0400 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2012-07-06 11:45:10 -0400 |
commit | 3b5cd6f2bf2ba047bfe00a658478c5e03037cd8f (patch) | |
tree | 7e5d952e473656b625d4c3337c1c40088b94a970 /gcc/cp | |
parent | df947b0a640b9c8306e4ef0a64a330df9f82b46e (diff) | |
download | gcc-3b5cd6f2bf2ba047bfe00a658478c5e03037cd8f.zip gcc-3b5cd6f2bf2ba047bfe00a658478c5e03037cd8f.tar.gz gcc-3b5cd6f2bf2ba047bfe00a658478c5e03037cd8f.tar.bz2 |
re PR c++/53862 ([C++11] sorry, unimplemented: use of 'type_pack_expansion' in template)
PR c++/53862
* pt.c (tsubst_arg_types): Add "end" parameter.
(check_undeduced_parms): Use it.
From-SVN: r189334
Diffstat (limited to 'gcc/cp')
-rw-r--r-- | gcc/cp/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/cp/pt.c | 22 |
2 files changed, 15 insertions, 11 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 0bd2c77..f407539 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,9 @@ 2012-07-06 Jason Merrill <jason@redhat.com> + PR c++/53862 + * pt.c (tsubst_arg_types): Add "end" parameter. + (check_undeduced_parms): Use it. + * cp-tree.h (DECL_DECLARES_TYPE_P): Check DECL_TYPE_TEMPLATE_P. PR c++/53858 diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index df5d1f6..72b0c4f 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -171,7 +171,7 @@ static tree tsubst_template_parms (tree, tree, tsubst_flags_t); static void regenerate_decl_from_template (tree, tree); static tree most_specialized_class (tree, tree, tsubst_flags_t); static tree tsubst_aggr_type (tree, tree, tsubst_flags_t, tree, int); -static tree tsubst_arg_types (tree, tree, tsubst_flags_t, tree); +static tree tsubst_arg_types (tree, tree, tree, tsubst_flags_t, tree); static tree tsubst_function_type (tree, tree, tsubst_flags_t, tree); static bool check_specialization_scope (void); static tree process_partial_specialization (tree); @@ -10500,11 +10500,14 @@ tsubst_decl (tree t, tree args, tsubst_flags_t complain) return r; } -/* Substitute into the ARG_TYPES of a function type. */ +/* Substitute into the ARG_TYPES of a function type. + If END is a TREE_CHAIN, leave it and any following types + un-substituted. */ static tree tsubst_arg_types (tree arg_types, tree args, + tree end, tsubst_flags_t complain, tree in_decl) { @@ -10514,11 +10517,11 @@ tsubst_arg_types (tree arg_types, tree expanded_args = NULL_TREE; tree default_arg; - if (!arg_types || arg_types == void_list_node) + if (!arg_types || arg_types == void_list_node || arg_types == end) return arg_types; remaining_arg_types = tsubst_arg_types (TREE_CHAIN (arg_types), - args, complain, in_decl); + args, end, complain, in_decl); if (remaining_arg_types == error_mark_node) return error_mark_node; @@ -10643,7 +10646,7 @@ tsubst_function_type (tree t, } /* Substitute the argument types. */ - arg_types = tsubst_arg_types (TYPE_ARG_TYPES (t), args, + arg_types = tsubst_arg_types (TYPE_ARG_TYPES (t), args, NULL_TREE, complain, in_decl); if (arg_types == error_mark_node) return error_mark_node; @@ -16757,12 +16760,9 @@ check_undeduced_parms (tree targs, tree args, tree end) } if (found) { - for (; args != end; args = TREE_CHAIN (args)) - { - tree substed = tsubst (TREE_VALUE (args), targs, tf_none, NULL_TREE); - if (substed == error_mark_node) - return true; - } + tree substed = tsubst_arg_types (args, targs, end, tf_none, NULL_TREE); + if (substed == error_mark_node) + return true; } return false; } |