Hi,

This patch fixes the ICE in PR119817.

The ImportVisitor method for handling the importing of overload sets was
pushing NULL_TREE to the array of import decls, which in turn got passed
to `debug_hooks->imported_module_or_decl', triggering the observed
internal compiler error.

NULL_TREE is returned from `build_import_decl' when the symbol was
ignored for being non-trivial to represent in debug, for example,
template or tuple declarations.  So similarly "skip" adding the symbol
when this is the case for overload sets too.

Bootstrapped and regression tested on x86_64-linux-gnu/-m32, and
committed to mainline.  Will backport as necessary once gcc-14/13/12
release branches have been regtested too.

Regards,
Iain.

---
        PR d/119817

gcc/d/ChangeLog:

        * imports.cc (ImportVisitor::visit (OverloadSet *)): Don't push
        NULL_TREE to vector of import symbols.

gcc/testsuite/ChangeLog:

        * gdc.dg/debug/imports/m119817/a.d: New test.
        * gdc.dg/debug/imports/m119817/b.d: New test.
        * gdc.dg/debug/imports/m119817/package.d: New test.
        * gdc.dg/debug/pr119817.d: New test.
---
 gcc/d/imports.cc                                     | 6 +++++-
 gcc/testsuite/gdc.dg/debug/imports/m119817/a.d       | 2 ++
 gcc/testsuite/gdc.dg/debug/imports/m119817/b.d       | 2 ++
 gcc/testsuite/gdc.dg/debug/imports/m119817/package.d | 4 ++++
 gcc/testsuite/gdc.dg/debug/pr119817.d                | 6 ++++++
 5 files changed, 19 insertions(+), 1 deletion(-)
 create mode 100644 gcc/testsuite/gdc.dg/debug/imports/m119817/a.d
 create mode 100644 gcc/testsuite/gdc.dg/debug/imports/m119817/b.d
 create mode 100644 gcc/testsuite/gdc.dg/debug/imports/m119817/package.d
 create mode 100644 gcc/testsuite/gdc.dg/debug/pr119817.d

diff --git a/gcc/d/imports.cc b/gcc/d/imports.cc
index 776caafd25c..16e4df69d65 100644
--- a/gcc/d/imports.cc
+++ b/gcc/d/imports.cc
@@ -182,7 +182,11 @@ public:
     vec_alloc (tset, d->a.length);
 
     for (size_t i = 0; i < d->a.length; i++)
-      vec_safe_push (tset, build_import_decl (d->a[i]));
+      {
+       tree overload = build_import_decl (d->a[i]);
+       if (overload != NULL_TREE)
+         vec_safe_push (tset, overload);
+      }
 
     this->result_ = build_tree_list_vec (tset);
     tset->truncate (0);
diff --git a/gcc/testsuite/gdc.dg/debug/imports/m119817/a.d 
b/gcc/testsuite/gdc.dg/debug/imports/m119817/a.d
new file mode 100644
index 00000000000..a13747240c4
--- /dev/null
+++ b/gcc/testsuite/gdc.dg/debug/imports/m119817/a.d
@@ -0,0 +1,2 @@
+module imports.m119817.a;
+void f119817()() { }
diff --git a/gcc/testsuite/gdc.dg/debug/imports/m119817/b.d 
b/gcc/testsuite/gdc.dg/debug/imports/m119817/b.d
new file mode 100644
index 00000000000..aef0e373ca6
--- /dev/null
+++ b/gcc/testsuite/gdc.dg/debug/imports/m119817/b.d
@@ -0,0 +1,2 @@
+module imports.m119817.b;
+void f119817() { }
diff --git a/gcc/testsuite/gdc.dg/debug/imports/m119817/package.d 
b/gcc/testsuite/gdc.dg/debug/imports/m119817/package.d
new file mode 100644
index 00000000000..188827e669f
--- /dev/null
+++ b/gcc/testsuite/gdc.dg/debug/imports/m119817/package.d
@@ -0,0 +1,4 @@
+module imports.m119817;
+public import
+    imports.m119817.a,
+    imports.m119817.b;
diff --git a/gcc/testsuite/gdc.dg/debug/pr119817.d 
b/gcc/testsuite/gdc.dg/debug/pr119817.d
new file mode 100644
index 00000000000..3eea6ba9a90
--- /dev/null
+++ b/gcc/testsuite/gdc.dg/debug/pr119817.d
@@ -0,0 +1,6 @@
+// { dg-do compile }
+// { dg-additional-sources "imports/m119817/package.d" }
+// { dg-additional-sources "imports/m119817/a.d" }
+// { dg-additional-sources "imports/m119817/b.d" }
+module pr119817;
+import imports.m119817 : f119817;
-- 
2.43.0

Reply via email to