From b97af562b574697a4fff7fb8c69f579c01e70dec Mon Sep 17 00:00:00 2001 From: Nathan Sidwell Date: Wed, 10 Mar 2021 07:39:51 -0800 Subject: c++: Propagate assembler name from local-externs [PR 99508] This is another place where our one-true-decl representation breaks down. The fix here propagates the assembly name to the ns-scope alias. that fixes the reported problem but changes the behaviour when the user has explicitly declared the entity in its namespace. However, we didn't handle that case 'correctly' anyway before. Previously we'd also ignore the explicitly specified assembler name, now we propagate it. It's not clear to me what the desired semantics would be in decorating just one of the local extern declarations this way. I don't think we can really do better without propagating this aliasing property into the middle end (which is also needed for some constexpr handling, see PR97306). I tried that before and it turned into a rat-hole. PR c++/99508 gcc/cp/ * decl.c (make_rtl_for_nonlocal_decl): Propagate local-extern's assembler name to the ns alias. gcc/testsuite/ * g++.dg/ext/pr99508.C: New. --- gcc/cp/decl.c | 7 +++++++ gcc/testsuite/g++.dg/ext/pr99508.C | 20 ++++++++++++++++++++ 2 files changed, 27 insertions(+) create mode 100644 gcc/testsuite/g++.dg/ext/pr99508.C (limited to 'gcc') diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 1742e28..9c7f6e5 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -7157,6 +7157,13 @@ make_rtl_for_nonlocal_decl (tree decl, tree init, const char* asmspec) && fndecl_built_in_p (decl, BUILT_IN_NORMAL)) set_builtin_user_assembler_name (decl, asmspec); set_user_assembler_name (decl, asmspec); + if (DECL_LOCAL_DECL_P (decl)) + if (auto ns_decl = DECL_LOCAL_DECL_ALIAS (decl)) + /* We have to propagate the name to the ns-alias. + This is horrible, as we're affecting a + possibly-shared decl. Again, a one-true-decl + model breaks down. */ + set_user_assembler_name (ns_decl, asmspec); } } diff --git a/gcc/testsuite/g++.dg/ext/pr99508.C b/gcc/testsuite/g++.dg/ext/pr99508.C new file mode 100644 index 0000000..201a287 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/pr99508.C @@ -0,0 +1,20 @@ +// PR 99508, local exerns with aliased names +// { dg-do link } +int foo() +{ + void bar() asm ("bar_assembler"); + extern unsigned buzz asm("buzz_assembler"); + bar(); + return buzz; +} + +void ALIASbar () asm ("bar_assembler"); +void ALIASbar () +{ +} + +unsigned ALIASbuz asm ("buzz_assembler") = 5; + +int main () +{ +} -- cgit v1.1