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 <jason@redhat.com>
This commit is contained in:
Patrick Palka
2026-01-26 22:00:16 -05:00
parent 9cb5c879e7
commit 22f51c0f5e
2 changed files with 12 additions and 1 deletions

View File

@@ -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;
}
}

View File

@@ -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;
}