Closed
Description
I tried the following on the current nightly build:
macro_rules! foo {
($arg:expr) => {
#[foo]
fn bar() {
let _bar: u32 = $arg;
}
};
}
foo!("baz");
// In a different, proc-macro crate:
#[proc_macro_attribute]
pub fn foo(_args: TokenStream, item: TokenStream) -> TokenStream {
item
}
I expected to see something like the following:
error[E0308]: mismatched types
--> src/lib.rs:3:9
|
| foo!("baz");
| ^^^^^
| |
| expected `u32`, found `&str`
error: aborting due to previous error
Instead, the error message lacks any span or additional context at all:
error[E0308]: mismatched types
error: aborting due to previous error
Removing the #[foo]
from the macro_rules!
body, or writing #[foo] fn bar() { ... }
manually without going through the foo!
macro, produces a correct error message; it's only when they are combined that the error loses contextual information.
Meta
The current beta and nightly builds are affected:
rustc --version --verbose
:
rustc 1.47.0-nightly (de521cbb3 2020-08-21)
binary: rustc
commit-hash: de521cbb303c08febd9fa3755caccd4f3e491ea3
commit-date: 2020-08-21
host: x86_64-unknown-linux-gnu
release: 1.47.0-nightly
LLVM version: 10.0
rustc 1.46.0-beta.4 (32c481e15 2020-08-09)
binary: rustc
commit-hash: 32c481e156c6431d2947d865bd2abc2315a931fc
commit-date: 2020-08-09
host: x86_64-unknown-linux-gnu
release: 1.46.0-beta.4
LLVM version: 10.0
The current stable version displays the expected behavior.