Skip to content

Commit 8f0d729

Browse files
committed
resolve: Avoid finalizing extern prelude entries more than once
1 parent 3d03332 commit 8f0d729

File tree

4 files changed

+20
-32
lines changed

4 files changed

+20
-32
lines changed

compiler/rustc_resolve/src/build_reduced_graph.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -994,7 +994,7 @@ impl<'a, 'ra, 'tcx> BuildReducedGraphVisitor<'a, 'ra, 'tcx> {
994994
// Binding from `extern crate` item in source code can replace
995995
// a binding from `--extern` on command line here.
996996
if !entry.is_import() {
997-
entry.binding.set(crate::EpeBinding::Item(imported_binding));
997+
entry.binding.set(crate::EpeBinding::Item(imported_binding, false));
998998
} else if ident.name != kw::Underscore {
999999
self.r.dcx().span_delayed_bug(
10001000
item.span,

compiler/rustc_resolve/src/lib.rs

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1011,9 +1011,9 @@ impl<'ra> NameBindingData<'ra> {
10111011
enum EpeBinding<'ra> {
10121012
#[default]
10131013
OptPending,
1014-
OptReadyOk(NameBinding<'ra>),
1015-
OptReadyErr,
1016-
Item(NameBinding<'ra>),
1014+
OptReadyOk(NameBinding<'ra>, bool),
1015+
OptReadyErr(bool),
1016+
Item(NameBinding<'ra>, bool),
10171017
}
10181018

10191019
#[derive(Default, Clone)]
@@ -2021,7 +2021,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
20212021
if used == Used::Scope {
20222022
if let Some(entry) = self.extern_prelude.get(&ident.normalize_to_macros_2_0()) {
20232023
if !entry.introduced_by_item
2024-
&& entry.binding.get() == EpeBinding::Item(used_binding)
2024+
&& matches!(entry.binding.get(), EpeBinding::Item(b, _) if b == used_binding)
20252025
{
20262026
return;
20272027
}
@@ -2187,23 +2187,23 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
21872187
let norm_ident = ident.normalize_to_macros_2_0();
21882188
let entry = self.extern_prelude.get(&norm_ident).cloned();
21892189
let binding = entry.map(|entry| match entry.binding.get() {
2190-
EpeBinding::Item(binding) => {
2191-
if finalize && entry.introduced_by_item {
2190+
EpeBinding::Item(binding, finalized) => {
2191+
if finalize && !finalized && entry.introduced_by_item {
21922192
self.record_use(ident, binding, Used::Other);
21932193
}
2194-
EpeBinding::Item(binding)
2194+
EpeBinding::Item(binding, finalize)
21952195
}
2196-
EpeBinding::OptReadyOk(binding) => {
2197-
if finalize {
2196+
EpeBinding::OptReadyOk(binding, finalized) => {
2197+
if finalize && !finalized {
21982198
self.cstore_mut().process_path_extern(self.tcx, ident.name, ident.span);
21992199
}
2200-
EpeBinding::OptReadyOk(binding)
2200+
EpeBinding::OptReadyOk(binding, finalize)
22012201
}
2202-
EpeBinding::OptReadyErr => {
2203-
if finalize {
2202+
EpeBinding::OptReadyErr(finalized) => {
2203+
if finalize && !finalized {
22042204
self.cstore_mut().process_path_extern(self.tcx, ident.name, ident.span);
22052205
}
2206-
EpeBinding::OptReadyErr
2206+
EpeBinding::OptReadyErr(finalize)
22072207
}
22082208
EpeBinding::OptPending => {
22092209
let crate_id = if finalize {
@@ -2213,19 +2213,19 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
22132213
};
22142214
let res = match crate_id {
22152215
Some(crate_id) => Res::Def(DefKind::Mod, crate_id.as_def_id()),
2216-
None => return EpeBinding::OptReadyErr,
2216+
None => return EpeBinding::OptReadyErr(finalize),
22172217
};
22182218
let binding = self.arenas.new_pub_res_binding(res, DUMMY_SP, LocalExpnId::ROOT);
2219-
EpeBinding::OptReadyOk(binding)
2219+
EpeBinding::OptReadyOk(binding, finalize)
22202220
}
22212221
});
22222222

22232223
binding.and_then(|binding| {
22242224
self.extern_prelude[&norm_ident].binding.set(binding);
22252225
match binding {
2226-
EpeBinding::Item(binding) | EpeBinding::OptReadyOk(binding) => Some(binding),
2227-
EpeBinding::OptReadyErr if finalize => Some(self.dummy_binding),
2228-
EpeBinding::OptReadyErr => None,
2226+
EpeBinding::Item(binding, _) | EpeBinding::OptReadyOk(binding, _) => Some(binding),
2227+
EpeBinding::OptReadyErr(_) if finalize => Some(self.dummy_binding),
2228+
EpeBinding::OptReadyErr(_) => None,
22292229
EpeBinding::OptPending => unreachable!(),
22302230
}
22312231
})

tests/ui/crate-loading/invalid-rlib.rs

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,3 @@
66
#![no_std]
77
use ::foo; //~ ERROR invalid metadata files for crate `foo`
88
//~| NOTE failed to mmap file
9-
//~^^ ERROR invalid metadata files for crate `foo`
10-
//~| NOTE failed to mmap file
11-
//~| NOTE duplicate diagnostic

tests/ui/crate-loading/invalid-rlib.stderr

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,6 @@ LL | use ::foo;
66
|
77
= note: failed to mmap file 'auxiliary/libfoo.rlib'
88

9-
error[E0786]: found invalid metadata files for crate `foo`
10-
--> $DIR/invalid-rlib.rs:7:7
11-
|
12-
LL | use ::foo;
13-
| ^^^
14-
|
15-
= note: failed to mmap file 'auxiliary/libfoo.rlib'
16-
= note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no`
17-
18-
error: aborting due to 2 previous errors
9+
error: aborting due to 1 previous error
1910

2011
For more information about this error, try `rustc --explain E0786`.

0 commit comments

Comments
 (0)