aboutsummaryrefslogtreecommitdiff
path: root/gcc/cp/pt.cc
diff options
context:
space:
mode:
authorPatrick Palka <ppalka@redhat.com>2022-12-19 14:59:43 -0500
committerPatrick Palka <ppalka@redhat.com>2022-12-19 15:26:37 -0500
commita7c8036b26082d8da001e05596777c5f911590e1 (patch)
treeea82a5dfb0304b3a29ece9f18a8da7ea45ef56a9 /gcc/cp/pt.cc
parenta39f454f0faf0734c7d040c9d8523f71be821000 (diff)
downloadgcc-a7c8036b26082d8da001e05596777c5f911590e1.zip
gcc-a7c8036b26082d8da001e05596777c5f911590e1.tar.gz
gcc-a7c8036b26082d8da001e05596777c5f911590e1.tar.bz2
c++: ICE with concepts TS multiple auto deduction [PR101886]
In extract_autos_r, we need to recompute TYPE_CANONICAL for the template type parameter after adjusting its index, otherwise we end up with a comptypes ICE for the below testcase. Note that such in-place type adjustment isn't generally safe to do since the type could be the TYPE_CANONICAL of another (unadjusted) type, but in this case the canonical auto (of some level and 0 index) is the first auto (of that level) that's created, and so any auto that we do end up adjusting can't be the canonical one. PR c++/101886 gcc/cp/ChangeLog: * pt.cc (extract_autos_r): Recompute TYPE_CANONICAL after adjusting the template type parameter's index. Simplify by using TEMPLATE_TYPE_IDX. Add some sanity checks. gcc/testsuite/ChangeLog: * g++.dg/concepts/auto5.C: New test.
Diffstat (limited to 'gcc/cp/pt.cc')
-rw-r--r--gcc/cp/pt.cc12
1 files changed, 9 insertions, 3 deletions
diff --git a/gcc/cp/pt.cc b/gcc/cp/pt.cc
index 2516cca..2b7b375 100644
--- a/gcc/cp/pt.cc
+++ b/gcc/cp/pt.cc
@@ -29243,18 +29243,24 @@ extract_autos_r (tree t, void *data)
{
/* All the autos were built with index 0; fix that up now. */
tree *p = hash.find_slot (t, INSERT);
- unsigned idx;
+ int idx;
if (*p)
/* If this is a repeated constrained-type-specifier, use the index we
chose before. */
- idx = TEMPLATE_PARM_IDX (TEMPLATE_TYPE_PARM_INDEX (*p));
+ idx = TEMPLATE_TYPE_IDX (*p);
else
{
/* Otherwise this is new, so use the current count. */
*p = t;
idx = hash.elements () - 1;
}
- TEMPLATE_PARM_IDX (TEMPLATE_TYPE_PARM_INDEX (t)) = idx;
+ if (idx != TEMPLATE_TYPE_IDX (t))
+ {
+ gcc_checking_assert (TEMPLATE_TYPE_IDX (t) == 0);
+ gcc_checking_assert (TYPE_CANONICAL (t) != t);
+ TEMPLATE_TYPE_IDX (t) = idx;
+ TYPE_CANONICAL (t) = canonical_type_parameter (t);
+ }
}
/* Always keep walking. */