[pushed] c++: anonymous namespace in module partition [PR126209]

Jason Merrill <[email protected]>
Newsgroups gmane.comp.gcc.patches
Message-ID <[email protected]>
Tested x86_64-pc-linux-gnu, applying to trunk.

-- 8< --

Here since r16-4484 we include all namespaces in the current purview in a
module, even if the namespace comes from another partition.  That breaks for
an anonymous namespace, which is local to the TU (and added to the
definition of TU-local entity by P2996 Reflection); here _c ended up
representing the anonymous namespace from _a separately from the same one
passed along from _b, leading to an ICE trying to import them into the same
slot in _d.  I tried just adding namespaces to is_tu_local_entity, but that
broke other things, so for 16.2 let's handle them here.

	PR c++/126209

gcc/cp/ChangeLog:

	* module.cc (depset::hash::add_namespace_entities): Don't
	force out anonymous namespaces.

gcc/testsuite/ChangeLog:

	* g++.dg/modules/anon-5_a.C: New test.
	* g++.dg/modules/anon-5_b.C: New test.
	* g++.dg/modules/anon-5_c.C: New test.
	* g++.dg/modules/anon-5_d.C: New test.
---
 gcc/cp/module.cc                        | 6 ++++++
 gcc/testsuite/g++.dg/modules/anon-5_a.C | 6 ++++++
 gcc/testsuite/g++.dg/modules/anon-5_b.C | 3 +++
 gcc/testsuite/g++.dg/modules/anon-5_c.C | 4 ++++
 gcc/testsuite/g++.dg/modules/anon-5_d.C | 3 +++
 5 files changed, 22 insertions(+)
 create mode 100644 gcc/testsuite/g++.dg/modules/anon-5_a.C
 create mode 100644 gcc/testsuite/g++.dg/modules/anon-5_b.C
 create mode 100644 gcc/testsuite/g++.dg/modules/anon-5_c.C
 create mode 100644 gcc/testsuite/g++.dg/modules/anon-5_d.C

diff --git a/gcc/cp/module.cc b/gcc/cp/module.cc
index f7569e688a2..49a47494467 100644
--- a/gcc/cp/module.cc
+++ b/gcc/cp/module.cc
@@ -15202,6 +15202,12 @@ depset::hash::add_namespace_entities (tree ns, bitmap partitions)
   for (tree udir : NAMESPACE_LEVEL (ns)->using_directives)
     if (TREE_CODE (udir) == USING_DECL && DECL_MODULE_PURVIEW_P (udir))
       {
+	/* Unless it's a (TU-local) anonymous namespace.
+
+	   FIXME instead of checking here, they should be
+	   is_tu_local_entity.  */
+	if (!TREE_PUBLIC (USING_DECL_DECLS (udir)))
+	  continue;
 	make_dependency (USING_DECL_DECLS (udir), depset::EK_NAMESPACE);
 	if (DECL_MODULE_EXPORT_P (udir))
 	  count++;
diff --git a/gcc/testsuite/g++.dg/modules/anon-5_a.C b/gcc/testsuite/g++.dg/modules/anon-5_a.C
new file mode 100644
index 00000000000..6cc266b5c04
--- /dev/null
+++ b/gcc/testsuite/g++.dg/modules/anon-5_a.C
@@ -0,0 +1,6 @@
+// PR c++/126209
+// { dg-additional-options -fmodules }
+// { dg-module-cmi }
+export module kernel:event;
+namespace { int anchor = 0; }
+inline int i = anchor;
diff --git a/gcc/testsuite/g++.dg/modules/anon-5_b.C b/gcc/testsuite/g++.dg/modules/anon-5_b.C
new file mode 100644
index 00000000000..9f75fd3e900
--- /dev/null
+++ b/gcc/testsuite/g++.dg/modules/anon-5_b.C
@@ -0,0 +1,3 @@
+// { dg-additional-options -fmodules }
+export module kernel:memories;
+import :event;
diff --git a/gcc/testsuite/g++.dg/modules/anon-5_c.C b/gcc/testsuite/g++.dg/modules/anon-5_c.C
new file mode 100644
index 00000000000..bf66276d7d6
--- /dev/null
+++ b/gcc/testsuite/g++.dg/modules/anon-5_c.C
@@ -0,0 +1,4 @@
+// { dg-additional-options -fmodules }
+export module kernel;
+export import :event;
+export import :memories;
diff --git a/gcc/testsuite/g++.dg/modules/anon-5_d.C b/gcc/testsuite/g++.dg/modules/anon-5_d.C
new file mode 100644
index 00000000000..002c54da54d
--- /dev/null
+++ b/gcc/testsuite/g++.dg/modules/anon-5_d.C
@@ -0,0 +1,3 @@
+// { dg-additional-options -fmodules }
+import kernel;
+int main() { return 0; }

base-commit: d2d281c2f81b58fb7298da4c40c4e8434c097b71
-- 
2.55.0
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.