Skip to content

Commit

Permalink
Prohibit macro-expanded extern crate items shadowing crates passed …
Browse files Browse the repository at this point in the history
…with `--extern`
  • Loading branch information
petrochenkov committed Oct 23, 2018
1 parent 7976aa3 commit d1e337b
Show file tree
Hide file tree
Showing 5 changed files with 51 additions and 5 deletions.
17 changes: 15 additions & 2 deletions src/librustc_resolve/build_reduced_graph.rs
Expand Up @@ -446,10 +446,23 @@ impl<'a, 'cl> Resolver<'a, 'cl> {
let binding =
(module, ty::Visibility::Public, sp, expansion).to_name_binding(self.arenas);
if ptr::eq(self.current_module, self.graph_root) {
self.extern_prelude.entry(ident.modern()).or_insert(ExternPreludeEntry {
if let Some(entry) = self.extern_prelude.get(&ident.modern()) {
if expansion != Mark::root() && orig_name.is_some() &&
entry.extern_crate_item.is_none() {
self.session.span_err(item.span, "macro-expanded `extern crate` items \
cannot shadow names passed with \
`--extern`");
}
}
let entry = self.extern_prelude.entry(ident.modern())
.or_insert(ExternPreludeEntry {
extern_crate_item: None,
introduced_by_item: true,
}).extern_crate_item = Some(binding);
});
entry.extern_crate_item = Some(binding);
if orig_name.is_some() {
entry.introduced_by_item = true;
}
}
let directive = self.arenas.alloc_import_directive(ImportDirective {
root_id: item.id,
Expand Down
Expand Up @@ -36,4 +36,11 @@ mod import_absolute {
//~^ ERROR use of extern prelude names introduced with `extern crate` items is unstable
}

extern crate alloc as core;

mod unrelated_crate_renamed {
type A = core::boxed::Box<u8>;
//~^ ERROR use of extern prelude names introduced with `extern crate` items is unstable
}

fn main() {}
Expand Up @@ -62,6 +62,14 @@ LL | type A = ::alloc::boxed::Box<u8>;
|
= help: add #![feature(extern_crate_item_prelude)] to the crate attributes to enable

error: aborting due to 8 previous errors
error[E0658]: use of extern prelude names introduced with `extern crate` items is unstable (see issue #54658)
--> $DIR/feature-gate-extern_crate_item_prelude.rs:42:14
|
LL | type A = core::boxed::Box<u8>;
| ^^^^
|
= help: add #![feature(extern_crate_item_prelude)] to the crate attributes to enable

error: aborting due to 9 previous errors

For more information about this error, try `rustc --explain E0658`.
9 changes: 9 additions & 0 deletions src/test/ui/imports/extern-prelude-extern-crate-fail.rs
@@ -1,4 +1,5 @@
// aux-build:two_macros.rs
// compile-flags:--extern non_existent

mod n {
extern crate two_macros;
Expand All @@ -10,4 +11,12 @@ mod m {
}
}

macro_rules! define_std_as_non_existent {
() => {
extern crate std as non_existent;
//~^ ERROR `extern crate` items cannot shadow names passed with `--extern`
}
}
define_std_as_non_existent!();

fn main() {}
13 changes: 11 additions & 2 deletions src/test/ui/imports/extern-prelude-extern-crate-fail.stderr
@@ -1,9 +1,18 @@
error: macro-expanded `extern crate` items cannot shadow names passed with `--extern`
--> $DIR/extern-prelude-extern-crate-fail.rs:16:9
|
LL | extern crate std as non_existent;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
...
LL | define_std_as_non_existent!();
| ------------------------------ in this macro invocation

error[E0433]: failed to resolve. Use of undeclared type or module `two_macros`
--> $DIR/extern-prelude-extern-crate-fail.rs:9:9
--> $DIR/extern-prelude-extern-crate-fail.rs:10:9
|
LL | two_macros::m!(); //~ ERROR failed to resolve. Use of undeclared type or module `two_macros`
| ^^^^^^^^^^ Use of undeclared type or module `two_macros`

error: aborting due to previous error
error: aborting due to 2 previous errors

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

0 comments on commit d1e337b

Please sign in to comment.