Skip to content

Commit a671e61

Browse files
Auto merge of #145961 - petrochenkov:extprelregr, r=<try>
resolve: Avoid a regression from splitting prelude into two scopes try-job: dist-powerpc64-linux
2 parents 828e45a + 8930d3a commit a671e61

File tree

2 files changed

+33
-3
lines changed

2 files changed

+33
-3
lines changed

compiler/rustc_resolve/src/ident.rs

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -422,6 +422,8 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
422422
// to detect potential ambiguities.
423423
let mut innermost_result: Option<(NameBinding<'_>, Flags)> = None;
424424
let mut determinacy = Determinacy::Determined;
425+
let mut extern_prelude_item_binding = None;
426+
let mut extern_prelude_flag_binding = None;
425427
// Shadowed bindings don't need to be marked as used or non-speculatively loaded.
426428
macro finalize_scope() {
427429
if innermost_result.is_none() { finalize } else { None }
@@ -558,15 +560,21 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
558560
Scope::ExternPreludeItems => {
559561
// FIXME: use `finalize_scope` here.
560562
match this.reborrow().extern_prelude_get_item(ident, finalize.is_some()) {
561-
Some(binding) => Ok((binding, Flags::empty())),
563+
Some(binding) => {
564+
extern_prelude_item_binding = Some(binding);
565+
Ok((binding, Flags::empty()))
566+
}
562567
None => Err(Determinacy::determined(
563568
this.graph_root.unexpanded_invocations.borrow().is_empty(),
564569
)),
565570
}
566571
}
567572
Scope::ExternPreludeFlags => {
568573
match this.extern_prelude_get_flag(ident, finalize_scope!().is_some()) {
569-
Some(binding) => Ok((binding, Flags::empty())),
574+
Some(binding) => {
575+
extern_prelude_flag_binding = Some(binding);
576+
Ok((binding, Flags::empty()))
577+
}
570578
None => Err(Determinacy::Determined),
571579
}
572580
}
@@ -686,7 +694,16 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
686694
} else {
687695
None
688696
};
689-
if let Some(kind) = ambiguity_error_kind {
697+
// Skip ambiguity errors for extern flag bindings "overridden"
698+
// by extern item bindings.
699+
// FIXME: Remove with lang team approval.
700+
let issue_145575_hack = Some(binding)
701+
== extern_prelude_flag_binding
702+
&& extern_prelude_item_binding.is_some()
703+
&& extern_prelude_item_binding != Some(innermost_binding);
704+
if let Some(kind) = ambiguity_error_kind
705+
&& !issue_145575_hack
706+
{
690707
let misc = |f: Flags| {
691708
if f.contains(Flags::MISC_SUGGEST_CRATE) {
692709
AmbiguityErrorMisc::SuggestCrate
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
// Test for issue #145575.
2+
3+
//@ check-pass
4+
//@ edition: 2018
5+
6+
extern crate core as std;
7+
8+
mod inner {
9+
use crate::*;
10+
use std::str; // OK for now
11+
}
12+
13+
fn main() {}

0 commit comments

Comments
 (0)