mirror of
https://github.com/rust-lang/rust.git
synced 2026-04-27 18:57:42 +03:00
Emit a single error when importing a path with _
When encountering `use _;`, `use _::*'` or similar, do not emit two errors for that single mistake. This also side-steps the issue of resolve errors suggesting adding a crate named `_` to `Cargo.toml`.
This commit is contained in:
@@ -608,7 +608,9 @@ pub(crate) fn finalize_imports(&mut self) {
|
||||
}
|
||||
}
|
||||
|
||||
self.throw_unresolved_import_error(errors, glob_error);
|
||||
if !errors.is_empty() {
|
||||
self.throw_unresolved_import_error(errors, glob_error);
|
||||
}
|
||||
}
|
||||
|
||||
pub(crate) fn check_hidden_glob_reexports(
|
||||
@@ -688,14 +690,19 @@ fn throw_unresolved_import_error(
|
||||
Some(def_id) if self.mods_with_parse_errors.contains(&def_id) => false,
|
||||
_ => true,
|
||||
});
|
||||
errors.retain(|(_import, err)| {
|
||||
// If we've encountered something like `use _;`, we've already emitted an error stating
|
||||
// that `_` is not a valid identifier, so we ignore that resolve error.
|
||||
err.segment != Some(kw::Underscore)
|
||||
});
|
||||
|
||||
if errors.is_empty() {
|
||||
self.tcx.dcx().delayed_bug("expected a parse or \"`_` can't be an identifier\" error");
|
||||
return;
|
||||
}
|
||||
|
||||
/// Upper limit on the number of `span_label` messages.
|
||||
const MAX_LABEL_COUNT: usize = 10;
|
||||
|
||||
let span = MultiSpan::from_spans(errors.iter().map(|(_, err)| err.span).collect());
|
||||
|
||||
let paths = errors
|
||||
.iter()
|
||||
.map(|(import, err)| {
|
||||
@@ -715,6 +722,9 @@ fn throw_unresolved_import_error(
|
||||
diag.note(note.clone());
|
||||
}
|
||||
|
||||
/// Upper limit on the number of `span_label` messages.
|
||||
const MAX_LABEL_COUNT: usize = 10;
|
||||
|
||||
for (import, err) in errors.into_iter().take(MAX_LABEL_COUNT) {
|
||||
if let Some(label) = err.label {
|
||||
diag.span_label(err.span, label);
|
||||
|
||||
@@ -4,12 +4,5 @@ error: expected identifier, found reserved identifier `_`
|
||||
LL | use ::_;
|
||||
| ^ expected identifier, found reserved identifier
|
||||
|
||||
error[E0432]: unresolved import `_`
|
||||
--> $DIR/multiple-extern-by-macro-for-underscore.rs:18:9
|
||||
|
|
||||
LL | use ::_;
|
||||
| ^^^ no `_` in the root
|
||||
error: aborting due to 1 previous error
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0432`.
|
||||
|
||||
@@ -15,6 +15,6 @@ macro_rules! m {
|
||||
m!();
|
||||
|
||||
fn main() {
|
||||
use ::_; //[ed2015]~ ERROR: unresolved import `_`
|
||||
use ::_;
|
||||
//~^ ERROR: expected identifier, found reserved identifier `_`
|
||||
}
|
||||
|
||||
@@ -5,19 +5,19 @@ LL | use _::a;
|
||||
| ^ expected identifier, found reserved identifier
|
||||
|
||||
error: expected identifier, found reserved identifier `_`
|
||||
--> $DIR/issue-110164.rs:11:5
|
||||
--> $DIR/issue-110164.rs:10:5
|
||||
|
|
||||
LL | use _::*;
|
||||
| ^ expected identifier, found reserved identifier
|
||||
|
||||
error: expected identifier, found reserved identifier `_`
|
||||
--> $DIR/issue-110164.rs:16:9
|
||||
--> $DIR/issue-110164.rs:14:9
|
||||
|
|
||||
LL | use _::a;
|
||||
| ^ expected identifier, found reserved identifier
|
||||
|
||||
error: expected identifier, found reserved identifier `_`
|
||||
--> $DIR/issue-110164.rs:19:9
|
||||
--> $DIR/issue-110164.rs:16:9
|
||||
|
|
||||
LL | use _::*;
|
||||
| ^ expected identifier, found reserved identifier
|
||||
@@ -34,30 +34,6 @@ error[E0432]: unresolved import `crate::*`
|
||||
LL | use crate::*;
|
||||
| ^^^^^^^^ cannot glob-import a module into itself
|
||||
|
||||
error[E0432]: unresolved import `_`
|
||||
--> $DIR/issue-110164.rs:11:5
|
||||
|
|
||||
LL | use _::*;
|
||||
| ^ `_` is not a valid crate or module name
|
||||
|
||||
error[E0432]: unresolved import `_`
|
||||
--> $DIR/issue-110164.rs:8:5
|
||||
|
|
||||
LL | use _::a;
|
||||
| ^ `_` is not a valid crate or module name
|
||||
|
||||
error[E0432]: unresolved import `_`
|
||||
--> $DIR/issue-110164.rs:16:9
|
||||
|
|
||||
LL | use _::a;
|
||||
| ^ `_` is not a valid crate or module name
|
||||
|
||||
error[E0432]: unresolved import `_`
|
||||
--> $DIR/issue-110164.rs:19:9
|
||||
|
|
||||
LL | use _::*;
|
||||
| ^ `_` is not a valid crate or module name
|
||||
|
||||
error: aborting due to 10 previous errors
|
||||
error: aborting due to 6 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0432`.
|
||||
|
||||
@@ -5,19 +5,19 @@ LL | use _::a;
|
||||
| ^ expected identifier, found reserved identifier
|
||||
|
||||
error: expected identifier, found reserved identifier `_`
|
||||
--> $DIR/issue-110164.rs:11:5
|
||||
--> $DIR/issue-110164.rs:10:5
|
||||
|
|
||||
LL | use _::*;
|
||||
| ^ expected identifier, found reserved identifier
|
||||
|
||||
error: expected identifier, found reserved identifier `_`
|
||||
--> $DIR/issue-110164.rs:16:9
|
||||
--> $DIR/issue-110164.rs:14:9
|
||||
|
|
||||
LL | use _::a;
|
||||
| ^ expected identifier, found reserved identifier
|
||||
|
||||
error: expected identifier, found reserved identifier `_`
|
||||
--> $DIR/issue-110164.rs:19:9
|
||||
--> $DIR/issue-110164.rs:16:9
|
||||
|
|
||||
LL | use _::*;
|
||||
| ^ expected identifier, found reserved identifier
|
||||
@@ -34,38 +34,6 @@ error[E0432]: unresolved import `crate::*`
|
||||
LL | use crate::*;
|
||||
| ^^^^^^^^ cannot glob-import a module into itself
|
||||
|
||||
error[E0432]: unresolved import `_`
|
||||
--> $DIR/issue-110164.rs:11:5
|
||||
|
|
||||
LL | use _::*;
|
||||
| ^ use of unresolved module or unlinked crate `_`
|
||||
|
|
||||
= help: you might be missing a crate named `_`
|
||||
|
||||
error[E0432]: unresolved import `_`
|
||||
--> $DIR/issue-110164.rs:8:5
|
||||
|
|
||||
LL | use _::a;
|
||||
| ^ use of unresolved module or unlinked crate `_`
|
||||
|
|
||||
= help: you might be missing a crate named `_`
|
||||
|
||||
error[E0432]: unresolved import `_`
|
||||
--> $DIR/issue-110164.rs:16:9
|
||||
|
|
||||
LL | use _::a;
|
||||
| ^ use of unresolved module or unlinked crate `_`
|
||||
|
|
||||
= help: you might be missing a crate named `_`
|
||||
|
||||
error[E0432]: unresolved import `_`
|
||||
--> $DIR/issue-110164.rs:19:9
|
||||
|
|
||||
LL | use _::*;
|
||||
| ^ use of unresolved module or unlinked crate `_`
|
||||
|
|
||||
= help: you might be missing a crate named `_`
|
||||
|
||||
error: aborting due to 10 previous errors
|
||||
error: aborting due to 6 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0432`.
|
||||
|
||||
@@ -7,16 +7,12 @@
|
||||
//~^ ERROR unresolved import `crate::*`
|
||||
use _::a;
|
||||
//~^ ERROR expected identifier, found reserved identifier `_`
|
||||
//~| ERROR unresolved import `_`
|
||||
use _::*;
|
||||
//~^ ERROR expected identifier, found reserved identifier `_`
|
||||
//~| ERROR unresolved import `_`
|
||||
|
||||
fn main() {
|
||||
use _::a;
|
||||
//~^ ERROR expected identifier, found reserved identifier `_`
|
||||
//~| ERROR unresolved import `_`
|
||||
use _::*;
|
||||
//~^ ERROR expected identifier, found reserved identifier `_`
|
||||
//~| ERROR unresolved import `_`
|
||||
}
|
||||
|
||||
@@ -0,0 +1,49 @@
|
||||
error: expected identifier, found reserved identifier `_`
|
||||
--> $DIR/multiple-uses.rs:4:9
|
||||
|
|
||||
LL | pub use _::{a, b};
|
||||
| ^ expected identifier, found reserved identifier
|
||||
|
||||
error: expected identifier, found reserved identifier `_`
|
||||
--> $DIR/multiple-uses.rs:6:18
|
||||
|
|
||||
LL | pub use std::{a, _};
|
||||
| ^ expected identifier, found reserved identifier
|
||||
|
||||
error: expected identifier, found reserved identifier `_`
|
||||
--> $DIR/multiple-uses.rs:9:18
|
||||
|
|
||||
LL | pub use std::{b, _, c};
|
||||
| ^ expected identifier, found reserved identifier
|
||||
|
||||
error: expected identifier, found reserved identifier `_`
|
||||
--> $DIR/multiple-uses.rs:12:15
|
||||
|
|
||||
LL | pub use std::{_, d};
|
||||
| ^ expected identifier, found reserved identifier
|
||||
|
||||
error[E0432]: unresolved import `std::a`
|
||||
--> $DIR/multiple-uses.rs:6:15
|
||||
|
|
||||
LL | pub use std::{a, _};
|
||||
| ^ no `a` in the root
|
||||
|
||||
error[E0432]: unresolved imports `std::b`, `std::c`
|
||||
--> $DIR/multiple-uses.rs:9:15
|
||||
|
|
||||
LL | pub use std::{b, _, c};
|
||||
| ^ ^
|
||||
| | |
|
||||
| | no `c` in the root
|
||||
| | help: a similar name exists in the module: `rc`
|
||||
| no `b` in the root
|
||||
|
||||
error[E0432]: unresolved import `std::d`
|
||||
--> $DIR/multiple-uses.rs:12:18
|
||||
|
|
||||
LL | pub use std::{_, d};
|
||||
| ^ no `d` in the root
|
||||
|
||||
error: aborting due to 7 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0432`.
|
||||
@@ -0,0 +1,49 @@
|
||||
error: expected identifier, found reserved identifier `_`
|
||||
--> $DIR/multiple-uses.rs:4:9
|
||||
|
|
||||
LL | pub use _::{a, b};
|
||||
| ^ expected identifier, found reserved identifier
|
||||
|
||||
error: expected identifier, found reserved identifier `_`
|
||||
--> $DIR/multiple-uses.rs:6:18
|
||||
|
|
||||
LL | pub use std::{a, _};
|
||||
| ^ expected identifier, found reserved identifier
|
||||
|
||||
error: expected identifier, found reserved identifier `_`
|
||||
--> $DIR/multiple-uses.rs:9:18
|
||||
|
|
||||
LL | pub use std::{b, _, c};
|
||||
| ^ expected identifier, found reserved identifier
|
||||
|
||||
error: expected identifier, found reserved identifier `_`
|
||||
--> $DIR/multiple-uses.rs:12:15
|
||||
|
|
||||
LL | pub use std::{_, d};
|
||||
| ^ expected identifier, found reserved identifier
|
||||
|
||||
error[E0432]: unresolved import `std::a`
|
||||
--> $DIR/multiple-uses.rs:6:15
|
||||
|
|
||||
LL | pub use std::{a, _};
|
||||
| ^ no `a` in the root
|
||||
|
||||
error[E0432]: unresolved imports `std::b`, `std::c`
|
||||
--> $DIR/multiple-uses.rs:9:15
|
||||
|
|
||||
LL | pub use std::{b, _, c};
|
||||
| ^ ^
|
||||
| | |
|
||||
| | no `c` in the root
|
||||
| | help: a similar name exists in the module: `rc`
|
||||
| no `b` in the root
|
||||
|
||||
error[E0432]: unresolved import `std::d`
|
||||
--> $DIR/multiple-uses.rs:12:18
|
||||
|
|
||||
LL | pub use std::{_, d};
|
||||
| ^ no `d` in the root
|
||||
|
||||
error: aborting due to 7 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0432`.
|
||||
@@ -0,0 +1,16 @@
|
||||
//@ revisions: ed2015 ed2021
|
||||
//@[ed2015] edition: 2015
|
||||
//@[ed2021] edition: 2021
|
||||
pub use _::{a, b};
|
||||
//~^ ERROR expected identifier, found reserved identifier `_`
|
||||
pub use std::{a, _};
|
||||
//~^ ERROR expected identifier, found reserved identifier `_`
|
||||
//~| ERROR unresolved import `std::a`
|
||||
pub use std::{b, _, c};
|
||||
//~^ ERROR expected identifier, found reserved identifier `_`
|
||||
//~| ERROR unresolved imports `std::b`, `std::c`
|
||||
pub use std::{_, d};
|
||||
//~^ ERROR expected identifier, found reserved identifier `_`
|
||||
//~| ERROR unresolved import `std::d`
|
||||
|
||||
fn main() {}
|
||||
Reference in New Issue
Block a user