https://gcc.gnu.org/g:f5ed7d19c965de9ccb158d77e929b17459bf65b5

commit r15-9483-gf5ed7d19c965de9ccb158d77e929b17459bf65b5
Author: Iain Buclaw <ibuc...@gdcproject.org>
Date:   Tue Apr 15 14:49:34 2025 +0200

    d: Fix ICE in dwarf2out_imported_module_or_decl, at dwarf2out.cc:27676 
[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.
    
            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.

Diff:
---
 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(-)

diff --git a/gcc/d/imports.cc b/gcc/d/imports.cc
index 776caafd25ca..16e4df69d656 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 000000000000..a13747240c43
--- /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 000000000000..aef0e373ca6e
--- /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 000000000000..188827e669f5
--- /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 000000000000..3eea6ba9a906
--- /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;

Reply via email to