]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
c++/modules: Fix exporting using-decls of unattached purview functions [PR120195]
authorNathaniel Shead <nathanieloshead@gmail.com>
Sun, 17 Aug 2025 03:00:15 +0000 (13:00 +1000)
committerNathaniel Shead <nathanieloshead@gmail.com>
Tue, 19 Aug 2025 02:32:17 +0000 (12:32 +1000)
We have logic to adjust a function decl if it gets re-declared as a
using-decl with different purviewness, but we also need to do the same
if it gets redeclared with different exportedness.

PR c++/120195

gcc/cp/ChangeLog:

* name-lookup.cc (do_nonmember_using_decl): Also handle change
in exportedness of a function.

gcc/testsuite/ChangeLog:

* g++.dg/modules/using-32_a.C: New test.
* g++.dg/modules/using-32_b.C: New test.

Signed-off-by: Nathaniel Shead <nathanieloshead@gmail.com>
gcc/cp/name-lookup.cc
gcc/testsuite/g++.dg/modules/using-32_a.C [new file with mode: 0644]
gcc/testsuite/g++.dg/modules/using-32_b.C [new file with mode: 0644]

index fa367214507e0d2950dbad6474d491f4d5e9b18d..46147905e0416380a3ece6171a8df73e55e8a59c 100644 (file)
@@ -5356,7 +5356,8 @@ do_nonmember_using_decl (name_lookup &lookup, bool fn_scope_p,
                        OVL_EXPORT_P (old.get_using ()) = true;
                    }
                  else if (!DECL_LANG_SPECIFIC (inner)
-                          || !DECL_MODULE_PURVIEW_P (inner))
+                          || !DECL_MODULE_PURVIEW_P (inner)
+                          || (exporting_p && !DECL_MODULE_EXPORT_P (inner)))
                    /* We need to re-insert this function as a revealed
                       (possibly exported) declaration.  We can't remove
                       the existing decl because that will change any
@@ -5378,7 +5379,8 @@ do_nonmember_using_decl (name_lookup &lookup, bool fn_scope_p,
                  found = true;
                  if (revealing_p
                      && (!DECL_LANG_SPECIFIC (inner)
-                         || !DECL_MODULE_PURVIEW_P (inner)))
+                         || !DECL_MODULE_PURVIEW_P (inner)
+                         || (exporting_p && !DECL_MODULE_EXPORT_P (inner))))
                    found = false;
                  break;
                }
diff --git a/gcc/testsuite/g++.dg/modules/using-32_a.C b/gcc/testsuite/g++.dg/modules/using-32_a.C
new file mode 100644 (file)
index 0000000..2d51b36
--- /dev/null
@@ -0,0 +1,13 @@
+// PR c++/120195
+// { dg-additional-options "-fmodules" }
+
+export module M;
+
+extern "C++" void foo() {}
+export using ::foo;
+
+namespace ns {
+  extern "C" void bar() {}
+}
+extern "C" void bar();
+export using ns::bar;
diff --git a/gcc/testsuite/g++.dg/modules/using-32_b.C b/gcc/testsuite/g++.dg/modules/using-32_b.C
new file mode 100644 (file)
index 0000000..7e6af5e
--- /dev/null
@@ -0,0 +1,9 @@
+// PR c++/120195
+// { dg-additional-options "-fmodules" }
+
+import M;
+
+int main() {
+  foo();
+  bar();
+}