From: Jason Merrill Date: Fri, 6 Oct 2023 15:41:20 +0000 (-0400) Subject: c++: mangle multiple levels of template parms [PR109422] X-Git-Tag: basepoints/gcc-15~5595 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=bd5719bd7f7cb23e5ed96a1f1a28efbb3dec4a31;p=thirdparty%2Fgcc.git 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. --- diff --git a/gcc/cp/mangle.cc b/gcc/cp/mangle.cc index d88c779bfa2e..d079f724910b 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); diff --git a/gcc/testsuite/g++.dg/cpp2a/lambda-generic-mangle1.C b/gcc/testsuite/g++.dg/cpp2a/lambda-generic-mangle1.C new file mode 100644 index 000000000000..0051307f53de --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp2a/lambda-generic-mangle1.C @@ -0,0 +1,9 @@ +// PR c++/109422 +// { dg-do compile { target c++20 } } + +struct C { + template + void f(decltype([](T, auto) { return 0; })) {} +}; +void g() { C().f({}); } +// { dg-final { scan-assembler "_ZN1C1fIiEEvDTtlNS_UlT_TL0__E_EEE" } } diff --git a/gcc/testsuite/g++.dg/cpp2a/lambda-generic-mangle1a.C b/gcc/testsuite/g++.dg/cpp2a/lambda-generic-mangle1a.C new file mode 100644 index 000000000000..dc7b0125631c --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp2a/lambda-generic-mangle1a.C @@ -0,0 +1,10 @@ +// PR c++/109422 +// { dg-do compile { target c++20 } } +// { dg-additional-options "-fabi-version=18" } + +struct C { + template + void f(decltype([](T, auto) { return 0; })) {} +}; +void g() { C().f({}); } +// { dg-final { scan-assembler "_ZN1C1fIiEEvDTtlNS_UlT_T_E_EEE" } }