On 2/6/26 11:21 PM, Patrick Palka wrote:
Bootstrapped and regtested on x86_64-pc-linux-gnu, does this look OK for trunk/15?
OK.
-- >8 -- Like in r15-6740-g27d620d6769715 for instantiate_template, we also need 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<>>;
