https://gcc.gnu.org/g:c9112a01f3c71e3535b2e3a5935cd67d14f5d58a
commit r17-3121-gc9112a01f3c71e3535b2e3a5935cd67d14f5d58a Author: Owen Avery <[email protected]> Date: Wed Jul 15 23:51:06 2026 -0400 gccrs: Fix multiple glob imports in a use decl Also removes some dead code in flatten, since I saw it while working on this PR and it's too small to be its own patch. gcc/rust/ChangeLog: * resolve/rust-early-name-resolver-2.0.cc (Early::resolve_glob_import): Handle glob imports that appear after other imports in a use declaration. * resolve/rust-early-name-resolver-2.0.h (Early::ImportMappings::insert): Remove member functions, as they're both broken and unused. * resolve/rust-toplevel-name-resolver-2.0.cc (flatten): Remove redundant break statement. gcc/testsuite/ChangeLog: * rust/compile/glob_import_brace.rs: New test. Signed-off-by: Owen Avery <[email protected]> Diff: --- gcc/rust/resolve/rust-early-name-resolver-2.0.cc | 7 ++++--- gcc/rust/resolve/rust-early-name-resolver-2.0.h | 11 ----------- gcc/rust/resolve/rust-toplevel-name-resolver-2.0.cc | 1 - gcc/testsuite/rust/compile/glob_import_brace.rs | 14 ++++++++++++++ 4 files changed, 18 insertions(+), 15 deletions(-) diff --git a/gcc/rust/resolve/rust-early-name-resolver-2.0.cc b/gcc/rust/resolve/rust-early-name-resolver-2.0.cc index 1c87804a7330..12f29ceed7c2 100644 --- a/gcc/rust/resolve/rust-early-name-resolver-2.0.cc +++ b/gcc/rust/resolve/rust-early-name-resolver-2.0.cc @@ -99,14 +99,15 @@ Early::resolve_glob_import (NodeId use_dec_id, TopLevel::ImportKind &&glob) if (!result) return false; + auto &imports = import_mappings.new_or_access (use_dec_id); + // here, we insert the module's NodeId into the import_mappings and will look // up the module proper in `FinalizeImports` // The namespace does not matter here since we are dealing with a glob // FIXME: Does the namespace not matter? Is that valid? // TODO: Ugly - import_mappings.insert (use_dec_id, - ImportPair (std::move (glob), - ImportData::Glob (resolved->definition))); + imports.emplace_back ( + ImportPair (std::move (glob), ImportData::Glob (resolved->definition))); return true; } diff --git a/gcc/rust/resolve/rust-early-name-resolver-2.0.h b/gcc/rust/resolve/rust-early-name-resolver-2.0.h index 235595e8d01f..7ea9e9f2ccc4 100644 --- a/gcc/rust/resolve/rust-early-name-resolver-2.0.h +++ b/gcc/rust/resolve/rust-early-name-resolver-2.0.h @@ -157,17 +157,6 @@ public: return iter.first->second; } - void insert (NodeId path_id, std::vector<ImportPair> &&pairs) - { - mappings.insert ({{path_id}, std::move (pairs)}); - } - - // Same as `insert`, but with just one node - void insert (NodeId path_id, ImportPair &&pair) - { - mappings.insert ({{path_id}, {pair}}); - } - std::vector<ImportPair> &get (NodeId use_id) { return mappings[use_id]; } private: diff --git a/gcc/rust/resolve/rust-toplevel-name-resolver-2.0.cc b/gcc/rust/resolve/rust-toplevel-name-resolver-2.0.cc index cb354fdee615..117bb32fb0f5 100644 --- a/gcc/rust/resolve/rust-toplevel-name-resolver-2.0.cc +++ b/gcc/rust/resolve/rust-toplevel-name-resolver-2.0.cc @@ -440,7 +440,6 @@ flatten ( flatten_glob (*glob, glob_paths, ctx); break; } - break; } } diff --git a/gcc/testsuite/rust/compile/glob_import_brace.rs b/gcc/testsuite/rust/compile/glob_import_brace.rs new file mode 100644 index 000000000000..22e44664a982 --- /dev/null +++ b/gcc/testsuite/rust/compile/glob_import_brace.rs @@ -0,0 +1,14 @@ +#![feature(no_core)] +#![no_core] + +mod a {} + +mod b { + pub struct X; + + mod c { + use crate::{a::*, b::*}; + + type Y = X; + } +}
