aboutsummaryrefslogtreecommitdiff
path: root/gcc/cp/mangle.cc
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2023-10-06 11:41:20 -0400
committerJason Merrill <jason@redhat.com>2023-10-10 17:23:15 -0400
commitbd5719bd7f7cb23e5ed96a1f1a28efbb3dec4a31 (patch)
treeab28d134a71e3f30ef1138fb6da1573464bdcf82 /gcc/cp/mangle.cc
parent975da6fa9170c9cf1ec4a9a9d8177f8561d464d1 (diff)
downloadgcc-bd5719bd7f7cb23e5ed96a1f1a28efbb3dec4a31.zip
gcc-bd5719bd7f7cb23e5ed96a1f1a28efbb3dec4a31.tar.gz
gcc-bd5719bd7f7cb23e5ed96a1f1a28efbb3dec4a31.tar.bz2
c++: mangle multiple levels of template parms [PR109422]
This becomes be more important with concepts, but can also be seen with generic lambdas. PR c++/109422 gcc/cp/ChangeLog: * mangle.cc (write_template_param): Also mangle level. gcc/testsuite/ChangeLog: * g++.dg/cpp2a/lambda-generic-mangle1.C: New test. * g++.dg/cpp2a/lambda-generic-mangle1a.C: New test.
Diffstat (limited to 'gcc/cp/mangle.cc')
-rw-r--r--gcc/cp/mangle.cc13
1 files changed, 13 insertions, 0 deletions
diff --git a/gcc/cp/mangle.cc b/gcc/cp/mangle.cc
index d88c779..d079f72 100644
--- a/gcc/cp/mangle.cc
+++ b/gcc/cp/mangle.cc
@@ -3921,6 +3921,7 @@ static void
write_template_param (const tree parm)
{
int parm_index;
+ int level;
MANGLE_TRACE_TREE ("template-parm", parm);
@@ -3930,10 +3931,12 @@ write_template_param (const tree parm)
case TEMPLATE_TEMPLATE_PARM:
case BOUND_TEMPLATE_TEMPLATE_PARM:
parm_index = TEMPLATE_TYPE_IDX (parm);
+ level = TEMPLATE_TYPE_LEVEL (parm);
break;
case TEMPLATE_PARM_INDEX:
parm_index = TEMPLATE_PARM_IDX (parm);
+ level = TEMPLATE_PARM_LEVEL (parm);
break;
default:
@@ -3941,6 +3944,16 @@ write_template_param (const tree parm)
}
write_char ('T');
+ if (level > 1)
+ {
+ if (abi_warn_or_compat_version_crosses (19))
+ G.need_abi_warning = 1;
+ if (abi_version_at_least (19))
+ {
+ write_char ('L');
+ write_compact_number (level - 1);
+ }
+ }
/* NUMBER as it appears in the mangling is (-1)-indexed, with the
earliest template param denoted by `_'. */
write_compact_number (parm_index);