aboutsummaryrefslogtreecommitdiff
path: root/gcc/cp/pt.c
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/cp/pt.c')
-rw-r--r--gcc/cp/pt.c12
1 files changed, 7 insertions, 5 deletions
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index e991a32..2d3ab92 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -8266,7 +8266,7 @@ convert_template_argument (tree parm,
/* When determining whether an argument pack expansion is a template,
look at the pattern. */
- if (TREE_CODE (arg) == TYPE_PACK_EXPANSION)
+ if (PACK_EXPANSION_P (arg))
arg = PACK_EXPANSION_PATTERN (arg);
/* Deal with an injected-class-name used as a template template arg. */
@@ -29013,6 +29013,12 @@ do_class_deduction (tree ptype, tree tmpl, tree init,
if (DECL_TEMPLATE_TEMPLATE_PARM_P (tmpl))
return ptype;
+ /* Initializing one placeholder from another. */
+ if (init && TREE_CODE (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));
+
/* Look through alias templates that just rename another template. */
tmpl = get_underlying_template (tmpl);
if (!ctad_template_p (tmpl))
@@ -29029,10 +29035,6 @@ do_class_deduction (tree ptype, tree tmpl, tree init,
"with %<-std=c++20%> or %<-std=gnu++20%>");
}
- if (init && TREE_TYPE (init) == ptype)
- /* Using the template parm as its own argument. */
- return ptype;
-
tree type = TREE_TYPE (tmpl);
bool try_list_ctor = false;