re PR c++/55220 ([c++11] ICE when doing partial template specialization on variadic template)
PR c++/55220 * pt.c (unify): A pack expansion that is not the last template argument makes the entire template argument list non-deduced. From-SVN: r196068
This commit is contained in:
parent
06449b408e
commit
d132b74aba
|
@ -1,5 +1,9 @@
|
|||
2013-02-14 Jason Merrill <jason@redhat.com>
|
||||
|
||||
PR c++/55220
|
||||
* pt.c (unify): A pack expansion that is not the last template
|
||||
argument makes the entire template argument list non-deduced.
|
||||
|
||||
PR c++/56323
|
||||
* name-lookup.c (do_class_using_decl): Handle typedefs with
|
||||
inheriting constructors.
|
||||
|
|
|
@ -16548,6 +16548,14 @@ unify (tree tparms, tree targs, tree parm, tree arg, int strict,
|
|||
&& PACK_EXPANSION_P (TREE_VEC_ELT (parmvec, len - 1)))
|
||||
parm_variadic_p = 1;
|
||||
|
||||
for (i = 0; i < len - parm_variadic_p; ++i)
|
||||
/* If the template argument list of P contains a pack
|
||||
expansion that is not the last template argument, the
|
||||
entire template argument list is a non-deduced
|
||||
context. */
|
||||
if (PACK_EXPANSION_P (TREE_VEC_ELT (parmvec, i)))
|
||||
return unify_success (explain_p);
|
||||
|
||||
if (TREE_VEC_LENGTH (argvec) < len - parm_variadic_p)
|
||||
return unify_too_few_arguments (explain_p,
|
||||
TREE_VEC_LENGTH (argvec), len);
|
||||
|
|
|
@ -0,0 +1,25 @@
|
|||
// PR c++/55220
|
||||
// { dg-do compile { target c++11 } }
|
||||
|
||||
template <typename ...> struct something_like_tuple
|
||||
{
|
||||
|
||||
};
|
||||
|
||||
template <typename, typename> struct is_last
|
||||
{
|
||||
static const bool value = false;
|
||||
};
|
||||
|
||||
// Head is non-deducible, so this can't work as the user intended
|
||||
template <typename T, template <typename ...> class Tuple, typename ... Head>
|
||||
struct is_last<T, Tuple<Head ..., T>>
|
||||
{
|
||||
static const bool value = true;
|
||||
};
|
||||
|
||||
#define SA(X) static_assert (X, #X)
|
||||
|
||||
typedef something_like_tuple<char, int, float> something_like_tuple_t;
|
||||
SA ((is_last<float, something_like_tuple_t>::value == false));
|
||||
SA ((is_last<int, something_like_tuple_t>::value == false));
|
Loading…
Reference in New Issue