diff options
author | Iain Buclaw <ibuclaw@gdcproject.org> | 2022-12-10 19:12:43 +0100 |
---|---|---|
committer | Iain Buclaw <ibuclaw@gdcproject.org> | 2022-12-11 17:56:58 +0100 |
commit | d9d8c9674ad3ad3aa38419d24b1aaaffe31f5d3f (patch) | |
tree | fb549ab2543c785e17320cba16f4f836bfacef61 | |
parent | b045179973161115c7ea029b2788f5156fc55cda (diff) | |
download | gcc-d9d8c9674ad3ad3aa38419d24b1aaaffe31f5d3f.zip gcc-d9d8c9674ad3ad3aa38419d24b1aaaffe31f5d3f.tar.gz gcc-d9d8c9674ad3ad3aa38419d24b1aaaffe31f5d3f.tar.bz2 |
d: Fix internal compiler error: in visit, at d/imports.cc:72 (PR108050)
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.
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.
-rw-r--r-- | gcc/d/decl.cc | 12 | ||||
-rw-r--r-- | gcc/d/imports.cc | 14 | ||||
-rw-r--r-- | gcc/testsuite/gdc.dg/imports/pr108050/mod1.d | 2 | ||||
-rw-r--r-- | gcc/testsuite/gdc.dg/imports/pr108050/mod2.d | 2 | ||||
-rw-r--r-- | gcc/testsuite/gdc.dg/imports/pr108050/package.d | 2 | ||||
-rw-r--r-- | gcc/testsuite/gdc.dg/pr108050.d | 4 |
6 files changed, 34 insertions, 2 deletions
diff --git a/gcc/d/decl.cc b/gcc/d/decl.cc index dcfca64..bed1632 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 133d93d..2d331f4 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 0000000..f27a13d --- /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 0000000..29d8aa8 --- /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 0000000..b8b03b8 --- /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 0000000..69134e7 --- /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; |