From bd5719bd7f7cb23e5ed96a1f1a28efbb3dec4a31 Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Fri, 6 Oct 2023 11:41:20 -0400 Subject: 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. --- gcc/cp/mangle.cc | 13 +++++++++++++ 1 file changed, 13 insertions(+) (limited to 'gcc/cp/mangle.cc') 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); -- cgit v1.1