On 4/1/26 5:59 AM, Jakub Jelinek wrote:
Hi!
In
https://github.com/itanium-cxx-abi/cxx-abi/issues/208#issuecomment-3518384358
Richard Smith suggested (among other things) to use gs instead of ng
for ^^:: mangling, because gs is already used elsewhere in the grammar for
similar purposes (like [gs] nw <expression>* _ <type> E etc.).
This patch changes that, plus added the part I forgot to update when
mangling the annotations.
Tested on x86_64-linux, ok for trunk?
OK.
Note, in
https://github.com/itanium-cxx-abi/cxx-abi/issues/208#issuecomment-3571323241
Tim Song mentioned that perhaps for L Dm ta ... E we should be including
both the <alias prefix> and underlying <type> (probably with some
separation), because different TUs could have different aliases. Or shall
all decls which refer to type aliases be TU local?
They aren't TU-local under https://eel.is/c++draft/basic#link-16.4
I think mangling the underlying type makes sense.
2026-04-01 Jakub Jelinek <[email protected]>
* mangle.cc (write_reflection): Change ^^:: mangling in grammar
from LDmngE to LDmgsE.
* reflect.cc (reflection_mangle_prefix): Set prefix to "gs" rather
than "ng" for global_namespace.
* g++.dg/reflect/mangle1.C: Expect _Z3barILi310ELDmgsEEvv
rather than _Z3barILi310ELDmngEEvv.
--- gcc/cp/mangle.cc.jj 2026-04-01 11:27:32.663770476 +0200
+++ gcc/cp/mangle.cc 2026-04-01 11:32:45.081468378 +0200
@@ -4145,11 +4145,11 @@ write_expression (tree expr)
::= co [ <prefix> ] <unqualified-name> # concept
::= na [ <prefix> ] <unqualified-name> # namespace alias
::= ns [ <prefix> ] <unqualified-name> # namespace
- ::= ng # ^^::
+ ::= gs # ^^::
::= ba [ <nonnegative number> ] _ <type> # dir. base cls rel
::= ds <type> _ [ <unqualified-name> ] _
[ <alignment number> ] _ [ <bit-width number> ] _
- [ n ] # data member spec */
+ [ n ] <template-arg>* # data member spec */
static void
write_reflection (tree refl)
--- gcc/cp/reflect.cc.jj 2026-04-01 11:27:32.664770459 +0200
+++ gcc/cp/reflect.cc 2026-04-01 11:31:20.848897905 +0200
@@ -8884,7 +8884,7 @@ reflection_mangle_prefix (tree refl, cha
{
if (h == global_namespace)
{
- strcpy (prefix, "ng");
+ strcpy (prefix, "gs");
return NULL_TREE;
}
strcpy (prefix, "ns");
--- gcc/testsuite/g++.dg/reflect/mangle1.C.jj 2026-04-01 00:03:32.626480833
+0200
+++ gcc/testsuite/g++.dg/reflect/mangle1.C 2026-04-01 11:33:18.949893591
+0200
@@ -246,7 +246,7 @@ baz (int x)
// { dg-final { scan-assembler "_Z3barILi291ELDmna3NS27NSAliasEEvv" } }
// { dg-final { scan-assembler "_Z3barILi300ELDmns2NSEEvv" } }
// { dg-final { scan-assembler "_Z3barILi301ELDmns3NS23NS3EEvv" } }
-// { dg-final { scan-assembler "_Z3barILi310ELDmngEEvv" } }
+// { dg-final { scan-assembler "_Z3barILi310ELDmgsEEvv" } }
// { dg-final { scan-assembler "_Z3barILi320ELDmba_1SEEvv" } }
// { dg-final { scan-assembler "_Z3barILi321ELDmba_N3NS21SEEEvv" } }
// { dg-final { scan-assembler "_Z3barILi322ELDmba_N3NS21WIiEEEEvv" } }
Jakub