From e645cca90555cbef9581a86eb7eaa1a4ac6d7c46 Mon Sep 17 00:00:00 2001 From: Ferdia McKeogh Date: Mon, 13 Jul 2020 13:54:18 +0100 Subject: [PATCH] Add note and suggestion when crate location fails due to the identifier `meta` being used --- src/librustc_metadata/locator.rs | 10 +++++++++- .../rfc-2126-extern-absolute-paths/meta.stderr | 6 ++++++ .../issue-73948-meta-as-module-name.fixed | 17 +++++++++++++++++ .../issue-73948-meta-as-module-name.rs | 17 +++++++++++++++++ .../issue-73948-meta-as-module-name.stderr | 15 +++++++++++++++ 5 files changed, 64 insertions(+), 1 deletion(-) create mode 100644 src/test/ui/suggestions/issue-73948-meta-as-module-name.fixed create mode 100644 src/test/ui/suggestions/issue-73948-meta-as-module-name.rs create mode 100644 src/test/ui/suggestions/issue-73948-meta-as-module-name.stderr diff --git a/src/librustc_metadata/locator.rs b/src/librustc_metadata/locator.rs index 8828b318d1ea6..06abcc3aec5de 100644 --- a/src/librustc_metadata/locator.rs +++ b/src/librustc_metadata/locator.rs @@ -219,7 +219,7 @@ use rustc_data_structures::fx::{FxHashMap, FxHashSet}; use rustc_data_structures::owning_ref::OwningRef; use rustc_data_structures::svh::Svh; use rustc_data_structures::sync::MetadataRef; -use rustc_errors::struct_span_err; +use rustc_errors::{struct_span_err, Applicability}; use rustc_middle::middle::cstore::{CrateSource, MetadataLoader}; use rustc_session::config::{self, CrateType}; use rustc_session::filesearch::{FileDoesntMatch, FileMatches, FileSearch}; @@ -1068,6 +1068,14 @@ impl CrateError { err.note(&format!("the `{}` target may not be installed", locator.triple)); } else if crate_name == sym::profiler_builtins { err.note(&"the compiler may have been built without the profiler runtime"); + } else if crate_name == sym::meta { + err.note(&"meta is a reserved crate name"); + err.span_suggestion( + span, + "you can use `crate::` or `self::` if you intended to refer to a local module and not a crate", + "crate::meta".to_string(), + Applicability::MaybeIncorrect, + ); } err.span_label(span, "can't find crate"); err diff --git a/src/test/ui/rfc-2126-extern-absolute-paths/meta.stderr b/src/test/ui/rfc-2126-extern-absolute-paths/meta.stderr index eb4b9dea41bdd..105f4b717455e 100644 --- a/src/test/ui/rfc-2126-extern-absolute-paths/meta.stderr +++ b/src/test/ui/rfc-2126-extern-absolute-paths/meta.stderr @@ -3,6 +3,12 @@ error[E0463]: can't find crate for `meta` | LL | use meta; | ^^^^ can't find crate + | + = note: meta is a reserved crate name +help: you can use `crate::` or `self::` if you intended to refer to a local module and not a crate + | +LL | use crate::meta; + | ^^^^^^^^^^^ error: aborting due to previous error diff --git a/src/test/ui/suggestions/issue-73948-meta-as-module-name.fixed b/src/test/ui/suggestions/issue-73948-meta-as-module-name.fixed new file mode 100644 index 0000000000000..9577dba495b2b --- /dev/null +++ b/src/test/ui/suggestions/issue-73948-meta-as-module-name.fixed @@ -0,0 +1,17 @@ +// check-only +// run-rustfix +// edition:2018 + +// https://github.com/rust-lang/rust/issues/73948 +// Tests that when `meta` is used as a module name and imported uniformly a +// suggestion is made to make the import unambiguous with `crate::meta` + +mod meta { + pub const FOO: bool = true; +} + +use crate::meta::FOO; //~ ERROR can't find crate for `meta` + +fn main() { + assert!(FOO); +} diff --git a/src/test/ui/suggestions/issue-73948-meta-as-module-name.rs b/src/test/ui/suggestions/issue-73948-meta-as-module-name.rs new file mode 100644 index 0000000000000..98b8f66bd76e0 --- /dev/null +++ b/src/test/ui/suggestions/issue-73948-meta-as-module-name.rs @@ -0,0 +1,17 @@ +// check-only +// run-rustfix +// edition:2018 + +// https://github.com/rust-lang/rust/issues/73948 +// Tests that when `meta` is used as a module name and imported uniformly a +// suggestion is made to make the import unambiguous with `crate::meta` + +mod meta { + pub const FOO: bool = true; +} + +use meta::FOO; //~ ERROR can't find crate for `meta` + +fn main() { + assert!(FOO); +} diff --git a/src/test/ui/suggestions/issue-73948-meta-as-module-name.stderr b/src/test/ui/suggestions/issue-73948-meta-as-module-name.stderr new file mode 100644 index 0000000000000..01fecb8e873b0 --- /dev/null +++ b/src/test/ui/suggestions/issue-73948-meta-as-module-name.stderr @@ -0,0 +1,15 @@ +error[E0463]: can't find crate for `meta` + --> $DIR/issue-73948-meta-as-module-name.rs:13:5 + | +LL | use meta::FOO; + | ^^^^ can't find crate + | + = note: meta is a reserved crate name +help: you can use `crate::` or `self::` if you intended to refer to a local module and not a crate + | +LL | use crate::meta::FOO; + | ^^^^^^^^^^^ + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0463`.