https://gcc.gnu.org/g:22f51c0f5e62a4e05bccbd0dfb23762ef2eeeff8
commit r16-7056-g22f51c0f5e62a4e05bccbd0dfb23762ef2eeeff8 Author: Patrick Palka <[email protected]> Date: Mon Jan 26 22:00:16 2026 -0500 c++: non-dep decltype folding of concept-id C<Ts...> [PR123676] Here since the expression within the decltype C<Ts...> is not instantiation dependent (we know its type is bool, and don't care about its value) finish_decltype_type instantiates it immediately via the usual tsubst_expr with NULL_TREE args. During which however tsubst_pack_expansion isn't prepared to handle such a substitution due to an overly strict assert. This patch relaxes the assert accordingly. PR c++/123676 gcc/cp/ChangeLog: * pt.cc (tsubst_pack_expansion): Relax unsubsituted_packs assert to allow !processing_template_decl when args is NULL_TREE. gcc/testsuite/ChangeLog: * g++.dg/cpp2a/concepts-decltype5.C: New test. Reviewed-by: Jason Merrill <[email protected]> Diff: --- gcc/cp/pt.cc | 3 ++- gcc/testsuite/g++.dg/cpp2a/concepts-decltype5.C | 10 ++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/gcc/cp/pt.cc b/gcc/cp/pt.cc index 4906de000e66..5993e7b5d0e1 100644 --- a/gcc/cp/pt.cc +++ b/gcc/cp/pt.cc @@ -14146,7 +14146,8 @@ tsubst_pack_expansion (tree t, tree args, tsubst_flags_t complain, /* We can't substitute for this parameter pack. We use a flag as well as the missing_level counter because function parameter packs don't have a level. */ - gcc_assert (processing_template_decl || is_auto (parm_pack)); + gcc_assert (processing_template_decl || is_auto (parm_pack) + || args == NULL_TREE); unsubstituted_packs = true; } } diff --git a/gcc/testsuite/g++.dg/cpp2a/concepts-decltype5.C b/gcc/testsuite/g++.dg/cpp2a/concepts-decltype5.C new file mode 100644 index 000000000000..1b6f7f78f2c3 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp2a/concepts-decltype5.C @@ -0,0 +1,10 @@ +// PR c++/123676 +// { dg-do compile { target c++20 } } + +template<class...> +concept C = true; + +template<class... Ts> +auto f() -> decltype(C<Ts...>) { + return true; +}
