diff options
Diffstat (limited to 'gcc/cp/pt.c')
-rw-r--r-- | gcc/cp/pt.c | 22 |
1 files changed, 11 insertions, 11 deletions
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index df5d1f68b86..72b0c4f18b2 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; } |