Commit 3b5cd6f2 by Jason Merrill Committed by Jason Merrill

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
parent df947b0a
2012-07-06 Jason Merrill <jason@redhat.com> 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. * cp-tree.h (DECL_DECLARES_TYPE_P): Check DECL_TYPE_TEMPLATE_P.
PR c++/53858 PR c++/53858
......
...@@ -171,7 +171,7 @@ static tree tsubst_template_parms (tree, tree, tsubst_flags_t); ...@@ -171,7 +171,7 @@ static tree tsubst_template_parms (tree, tree, tsubst_flags_t);
static void regenerate_decl_from_template (tree, tree); static void regenerate_decl_from_template (tree, tree);
static tree most_specialized_class (tree, tree, tsubst_flags_t); 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_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 tree tsubst_function_type (tree, tree, tsubst_flags_t, tree);
static bool check_specialization_scope (void); static bool check_specialization_scope (void);
static tree process_partial_specialization (tree); static tree process_partial_specialization (tree);
...@@ -10500,11 +10500,14 @@ tsubst_decl (tree t, tree args, tsubst_flags_t complain) ...@@ -10500,11 +10500,14 @@ tsubst_decl (tree t, tree args, tsubst_flags_t complain)
return r; 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 static tree
tsubst_arg_types (tree arg_types, tsubst_arg_types (tree arg_types,
tree args, tree args,
tree end,
tsubst_flags_t complain, tsubst_flags_t complain,
tree in_decl) tree in_decl)
{ {
...@@ -10514,11 +10517,11 @@ tsubst_arg_types (tree arg_types, ...@@ -10514,11 +10517,11 @@ tsubst_arg_types (tree arg_types,
tree expanded_args = NULL_TREE; tree expanded_args = NULL_TREE;
tree default_arg; 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; return arg_types;
remaining_arg_types = tsubst_arg_types (TREE_CHAIN (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) if (remaining_arg_types == error_mark_node)
return error_mark_node; return error_mark_node;
...@@ -10643,7 +10646,7 @@ tsubst_function_type (tree t, ...@@ -10643,7 +10646,7 @@ tsubst_function_type (tree t,
} }
/* Substitute the argument types. */ /* 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); complain, in_decl);
if (arg_types == error_mark_node) if (arg_types == error_mark_node)
return error_mark_node; return error_mark_node;
...@@ -16757,12 +16760,9 @@ check_undeduced_parms (tree targs, tree args, tree end) ...@@ -16757,12 +16760,9 @@ check_undeduced_parms (tree targs, tree args, tree end)
} }
if (found) if (found)
{ {
for (; args != end; args = TREE_CHAIN (args)) tree substed = tsubst_arg_types (args, targs, end, tf_none, NULL_TREE);
{ if (substed == error_mark_node)
tree substed = tsubst (TREE_VALUE (args), targs, tf_none, NULL_TREE); return true;
if (substed == error_mark_node)
return true;
}
} }
return false; return false;
} }
......
2012-07-06 Jason Merrill <jason@redhat.com> 2012-07-06 Jason Merrill <jason@redhat.com>
PR c++/53862
* g++.dg/cpp0x/variadic134.C: New.
PR c++/53858 PR c++/53858
* g++.dg/cpp0x/alias-decl-20.C: New. * g++.dg/cpp0x/alias-decl-20.C: New.
......
// 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);
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment