On Fri, 6 Feb 2026, Patrick Palka wrote:
> Bootstrapped and regtested on x86_64-pc-linux-gnu, does this look
> OK for trunk/15?
>
> -- >8 --
>
> Like in r15-6740-g27d620d6769715 for instantiate_template, we also need
... for instantiate_template with dependent arguments, to be more
precise.
> to set tf_partial during the alias_ctad_tweaks transformation mainly for
> benefit of properly handling extra-args trees.
>
> In this testcase during alias_ctad_tweaks we substitute
> ElemTs={Tuple<Us...>}, Ts={Ts...} into the requires-clause, which
> tsubst_pack_expansion decides to defer via extra-args, and for the
> subsequent add_extra_args to merge the deferred dependent arguments
> tf_partial has to have been set earlier.
>
> PR c++/122621
>
> gcc/cp/ChangeLog:
>
> * pt.cc (tsubst_pack_expansion): Use tf_partial instead of
> tf_none, except when substituting outer (non-dependent) template
> arguments.
>
> gcc/testsuite/ChangeLog:
>
> * g++.dg/cpp2a/class-deduction-alias26.C: New test.
> ---
> gcc/cp/pt.cc | 5 +++--
> .../g++.dg/cpp2a/class-deduction-alias26.C | 17 +++++++++++++++++
> 2 files changed, 20 insertions(+), 2 deletions(-)
> create mode 100644 gcc/testsuite/g++.dg/cpp2a/class-deduction-alias26.C
>
> diff --git a/gcc/cp/pt.cc b/gcc/cp/pt.cc
> index 1ee8e2fff7df..f30840c83a27 100644
> --- a/gcc/cp/pt.cc
> +++ b/gcc/cp/pt.cc
> @@ -31711,7 +31711,7 @@ alias_ctad_tweaks (tree tmpl, tree uguides)
> (INNERMOST_TEMPLATE_PARMS (fullatparms)));
> }
>
> - tsubst_flags_t complain = tf_none;
> + tsubst_flags_t complain = tf_partial;
> tree aguides = NULL_TREE;
> tree atparms = INNERMOST_TEMPLATE_PARMS (fullatparms);
> unsigned natparms = TREE_VEC_LENGTH (atparms);
> @@ -31818,7 +31818,8 @@ alias_ctad_tweaks (tree tmpl, tree uguides)
> if (ci)
> {
> if (tree outer_targs = outer_template_args (f))
> - ci = tsubst_constraint_info (ci, outer_targs, complain,
> in_decl);
> + ci = tsubst_constraint_info (ci, outer_targs,
> + complain & ~tf_partial, in_decl);
> ci = tsubst_constraint_info (ci, targs, complain, in_decl);
> }
> if (ci == error_mark_node)
> diff --git a/gcc/testsuite/g++.dg/cpp2a/class-deduction-alias26.C
> b/gcc/testsuite/g++.dg/cpp2a/class-deduction-alias26.C
> new file mode 100644
> index 000000000000..01fd1a4d5e25
> --- /dev/null
> +++ b/gcc/testsuite/g++.dg/cpp2a/class-deduction-alias26.C
> @@ -0,0 +1,17 @@
> +// PR c++/122621
> +// { dg-do compile { target c++20 } }
> +
> +template <class, class>
> +concept constructible_from = true;
> +
> +template <class... ElemTs>
> +struct Tuple {
> + template <class... Ts> requires (... && constructible_from<ElemTs, Ts>)
> + Tuple(Ts &&...) {}
> +};
> +
> +template <class... Us>
> +using A = Tuple<Tuple<Us...>>;
> +
> +using type = decltype(A{0});
> +using type = Tuple<Tuple<>>;
> --
> 2.53.0.rc1.65.gea24e2c554
>
>