Skip to content
Snippets Groups Projects
Commit c755e1b3 authored by Patrick Palka's avatar Patrick Palka
Browse files

c++: variadic class template placeholder deduction [PR97134]

do_class_deduction handles specially the case where we're deducing one
placeholder from another equivalent one, but here the initializer passed
to do_class_deduction is wrapped in an EXPR_PACK_EXPANSION (we're being
called from unify during get_partial_spec_bindings).  This patch makes
do_class_deduction look through EXPR_PACK_EXPANSIONs so that we detect
this case as well.

gcc/cp/ChangeLog:

	PR c++/97134
	* pt.c (do_class_deduction): Look through EXPR_PACK_EXPANSION
	when checking if the initializer is an equivalent class
	placeholder template parameter.

gcc/testsuite/ChangeLog:

	PR c++/97134
	* g++.dg/cpp2a/nontype-class43.C: New test.
parent 59d9aa6d
No related branches found
No related tags found
No related merge requests found
......@@ -29286,7 +29286,11 @@ do_class_deduction (tree ptype, tree tmpl, tree init,
return ptype;
 
/* Initializing one placeholder from another. */
if (init && TREE_CODE (init) == TEMPLATE_PARM_INDEX
if (init
&& (TREE_CODE (init) == TEMPLATE_PARM_INDEX
|| (TREE_CODE (init) == EXPR_PACK_EXPANSION
&& (TREE_CODE (PACK_EXPANSION_PATTERN (init))
== TEMPLATE_PARM_INDEX)))
&& is_auto (TREE_TYPE (init))
&& CLASS_PLACEHOLDER_TEMPLATE (TREE_TYPE (init)) == tmpl)
return cp_build_qualified_type (TREE_TYPE (init), cp_type_quals (ptype));
......
// PR c++/97134
// { dg-do compile { target c++20 } }
template<typename T>
struct templ {};
template<templ... Vs>
struct wrapper {};
template<templ... Vs> requires true
struct wrapper<Vs...> {};
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment