Skip to content

Commit 49d49eb

Browse files
committed
ast_lowering: Make sure all imports have non-empty resolution lists
HIR visitor visits import paths once per resolution, so if some import has an empty resolution list, like in case of import list stems, its path stays unvisited.
1 parent 11f32b7 commit 49d49eb

File tree

3 files changed

+8
-7
lines changed

3 files changed

+8
-7
lines changed

compiler/rustc_ast_lowering/src/item.rs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -496,8 +496,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
496496
}
497497
}
498498

499-
let res =
500-
self.expect_full_res_from_use(id).map(|res| self.lower_res(res)).collect();
499+
let res = self.lower_import_res(id);
501500
let path = self.lower_use_path(res, &path, ParamMode::Explicit);
502501
hir::ItemKind::Use(path, hir::UseKind::Single)
503502
}
@@ -567,8 +566,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
567566
});
568567
}
569568

570-
let res =
571-
self.expect_full_res_from_use(id).map(|res| self.lower_res(res)).collect();
569+
let res = self.lower_import_res(id);
572570
let path = self.lower_use_path(res, &prefix, ParamMode::Explicit);
573571
hir::ItemKind::Use(path, hir::UseKind::ListStem)
574572
}

compiler/rustc_ast_lowering/src/lib.rs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ use rustc_middle::ty::{ResolverAstLowering, TyCtxt};
6363
use rustc_session::parse::{add_feature_diagnostics, feature_err};
6464
use rustc_span::symbol::{kw, sym, Ident, Symbol};
6565
use rustc_span::{DesugaringKind, Span, DUMMY_SP};
66-
use smallvec::SmallVec;
66+
use smallvec::{smallvec, SmallVec};
6767
use std::collections::hash_map::Entry;
6868
use thin_vec::ThinVec;
6969

@@ -749,8 +749,10 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
749749
self.resolver.get_partial_res(id).map_or(Res::Err, |pr| pr.expect_full_res())
750750
}
751751

752-
fn expect_full_res_from_use(&mut self, id: NodeId) -> impl Iterator<Item = Res<NodeId>> {
753-
self.resolver.get_import_res(id).present_items()
752+
fn lower_import_res(&mut self, id: NodeId) -> SmallVec<[Res; 3]> {
753+
let res = self.resolver.get_import_res(id).present_items();
754+
let res: SmallVec<_> = res.map(|res| self.lower_res(res)).collect();
755+
if !res.is_empty() { res } else { smallvec![Res::Err] }
754756
}
755757

756758
fn make_lang_item_qpath(&mut self, lang_item: hir::LangItem, span: Span) -> hir::QPath<'hir> {

compiler/rustc_ast_lowering/src/path.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
156156
p: &Path,
157157
param_mode: ParamMode,
158158
) -> &'hir hir::UsePath<'hir> {
159+
assert!((1..=3).contains(&res.len()));
159160
self.arena.alloc(hir::UsePath {
160161
res,
161162
segments: self.arena.alloc_from_iter(p.segments.iter().map(|segment| {

0 commit comments

Comments
 (0)