]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
c++: repeated export using
authorJason Merrill <jason@redhat.com>
Wed, 12 Jun 2024 12:06:47 +0000 (08:06 -0400)
committerJason Merrill <jason@redhat.com>
Wed, 12 Jun 2024 20:30:42 +0000 (16:30 -0400)
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.

gcc/cp/tree.cc
gcc/testsuite/g++.dg/modules/using-21_a.C [new file with mode: 0644]

index d2a8f79ffab46bf5af9541f2a147bde674fd1ddb..28648c14c6da0d3a8d1c8ca9168f06226a4f874e 100644 (file)
@@ -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 (file)
index 0000000..ce6e3f9
--- /dev/null
@@ -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;
+}