Bootstrapped and regtested (so far just modules.exp) on
x86_64-pc-linux-gnu, OK for trunk/15 if full regtest passes?
-- >8 --
When a TU synthesizes a definition of a defaulted member function we
mark the TU that did this as the originating module, and so export it
from there. If this TU is imported into a module that already has a
declaration of this entity the declarations should be merged.
This patch fixes an issue where this merging was not occurring for
explicitly defaulted member functions, by checking DECL_DEFAULTED_FN
instead of just DECL_ARTIFICIAL.
PR c++/124311
gcc/cp/ChangeLog:
* module.cc (trees_in::key_mergeable): Check DECL_DEFAULTED_FN
instead of DECL_ARTIFICIAL.
gcc/testsuite/ChangeLog:
* g++.dg/modules/imp-member-5_a.C: New test.
* g++.dg/modules/imp-member-5_b.C: New test.
* g++.dg/modules/imp-member-5_c.C: New test.
Signed-off-by: Nathaniel Shead <[email protected]>
---
gcc/cp/module.cc | 10 +++++-----
gcc/testsuite/g++.dg/modules/imp-member-5_a.C | 9 +++++++++
gcc/testsuite/g++.dg/modules/imp-member-5_b.C | 8 ++++++++
gcc/testsuite/g++.dg/modules/imp-member-5_c.C | 5 +++++
4 files changed, 27 insertions(+), 5 deletions(-)
create mode 100644 gcc/testsuite/g++.dg/modules/imp-member-5_a.C
create mode 100644 gcc/testsuite/g++.dg/modules/imp-member-5_b.C
create mode 100644 gcc/testsuite/g++.dg/modules/imp-member-5_c.C
diff --git a/gcc/cp/module.cc b/gcc/cp/module.cc
index ccbf124876d..49be27181a1 100644
--- a/gcc/cp/module.cc
+++ b/gcc/cp/module.cc
@@ -12322,11 +12322,11 @@ trees_in::key_mergeable (int tag, merge_kind mk, tree
decl, tree inner,
case TYPE_DECL:
gcc_checking_assert (!is_imported_temploid_friend);
if (is_attached && !(state->is_module () || state->is_partition ())
- /* Implicit member functions can come from
- anywhere. */
- && !(DECL_ARTIFICIAL (decl)
- && TREE_CODE (decl) == FUNCTION_DECL
- && !DECL_THUNK_P (decl)))
+ /* Implicit or defaulted member functions can
+ come from anywhere. */
+ && !(TREE_CODE (decl) == FUNCTION_DECL
+ && !DECL_THUNK_P (decl)
+ && DECL_DEFAULTED_FN (decl)))
kind = "unique";
else
{
diff --git a/gcc/testsuite/g++.dg/modules/imp-member-5_a.C
b/gcc/testsuite/g++.dg/modules/imp-member-5_a.C
new file mode 100644
index 00000000000..6f9482cb679
--- /dev/null
+++ b/gcc/testsuite/g++.dg/modules/imp-member-5_a.C
@@ -0,0 +1,9 @@
+// PR c++/124311
+// { dg-additional-options "-fmodules" }
+// { dg-module-cmi A }
+
+export module A;
+export struct S {
+ int x = 0;
+ S() = default;
+};
diff --git a/gcc/testsuite/g++.dg/modules/imp-member-5_b.C
b/gcc/testsuite/g++.dg/modules/imp-member-5_b.C
new file mode 100644
index 00000000000..d55219a8eba
--- /dev/null
+++ b/gcc/testsuite/g++.dg/modules/imp-member-5_b.C
@@ -0,0 +1,8 @@
+// PR c++/124311
+// { dg-additional-options "-fmodules" }
+// { dg-module-cmi B }
+
+export module B;
+export import A;
+export struct M { S h; };
+M m;
diff --git a/gcc/testsuite/g++.dg/modules/imp-member-5_c.C
b/gcc/testsuite/g++.dg/modules/imp-member-5_c.C
new file mode 100644
index 00000000000..39770acd362
--- /dev/null
+++ b/gcc/testsuite/g++.dg/modules/imp-member-5_c.C
@@ -0,0 +1,5 @@
+// PR c++/124311
+// { dg-additional-options "-fmodules" }
+
+import B;
+M m2;
--
2.51.0