Bootstrapped/regtested on x86_64-pc-linux-gnu, ok for trunk/14/13? -- >8 -- r12-1094 mentions that adding the assert didn't lead to any regressions in the testsuite, but this test case demonstrates that we can reach it with valid code.
Here we arrive in use_pack_expansion_extra_args_p with t which is an expansion whose pattern is void(Ts, Us) and tparm packs are {Us, Ts}, and parm_packs is { Ts -> <int, int>, Us -> <A, P...> }. We want to expand the pack into void(int, A) and void(int, P...). We compare int to A, which is fine, but then int to P... which crashes. But the code is valid so this patch removes the assert. PR c++/118104 gcc/cp/ChangeLog: * pt.cc (use_pack_expansion_extra_args_p): Remove an assert. gcc/testsuite/ChangeLog: * g++.dg/cpp0x/alias-decl-variadic3.C: New test. * g++.dg/cpp0x/alias-decl-variadic4.C: New test. --- gcc/cp/pt.cc | 11 ++++++++++- gcc/testsuite/g++.dg/cpp0x/alias-decl-variadic3.C | 13 +++++++++++++ gcc/testsuite/g++.dg/cpp0x/alias-decl-variadic4.C | 11 +++++++++++ 3 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/g++.dg/cpp0x/alias-decl-variadic3.C create mode 100644 gcc/testsuite/g++.dg/cpp0x/alias-decl-variadic4.C diff --git a/gcc/cp/pt.cc b/gcc/cp/pt.cc index 8aaae446868..35c68a6e3f2 100644 --- a/gcc/cp/pt.cc +++ b/gcc/cp/pt.cc @@ -13180,7 +13180,16 @@ use_pack_expansion_extra_args_p (tree t, if (has_expansion_arg && has_non_expansion_arg) { - gcc_checking_assert (false); + /* We can get here with: + + template <class... Ts> struct X { + template <class... Us> using Y = Z<void(Ts, Us)...>; + }; + template <class A, class... P> + using foo = X<int, int>::Y<A, P...>; + + where we compare int and A and then the second int and P..., + whose expansion-ness doesn't match, but that's OK. */ return true; } } diff --git a/gcc/testsuite/g++.dg/cpp0x/alias-decl-variadic3.C b/gcc/testsuite/g++.dg/cpp0x/alias-decl-variadic3.C new file mode 100644 index 00000000000..abac9d8b4c0 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/alias-decl-variadic3.C @@ -0,0 +1,13 @@ +// PR c++/118104 +// { dg-do compile { target c++11 } } + +template <class... Ts> struct X { + template <class... Us> using Y = X<void(Ts, Us)...>; +}; + +template <class A, class... P> +using any_pairs_list_4 = X<int, int>::Y<A, P...>; + +int main() { + any_pairs_list_4<int, int> array; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/alias-decl-variadic4.C b/gcc/testsuite/g++.dg/cpp0x/alias-decl-variadic4.C new file mode 100644 index 00000000000..c5311801a51 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/alias-decl-variadic4.C @@ -0,0 +1,11 @@ +// PR c++/118104 +// { dg-do compile { target c++11 } } + +template<typename... Zs> struct Z { }; + +template <class... Ts> struct X { + template <class... Us> using Y = Z<void(Ts, Us)...>; +}; + +template <class A, class... P> +using foo = X<int, int>::Y<A, P...>; base-commit: 051ca98a12908b9685d76b4432cff2f8f0f33368 -- 2.48.1