Skip to content

Commit

Permalink
skip updating when external binding is existed
Browse files Browse the repository at this point in the history
  • Loading branch information
bvanjoi committed Aug 20, 2024
1 parent fdf61d4 commit df019a9
Show file tree
Hide file tree
Showing 14 changed files with 179 additions and 17 deletions.
18 changes: 13 additions & 5 deletions compiler/rustc_resolve/src/build_reduced_graph.rs
Original file line number Diff line number Diff line change
Expand Up @@ -896,7 +896,8 @@ impl<'a, 'b, 'tcx> BuildReducedGraphVisitor<'a, 'b, 'tcx> {
self.r.potentially_unused_imports.push(import);
let imported_binding = self.r.import(binding, import);
if parent == self.r.graph_root {
if let Some(entry) = self.r.extern_prelude.get(&ident.normalize_to_macros_2_0()) {
let ident = ident.normalize_to_macros_2_0();
if let Some(entry) = self.r.extern_prelude.get(&ident) {
if expansion != LocalExpnId::ROOT && orig_name.is_some() && !entry.is_import() {
self.r.dcx().emit_err(
errors::MacroExpandedExternCrateCannotShadowExternArguments {
Expand All @@ -913,14 +914,21 @@ impl<'a, 'b, 'tcx> BuildReducedGraphVisitor<'a, 'b, 'tcx> {
let entry = self
.r
.extern_prelude
.entry(ident.normalize_to_macros_2_0())
.entry(ident)
.or_insert(ExternPreludeEntry { binding: None, introduced_by_item: true });
// Binding from `extern crate` item in source code can replace
// a binding from `--extern` on command line here.
entry.binding = Some(imported_binding);
if orig_name.is_some() {
entry.introduced_by_item = true;
}
// Binding from `extern crate` item in source code can replace
// a binding from `--extern` on command line here.
if !entry.is_import() {
entry.binding = Some(imported_binding)
} else if ident.name != kw::Underscore {
self.r.dcx().span_delayed_bug(
item.span,
format!("it had been define the external module '{ident}' multiple times"),
);
}
}
self.r.define(parent, ident, TypeNS, imported_binding);
}
Expand Down
3 changes: 1 addition & 2 deletions src/tools/tidy/src/issues.txt
Original file line number Diff line number Diff line change
Expand Up @@ -1289,8 +1289,7 @@ ui/imports/auxiliary/issue-52891.rs
ui/imports/auxiliary/issue-55811.rs
ui/imports/auxiliary/issue-56125.rs
ui/imports/auxiliary/issue-59764.rs
ui/imports/auxiliary/issue-85992-extern-1.rs
ui/imports/auxiliary/issue-85992-extern-2.rs
ui/imports/auxiliary/issue-85992-extern.rs
ui/imports/issue-109148.rs
ui/imports/issue-109343.rs
ui/imports/issue-113953.rs
Expand Down
File renamed without changes.
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#[macro_export]
macro_rules! m {
() => {
use issue_85992_extern_2::Outcome;
use empty::Outcome;
}
}
12 changes: 6 additions & 6 deletions tests/ui/imports/issue-85992.rs
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
//@ edition: 2021
//@ compile-flags: --extern issue_85992_extern_1 --extern issue_85992_extern_2
//@ aux-build: issue-85992-extern-1.rs
//@ aux-build: issue-85992-extern-2.rs
//@ compile-flags: --extern issue_85992_extern --extern empty
//@ aux-build: issue-85992-extern.rs
//@ aux-build: empty.rs

issue_85992_extern_1::m!();
issue_85992_extern::m!();

use crate::issue_85992_extern_2;
//~^ ERROR unresolved import `crate::issue_85992_extern_2`
use crate::empty;
//~^ ERROR unresolved import `crate::empty`

fn main() {}
6 changes: 3 additions & 3 deletions tests/ui/imports/issue-85992.stderr
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
error[E0432]: unresolved import `crate::issue_85992_extern_2`
error[E0432]: unresolved import `crate::empty`
--> $DIR/issue-85992.rs:8:5
|
LL | use crate::issue_85992_extern_2;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ no `issue_85992_extern_2` in the root
LL | use crate::empty;
| ^^^^^^^^^^^^ no `empty` in the root

error: aborting due to 1 previous error

Expand Down
18 changes: 18 additions & 0 deletions tests/ui/imports/multiple-extern-by-macro-for-buitlin.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
//@ edition: 2021

// issue#128813

extern crate core;

macro_rules! m {
() => {
extern crate std as core;
//~^ ERROR: the name `core` is defined multiple times
};
}

m!();

fn main() {
use ::core;
}
22 changes: 22 additions & 0 deletions tests/ui/imports/multiple-extern-by-macro-for-buitlin.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
error[E0259]: the name `core` is defined multiple times
--> $DIR/multiple-extern-by-macro-for-buitlin.rs:9:9
|
LL | extern crate core;
| ------------------ previous import of the extern crate `core` here
...
LL | extern crate std as core;
| ^^^^^^^^^^^^^^^^^^^^^^^^^ `core` reimported here
...
LL | m!();
| ---- in this macro invocation
|
= note: `core` must be defined only once in the type namespace of this module
= note: this error originates in the macro `m` (in Nightly builds, run with -Z macro-backtrace for more info)
help: you can use `as` to change the binding name of the import
|
LL | extern crate std as other_core;
|

error: aborting due to 1 previous error

For more information about this error, try `rustc --explain E0259`.
19 changes: 19 additions & 0 deletions tests/ui/imports/multiple-extern-by-macro-for-custom.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
//@ edition: 2021
//@ aux-build: empty.rs

// issue#128813

extern crate empty;

macro_rules! m {
() => {
extern crate std as empty;
//~^ ERROR: the name `empty` is defined multiple times
};
}

m!();

fn main() {
use ::empty;
}
22 changes: 22 additions & 0 deletions tests/ui/imports/multiple-extern-by-macro-for-custom.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
error[E0259]: the name `empty` is defined multiple times
--> $DIR/multiple-extern-by-macro-for-custom.rs:10:9
|
LL | extern crate empty;
| ------------------- previous import of the extern crate `empty` here
...
LL | extern crate std as empty;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ `empty` reimported here
...
LL | m!();
| ---- in this macro invocation
|
= note: `empty` must be defined only once in the type namespace of this module
= note: this error originates in the macro `m` (in Nightly builds, run with -Z macro-backtrace for more info)
help: you can use `as` to change the binding name of the import
|
LL | extern crate std as other_empty;
|

error: aborting due to 1 previous error

For more information about this error, try `rustc --explain E0259`.
19 changes: 19 additions & 0 deletions tests/ui/imports/multiple-extern-by-macro-for-inexist.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
//@ edition: 2021

// issue#128813

extern crate non_existent;
//~^ ERROR: can't find crate for `non_existent`

macro_rules! m {
() => {
extern crate std as non_existent;
//~^ ERROR: the name `non_existent` is defined multiple times
};
}

m!();

fn main() {
use ::non_existent;
}
29 changes: 29 additions & 0 deletions tests/ui/imports/multiple-extern-by-macro-for-inexist.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
error[E0463]: can't find crate for `non_existent`
--> $DIR/multiple-extern-by-macro-for-inexist.rs:5:1
|
LL | extern crate non_existent;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ can't find crate

error[E0259]: the name `non_existent` is defined multiple times
--> $DIR/multiple-extern-by-macro-for-inexist.rs:10:9
|
LL | extern crate non_existent;
| -------------------------- previous import of the extern crate `non_existent` here
...
LL | extern crate std as non_existent;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `non_existent` reimported here
...
LL | m!();
| ---- in this macro invocation
|
= note: `non_existent` must be defined only once in the type namespace of this module
= note: this error originates in the macro `m` (in Nightly builds, run with -Z macro-backtrace for more info)
help: you can use `as` to change the binding name of the import
|
LL | extern crate std as other_non_existent;
|

error: aborting due to 2 previous errors

Some errors have detailed explanations: E0259, E0463.
For more information about an error, try `rustc --explain E0259`.
18 changes: 18 additions & 0 deletions tests/ui/imports/multiple-extern-by-macro-for-underscore.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
//@ edition: 2021

// issue#128813

extern crate core as _;

macro_rules! m {
() => {
extern crate std as _;
};
}

m!();

fn main() {
use ::_;
//~^ ERROR: expected identifier, found reserved identifier `_`
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
error: expected identifier, found reserved identifier `_`
--> $DIR/multiple-extern-by-macro-for-underscore.rs:16:11
|
LL | use ::_;
| ^ expected identifier, found reserved identifier

error: aborting due to 1 previous error

0 comments on commit df019a9

Please sign in to comment.