diff --git a/compiler/rustc_resolve/src/diagnostics.rs b/compiler/rustc_resolve/src/diagnostics.rs index 60f0ad9e30d..088596b2cbc 100644 --- a/compiler/rustc_resolve/src/diagnostics.rs +++ b/compiler/rustc_resolve/src/diagnostics.rs @@ -971,20 +971,19 @@ impl<'a> Resolver<'a> { false, ident.span, ) { - let it_is = match binding.macro_kind() { - Some(MacroKind::Bang) => "it is a function-like macro".to_string(), - Some(kind) => format!("it is {} {}", kind.article(), kind.descr_expected()), - None => format!( - "it is not {} {}", - macro_kind.article(), - macro_kind.descr_expected() - ), + let desc = match binding.macro_kind() { + Some(MacroKind::Bang) => "a function-like macro".to_string(), + Some(kind) => format!("{} {}", kind.article(), kind.descr_expected()), + None => { + let res = binding.res(); + format!("{} {}", res.article(), res.descr()) + } }; if let crate::NameBindingKind::Import { import, .. } = binding.kind { if !import.span.is_dummy() { err.span_note( import.span, - &format!("`{}` is imported here, but {}", ident, it_is), + &format!("`{}` is imported here, but it is {}", ident, desc), ); // Silence the 'unused import' warning we might get, // since this diagnostic already covers that import. @@ -992,7 +991,7 @@ impl<'a> Resolver<'a> { return; } } - err.note(&format!("`{}` is in scope, but {}", ident, it_is)); + err.note(&format!("`{}` is in scope, but it is {}", ident, desc)); return; } } diff --git a/src/test/ui/macros/issue-88206.rs b/src/test/ui/macros/issue-88206.rs index f0dab54c149..9f1306349e9 100644 --- a/src/test/ui/macros/issue-88206.rs +++ b/src/test/ui/macros/issue-88206.rs @@ -3,18 +3,21 @@ #![warn(unused_imports)] use std::str::*; -//~^ NOTE `from_utf8` is imported here, but it is not a macro -//~| NOTE `from_utf8_mut` is imported here, but it is not a derive macro -//~| NOTE `from_utf8_unchecked` is imported here, but it is not an attribute +//~^ NOTE `from_utf8` is imported here, but it is a function +//~| NOTE `from_utf8_mut` is imported here, but it is a function +//~| NOTE `from_utf8_unchecked` is imported here, but it is a function mod hey { pub trait Serialize {} pub trait Deserialize {} + + pub struct X(i32); } -use hey::{Serialize, Deserialize}; -//~^ NOTE `Serialize` is imported here, but it is not a derive macro -//~| NOTE `Deserialize` is imported here, but it is not an attribute +use hey::{Serialize, Deserialize, X}; +//~^ NOTE `Serialize` is imported here, but it is a trait +//~| NOTE `Deserialize` is imported here, but it is a trait +//~| NOTE `X` is imported here, but it is a struct #[derive(Serialize)] //~^ ERROR cannot find derive macro `Serialize` @@ -48,7 +51,7 @@ fn main() { Box!(); //~^ ERROR cannot find macro `Box` - //~| NOTE `Box` is in scope, but it is not a macro + //~| NOTE `Box` is in scope, but it is a struct Copy!(); //~^ ERROR cannot find macro `Copy` @@ -57,4 +60,7 @@ fn main() { test!(); //~^ ERROR cannot find macro `test` //~| NOTE `test` is in scope, but it is an attribute + + X!(); + //~^ ERROR cannot find macro `X` } diff --git a/src/test/ui/macros/issue-88206.stderr b/src/test/ui/macros/issue-88206.stderr index b6fd606e28c..9220c16f6ae 100644 --- a/src/test/ui/macros/issue-88206.stderr +++ b/src/test/ui/macros/issue-88206.stderr @@ -1,5 +1,17 @@ +error: cannot find macro `X` in this scope + --> $DIR/issue-88206.rs:64:5 + | +LL | X!(); + | ^ + | +note: `X` is imported here, but it is a struct + --> $DIR/issue-88206.rs:17:35 + | +LL | use hey::{Serialize, Deserialize, X}; + | ^ + error: cannot find macro `test` in this scope - --> $DIR/issue-88206.rs:57:5 + --> $DIR/issue-88206.rs:60:5 | LL | test!(); | ^^^^ @@ -7,7 +19,7 @@ LL | test!(); = note: `test` is in scope, but it is an attribute error: cannot find macro `Copy` in this scope - --> $DIR/issue-88206.rs:53:5 + --> $DIR/issue-88206.rs:56:5 | LL | Copy!(); | ^^^^ @@ -15,27 +27,27 @@ LL | Copy!(); = note: `Copy` is in scope, but it is a derive macro error: cannot find macro `Box` in this scope - --> $DIR/issue-88206.rs:49:5 + --> $DIR/issue-88206.rs:52:5 | LL | Box!(); | ^^^ | - = note: `Box` is in scope, but it is not a macro + = note: `Box` is in scope, but it is a struct error: cannot find macro `from_utf8` in this scope - --> $DIR/issue-88206.rs:46:5 + --> $DIR/issue-88206.rs:49:5 | LL | from_utf8!(); | ^^^^^^^^^ | -note: `from_utf8` is imported here, but it is not a macro +note: `from_utf8` is imported here, but it is a function --> $DIR/issue-88206.rs:5:5 | LL | use std::str::*; | ^^^^^^^^^^^ error: cannot find attribute `println` in this scope - --> $DIR/issue-88206.rs:40:3 + --> $DIR/issue-88206.rs:43:3 | LL | #[println] | ^^^^^^^ @@ -43,31 +55,31 @@ LL | #[println] = note: `println` is in scope, but it is a function-like macro error: cannot find attribute `from_utf8_unchecked` in this scope - --> $DIR/issue-88206.rs:36:3 + --> $DIR/issue-88206.rs:39:3 | LL | #[from_utf8_unchecked] | ^^^^^^^^^^^^^^^^^^^ | -note: `from_utf8_unchecked` is imported here, but it is not an attribute +note: `from_utf8_unchecked` is imported here, but it is a function --> $DIR/issue-88206.rs:5:5 | LL | use std::str::*; | ^^^^^^^^^^^ error: cannot find attribute `Deserialize` in this scope - --> $DIR/issue-88206.rs:32:3 + --> $DIR/issue-88206.rs:35:3 | LL | #[Deserialize] | ^^^^^^^^^^^ | -note: `Deserialize` is imported here, but it is not an attribute - --> $DIR/issue-88206.rs:15:22 +note: `Deserialize` is imported here, but it is a trait + --> $DIR/issue-88206.rs:17:22 | -LL | use hey::{Serialize, Deserialize}; +LL | use hey::{Serialize, Deserialize, X}; | ^^^^^^^^^^^ error: cannot find derive macro `println` in this scope - --> $DIR/issue-88206.rs:27:10 + --> $DIR/issue-88206.rs:30:10 | LL | #[derive(println)] | ^^^^^^^ @@ -75,28 +87,28 @@ LL | #[derive(println)] = note: `println` is in scope, but it is a function-like macro error: cannot find derive macro `from_utf8_mut` in this scope - --> $DIR/issue-88206.rs:23:10 + --> $DIR/issue-88206.rs:26:10 | LL | #[derive(from_utf8_mut)] | ^^^^^^^^^^^^^ | -note: `from_utf8_mut` is imported here, but it is not a derive macro +note: `from_utf8_mut` is imported here, but it is a function --> $DIR/issue-88206.rs:5:5 | LL | use std::str::*; | ^^^^^^^^^^^ error: cannot find derive macro `Serialize` in this scope - --> $DIR/issue-88206.rs:19:10 + --> $DIR/issue-88206.rs:22:10 | LL | #[derive(Serialize)] | ^^^^^^^^^ | -note: `Serialize` is imported here, but it is not a derive macro - --> $DIR/issue-88206.rs:15:11 +note: `Serialize` is imported here, but it is a trait + --> $DIR/issue-88206.rs:17:11 | -LL | use hey::{Serialize, Deserialize}; +LL | use hey::{Serialize, Deserialize, X}; | ^^^^^^^^^ -error: aborting due to 10 previous errors +error: aborting due to 11 previous errors diff --git a/src/test/ui/tool-attributes/tool-attributes-misplaced-1.stderr b/src/test/ui/tool-attributes/tool-attributes-misplaced-1.stderr index 2d20d103465..6e875eebb46 100644 --- a/src/test/ui/tool-attributes/tool-attributes-misplaced-1.stderr +++ b/src/test/ui/tool-attributes/tool-attributes-misplaced-1.stderr @@ -4,7 +4,7 @@ error: cannot find derive macro `rustfmt` in this scope LL | #[derive(rustfmt)] | ^^^^^^^ | - = note: `rustfmt` is in scope, but it is not a derive macro + = note: `rustfmt` is in scope, but it is a tool module error: cannot find derive macro `rustfmt` in this scope --> $DIR/tool-attributes-misplaced-1.rs:4:10 @@ -12,7 +12,7 @@ error: cannot find derive macro `rustfmt` in this scope LL | #[derive(rustfmt)] | ^^^^^^^ | - = note: `rustfmt` is in scope, but it is not a derive macro + = note: `rustfmt` is in scope, but it is a tool module error: cannot find attribute `rustfmt` in this scope --> $DIR/tool-attributes-misplaced-1.rs:9:3 @@ -20,7 +20,7 @@ error: cannot find attribute `rustfmt` in this scope LL | #[rustfmt] | ^^^^^^^ | - = note: `rustfmt` is in scope, but it is not an attribute + = note: `rustfmt` is in scope, but it is a tool module error: cannot find macro `rustfmt` in this scope --> $DIR/tool-attributes-misplaced-1.rs:15:5 @@ -28,7 +28,7 @@ error: cannot find macro `rustfmt` in this scope LL | rustfmt!(); | ^^^^^^^ | - = note: `rustfmt` is in scope, but it is not a macro + = note: `rustfmt` is in scope, but it is a tool module error[E0573]: expected type, found tool module `rustfmt` --> $DIR/tool-attributes-misplaced-1.rs:1:10