diff mbox series

[committed] d: Fix internal compiler error: in visit, at d/imports.cc:72 (PR108050)

Message ID 20221211175259.2795408-1-ibuclaw@gdcproject.org
State New
Headers show
Series [committed] d: Fix internal compiler error: in visit, at d/imports.cc:72 (PR108050) | expand

Commit Message

Iain Buclaw Dec. 11, 2022, 5:52 p.m. UTC
Hi,

This patch fixes an ICE in the D front-end when importing symbols that
have multiple overloads.

The visitor for lowering IMPORTED_DECLs did not have an override for
dealing with importing OverloadSet symbols.  This has now been
implemented in the code generator.

Bootstrapped and regression tested on x86_64-linux-gnu/-m32/-mx32,
committed to mainline, and backported to the release branches for
gcc-10, gcc-11, and gcc-12.

Regards,
Iain.

---
	PR d/108050

gcc/d/ChangeLog:

	* decl.cc (DeclVisitor::visit (Import *)): Handle build_import_decl
	returning a TREE_LIST.
	* imports.cc (ImportVisitor::visit (OverloadSet *)): New override.

gcc/testsuite/ChangeLog:

	* gdc.dg/imports/pr108050/mod1.d: New.
	* gdc.dg/imports/pr108050/mod2.d: New.
	* gdc.dg/imports/pr108050/package.d: New.
	* gdc.dg/pr108050.d: New test.
---
 gcc/d/decl.cc                                   | 12 ++++++++++--
 gcc/d/imports.cc                                | 14 ++++++++++++++
 gcc/testsuite/gdc.dg/imports/pr108050/mod1.d    |  2 ++
 gcc/testsuite/gdc.dg/imports/pr108050/mod2.d    |  2 ++
 gcc/testsuite/gdc.dg/imports/pr108050/package.d |  2 ++
 gcc/testsuite/gdc.dg/pr108050.d                 |  4 ++++
 6 files changed, 34 insertions(+), 2 deletions(-)
 create mode 100644 gcc/testsuite/gdc.dg/imports/pr108050/mod1.d
 create mode 100644 gcc/testsuite/gdc.dg/imports/pr108050/mod2.d
 create mode 100644 gcc/testsuite/gdc.dg/imports/pr108050/package.d
 create mode 100644 gcc/testsuite/gdc.dg/pr108050.d
diff mbox series

Patch

diff --git a/gcc/d/decl.cc b/gcc/d/decl.cc
index dcfca648e44..bed16323fec 100644
--- a/gcc/d/decl.cc
+++ b/gcc/d/decl.cc
@@ -198,8 +198,16 @@  public:
 	    tree name = (alias != NULL)
 	      ? get_identifier (alias->toChars ()) : NULL_TREE;
 
-	    debug_hooks->imported_module_or_decl (decl, name, context,
-						  false, false);
+	    if (TREE_CODE (decl) != TREE_LIST)
+	      debug_hooks->imported_module_or_decl (decl, name, context,
+						    false, false);
+	    else
+	      {
+		/* Overload sets return a list of imported decls.  */
+		for (; decl != NULL_TREE; decl = TREE_CHAIN (decl))
+		  debug_hooks->imported_module_or_decl (TREE_VALUE (decl), name,
+							context, false, false);
+	      }
 	  }
       }
     else
diff --git a/gcc/d/imports.cc b/gcc/d/imports.cc
index 133d93d4961..2d331f46c35 100644
--- a/gcc/d/imports.cc
+++ b/gcc/d/imports.cc
@@ -160,6 +160,20 @@  public:
       d->aliassym->accept (this);
   }
 
+  /* Build IMPORTED_DECLs for all overloads in a set.  */
+  void visit (OverloadSet *d) final override
+  {
+    vec<tree, va_gc> *tset = NULL;
+
+    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]));
+
+    this->result_ = build_tree_list_vec (tset);
+    tset->truncate (0);
+  }
+
   /* Function aliases are the same as alias symbols.  */
   void visit (FuncAliasDeclaration *d) final override
   {
diff --git a/gcc/testsuite/gdc.dg/imports/pr108050/mod1.d b/gcc/testsuite/gdc.dg/imports/pr108050/mod1.d
new file mode 100644
index 00000000000..f27a13dc051
--- /dev/null
+++ b/gcc/testsuite/gdc.dg/imports/pr108050/mod1.d
@@ -0,0 +1,2 @@ 
+module imports.pr108050.mod1;
+string[] split() { return null; }
diff --git a/gcc/testsuite/gdc.dg/imports/pr108050/mod2.d b/gcc/testsuite/gdc.dg/imports/pr108050/mod2.d
new file mode 100644
index 00000000000..29d8aa8f53e
--- /dev/null
+++ b/gcc/testsuite/gdc.dg/imports/pr108050/mod2.d
@@ -0,0 +1,2 @@ 
+module imports.pr108050.mod2;
+string[] split() { return null; }
diff --git a/gcc/testsuite/gdc.dg/imports/pr108050/package.d b/gcc/testsuite/gdc.dg/imports/pr108050/package.d
new file mode 100644
index 00000000000..b8b03b832af
--- /dev/null
+++ b/gcc/testsuite/gdc.dg/imports/pr108050/package.d
@@ -0,0 +1,2 @@ 
+module imports.pr108050;
+public import imports.pr108050.mod1, imports.pr108050.mod2;
diff --git a/gcc/testsuite/gdc.dg/pr108050.d b/gcc/testsuite/gdc.dg/pr108050.d
new file mode 100644
index 00000000000..69134e73137
--- /dev/null
+++ b/gcc/testsuite/gdc.dg/pr108050.d
@@ -0,0 +1,4 @@ 
+// { dg-do compile }
+// { dg-additional-sources "imports/pr108050/package.d imports/pr108050/mod1.d imports/pr108050/mod2.d" }
+// { dg-options "-g" }
+import imports.pr108050 : split;