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: r193956
This commit is contained in:
parent
1c44f40a48
commit
66a30dc9c9
|
@ -1,5 +1,9 @@
|
|||
2012-11-29 Jason Merrill <jason@redhat.com>
|
||||
|
||||
PR c++/53862
|
||||
* pt.c (tsubst_arg_types): Add "end" parameter.
|
||||
(check_undeduced_parms): Use it.
|
||||
|
||||
PR c++/53039
|
||||
* pt.c (arg_from_parm_pack_p): Go back to using same_type_p or
|
||||
cp_tree_equal.
|
||||
|
|
22
gcc/cp/pt.c
22
gcc/cp/pt.c
|
@ -172,7 +172,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);
|
||||
|
@ -10538,11 +10538,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)
|
||||
{
|
||||
|
@ -10552,11 +10555,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;
|
||||
|
||||
|
@ -10681,7 +10684,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;
|
||||
|
@ -16751,12 +16754,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;
|
||||
}
|
||||
|
|
|
@ -1,5 +1,8 @@
|
|||
2012-11-29 Jason Merrill <jason@redhat.com>
|
||||
|
||||
PR c++/53862
|
||||
* g++.dg/cpp0x/variadic134.C: New.
|
||||
|
||||
PR c++/53858
|
||||
* g++.dg/cpp0x/alias-decl-20.C: New.
|
||||
|
||||
|
|
|
@ -0,0 +1,17 @@
|
|||
// PR c++/53862
|
||||
// { dg-do compile { target c++11 } }
|
||||
|
||||
typedef unsigned long size_t;
|
||||
|
||||
template<typename> struct is_scalar { static const bool value = true; };
|
||||
template<bool, typename T> struct enable_if { typedef T type; };
|
||||
|
||||
template <size_t N, typename... Args>
|
||||
void f(Args...) {}
|
||||
|
||||
template <size_t N, typename T, typename... Args>
|
||||
typename enable_if<is_scalar<T>::value, void>::type f(T, Args...) {}
|
||||
|
||||
int main() {
|
||||
f<1>(1);
|
||||
}
|
Loading…
Reference in New Issue