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.
Activity
Aaron1011 commentedon Aug 22, 2020
Bisected to #73345
This is caused by the fact that we no longer pass a single
NtItem
to#[foo]
- instead, we pass the individual tokens of thebar
function. Since the tokenstream contains anNtExpr
(for the$arg
metavariable), the pretty-print/reparse check fails, causing us to lose spans.This will be fixed by #73084
Aaron1011 commentedon Sep 5, 2020
Error in the latest nightly:
Rollup merge of rust-lang#83671 - JohnTitor:issue-75801-test, r=Dylan…
Rollup merge of rust-lang#83671 - JohnTitor:issue-75801-test, r=Dylan…