aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2024-06-12 08:06:47 -0400
committerJason Merrill <jason@redhat.com>2024-06-12 16:30:42 -0400
commit074c1fc797435979c00b24aff2a4f895b8273bcf (patch)
tree113137380835b869f8d748bec1171d2af5ff9ae8
parentf8356d66cfbda1e65536016d3049342a43f6af63 (diff)
downloadgcc-074c1fc797435979c00b24aff2a4f895b8273bcf.zip
gcc-074c1fc797435979c00b24aff2a4f895b8273bcf.tar.gz
gcc-074c1fc797435979c00b24aff2a4f895b8273bcf.tar.bz2
c++: repeated export using
A sample implementation of module std was breaking because the exports included 'using std::operator&' twice. Since Nathaniel's r15-964 for PR114867, the first using added an extra instance of each function that was revealed/exported by that using, resulting in duplicates for lookup_maybe_add to dedup. But if the duplicate is the first thing in the list, lookup_add doesn't make an OVERLOAD, so trying to set OVL_USING_P crashes. Fixed by using ovl_make in the case where we want to set the flag. gcc/cp/ChangeLog: * tree.cc (lookup_maybe_add): Use ovl_make when setting OVL_USING_P. gcc/testsuite/ChangeLog: * g++.dg/modules/using-21_a.C: New test.
-rw-r--r--gcc/cp/tree.cc8
-rw-r--r--gcc/testsuite/g++.dg/modules/using-21_a.C11
2 files changed, 17 insertions, 2 deletions
diff --git a/gcc/cp/tree.cc b/gcc/cp/tree.cc
index d2a8f79..28648c1 100644
--- a/gcc/cp/tree.cc
+++ b/gcc/cp/tree.cc
@@ -2526,11 +2526,15 @@ lookup_maybe_add (tree fns, tree lookup, bool deduping)
predecessors onto the lookup. */
for (; fns != probe; fns = OVL_CHAIN (fns))
{
- lookup = lookup_add (OVL_FUNCTION (fns), lookup);
/* Propagate OVL_USING, but OVL_HIDDEN &
OVL_DEDUP_P don't matter. */
if (OVL_USING_P (fns))
- OVL_USING_P (lookup) = true;
+ {
+ lookup = ovl_make (OVL_FUNCTION (fns), lookup);
+ OVL_USING_P (lookup) = true;
+ }
+ else
+ lookup = lookup_add (OVL_FUNCTION (fns), lookup);
}
/* And now skip this function. */
diff --git a/gcc/testsuite/g++.dg/modules/using-21_a.C b/gcc/testsuite/g++.dg/modules/using-21_a.C
new file mode 100644
index 0000000..ce6e3f9
--- /dev/null
+++ b/gcc/testsuite/g++.dg/modules/using-21_a.C
@@ -0,0 +1,11 @@
+// { dg-additional-options "-fmodules-ts -Wno-global-module" }
+
+module;
+namespace foo {
+ void baz();
+}
+export module foo;
+namespace foo {
+ export using foo::baz;
+ export using foo::baz;
+}