Auto merge of #17251 - roife:fix-issue-17057, r=Veykril · rust-lang/rust@0916e72

@@ -221,7 +221,7 @@ impl DefMap {

221221

None => return ResolvePathResult::empty(ReachedFixedPoint::Yes),

222222

};

223223

tracing::debug!("resolving {:?} in crate root (+ extern prelude)", segment);

224-

self.resolve_name_in_crate_root_or_extern_prelude(db, segment)

224+

self.resolve_name_in_crate_root_or_extern_prelude(db, original_module, segment)

225225

}

226226

PathKind::Plain => {

227227

let (_, segment) = match segments.next() {

@@ -470,9 +470,9 @@ impl DefMap {

470470

};

471471472472

let extern_prelude = || {

473-

if self.block.is_some() {

474-

// Don't resolve extern prelude in block `DefMap`s, defer it to the crate def map so

475-

// that blocks can properly shadow them

473+

if self.block.is_some() && module == DefMap::ROOT {

474+

// Don't resolve extern prelude in pseudo-modules of blocks, because

475+

// they might been shadowed by local names.

476476

return PerNs::none();

477477

}

478478

self.data.extern_prelude.get(name).map_or(PerNs::none(), |&(it, extern_crate)| {

@@ -505,6 +505,7 @@ impl DefMap {

505505

fn resolve_name_in_crate_root_or_extern_prelude(

506506

&self,

507507

db: &dyn DefDatabase,

508+

module: LocalModuleId,

508509

name: &Name,

509510

) -> PerNs {

510511

let from_crate_root = match self.block {

@@ -515,8 +516,8 @@ impl DefMap {

515516

None => self[Self::ROOT].scope.get(name),

516517

};

517518

let from_extern_prelude = || {

518-

if self.block.is_some() {

519-

// Don't resolve extern prelude in block `DefMap`s.

519+

if self.block.is_some() && module == DefMap::ROOT {

520+

// Don't resolve extern prelude in pseudo-module of a block.

520521

return PerNs::none();

521522

}

522523

self.data.extern_prelude.get(name).copied().map_or(