Bootstrapped and regtested on x86_64-pc-linux-gnu, OK for trunk?
-- >8 --
This is a minimal fix to not just silently drop the section attribute on
stream-in. Ideally we should be using cplus_decl_attributes for this,
but it's not yet ready for modules (many attributes behave weirdly when
applied not during parsing). We should also be checking for
incompatible sections on stream-in in is_matching_decl, but that would
also be better handled more generally so I'm leaving that out of this
patch.
Instead this minimally fixes the issue by just re-applying the section
name from the attributes we've streamed in.
PR c++/122786
gcc/cp/ChangeLog:
* module.cc (trees_in::decl_value): Set section name from
attribute.
gcc/testsuite/ChangeLog:
* g++.dg/modules/attrib-5_a.C: New test.
* g++.dg/modules/attrib-5_b.C: New test.
Signed-off-by: Nathaniel Shead <[email protected]>
---
gcc/cp/module.cc | 11 +++++++++++
gcc/testsuite/g++.dg/modules/attrib-5_a.C | 12 ++++++++++++
gcc/testsuite/g++.dg/modules/attrib-5_b.C | 13 +++++++++++++
3 files changed, 36 insertions(+)
create mode 100644 gcc/testsuite/g++.dg/modules/attrib-5_a.C
create mode 100644 gcc/testsuite/g++.dg/modules/attrib-5_b.C
diff --git a/gcc/cp/module.cc b/gcc/cp/module.cc
index 566563272cd..78f9f3f4d41 100644
--- a/gcc/cp/module.cc
+++ b/gcc/cp/module.cc
@@ -9031,6 +9031,17 @@ trees_in::decl_value ()
&& decl_tls_wrapper_p (decl))
note_vague_linkage_fn (decl);
+ /* Apply relevant attributes.
+ FIXME should probably use cplus_decl_attributes for this,
+ but it's not yet ready for modules. */
+
+ if (VAR_OR_FUNCTION_DECL_P (inner))
+ if (tree attr = lookup_attribute ("section", DECL_ATTRIBUTES (inner)))
+ {
+ tree section_name = TREE_VALUE (TREE_VALUE (attr));
+ set_decl_section_name (inner, TREE_STRING_POINTER (section_name));
+ }
+
/* Setup aliases for the declaration. */
if (tree alias = lookup_attribute ("alias", DECL_ATTRIBUTES (decl)))
{
diff --git a/gcc/testsuite/g++.dg/modules/attrib-5_a.C
b/gcc/testsuite/g++.dg/modules/attrib-5_a.C
new file mode 100644
index 00000000000..5c0cac4f51d
--- /dev/null
+++ b/gcc/testsuite/g++.dg/modules/attrib-5_a.C
@@ -0,0 +1,12 @@
+// PR c++/122786
+// { dg-additional-options "-fmodules" }
+// { dg-require-effective-target named_sections }
+// { dg-module-cmi M }
+
+export module M;
+
+export inline void a() __attribute__((section("barbar")));
+inline void a() {}
+
+export [[gnu::section("quxqux")]] inline void b();
+inline void b() {}
diff --git a/gcc/testsuite/g++.dg/modules/attrib-5_b.C
b/gcc/testsuite/g++.dg/modules/attrib-5_b.C
new file mode 100644
index 00000000000..31ece58f9f3
--- /dev/null
+++ b/gcc/testsuite/g++.dg/modules/attrib-5_b.C
@@ -0,0 +1,13 @@
+// PR c++/122786
+// { dg-additional-options "-fmodules" }
+// { dg-require-effective-target named_sections }
+
+import M;
+
+int main() {
+ a();
+ b();
+}
+
+// { dg-final { scan-assembler {barbar} } }
+// { dg-final { scan-assembler {quxqux} } }
--
2.51.0