]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
c++: Seed namespaces for bindings [PR106363]
authorNathaniel Shead <nathanieloshead@gmail.com>
Sun, 12 Nov 2023 00:54:43 +0000 (11:54 +1100)
committerNathaniel Shead <nathanieloshead@gmail.com>
Sat, 16 Dec 2023 23:38:35 +0000 (10:38 +1100)
Currently the first depset for an EK_BINDING is not seeded. This breaks
the attached testcase as then the namespace is not considered referenced
yet during streaming, but we've already finished importing.

There doesn't seem to be any particular reason I could find for skipping
the first depset for bindings, and removing the condition doesn't appear
to cause any test failures, so this patch removes that check.

PR c++/106363

gcc/cp/ChangeLog:

* module.cc (module_state::write_cluster): Don't skip first
depset for bindings.

gcc/testsuite/ChangeLog:

* g++.dg/modules/pr106363_a.C: New test.
* g++.dg/modules/pr106363_b.C: New test.

Signed-off-by: Nathaniel Shead <nathanieloshead@gmail.com>
gcc/cp/module.cc
gcc/testsuite/g++.dg/modules/pr106363_a.C [new file with mode: 0644]
gcc/testsuite/g++.dg/modules/pr106363_b.C [new file with mode: 0644]

index 1b57fbe212418f21c27a095baeb65474ed796bbc..0bd46414da92d398abdf0fbbcc3950dd3f60be40 100644 (file)
@@ -14761,9 +14761,7 @@ module_state::write_cluster (elf_out *to, depset *scc[], unsigned size,
   for (unsigned ix = 0; ix != size; ix++)
     {
       depset *b = scc[ix];
-      for (unsigned jx = (b->get_entity_kind () == depset::EK_BINDING
-                         || b->is_special ()) ? 1 : 0;
-          jx != b->deps.length (); jx++)
+      for (unsigned jx = b->is_special (); jx != b->deps.length (); jx++)
        {
          depset *dep = b->deps[jx];
 
diff --git a/gcc/testsuite/g++.dg/modules/pr106363_a.C b/gcc/testsuite/g++.dg/modules/pr106363_a.C
new file mode 100644 (file)
index 0000000..c18d2ee
--- /dev/null
@@ -0,0 +1,9 @@
+// PR c++/106363
+// { dg-additional-options "-fmodules-ts" }
+// { dg-module-cmi pr106363.a }
+
+export module pr106363.a;
+
+namespace ns {
+  export int x;
+}
diff --git a/gcc/testsuite/g++.dg/modules/pr106363_b.C b/gcc/testsuite/g++.dg/modules/pr106363_b.C
new file mode 100644 (file)
index 0000000..0508c0d
--- /dev/null
@@ -0,0 +1,10 @@
+// PR c++/106363
+// { dg-additional-options "-fmodules-ts" }
+// { dg-module-cmi pr106363.b }
+
+export module pr106363.b;
+import pr106363.a;
+
+namespace ns {
+  export using ns::x;
+}