From f0c761165929cded4ae08fd5151b483f786bb1b0 Mon Sep 17 00:00:00 2001 From: Nathaniel Shead Date: Sun, 17 Aug 2025 13:00:15 +1000 Subject: c++/modules: Fix exporting using-decls of unattached purview functions [PR120195] 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 --- gcc/cp/name-lookup.cc | 6 ++++-- gcc/testsuite/g++.dg/modules/using-32_a.C | 13 +++++++++++++ gcc/testsuite/g++.dg/modules/using-32_b.C | 9 +++++++++ 3 files changed, 26 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/g++.dg/modules/using-32_a.C create mode 100644 gcc/testsuite/g++.dg/modules/using-32_b.C (limited to 'gcc') diff --git a/gcc/cp/name-lookup.cc b/gcc/cp/name-lookup.cc index fa36721..4614790 100644 --- a/gcc/cp/name-lookup.cc +++ b/gcc/cp/name-lookup.cc @@ -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 index 0000000..2d51b36 --- /dev/null +++ b/gcc/testsuite/g++.dg/modules/using-32_a.C @@ -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 index 0000000..7e6af5e --- /dev/null +++ b/gcc/testsuite/g++.dg/modules/using-32_b.C @@ -0,0 +1,9 @@ +// PR c++/120195 +// { dg-additional-options "-fmodules" } + +import M; + +int main() { + foo(); + bar(); +} -- cgit v1.1