On Mon, 17 Mar 2025, Marek Polacek wrote:

> 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...>;

This testcase seems to basically be a subset of the first one, maybe we
could merge them? e.g. keep the separate class template Z, and also
instantiate foo like in the first testcase.

> 
> base-commit: 051ca98a12908b9685d76b4432cff2f8f0f33368
> -- 
> 2.48.1
> 
> 

Reply via email to