-
Notifications
You must be signed in to change notification settings - Fork 13k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
ICE on assert!("test") #28308
Comments
I ran into this by accidentally typing There's an easier way to see this: #![allow(unused_parens)]
macro_rules! my_assert1 { ($e:expr) => { if !$e { panic!() } } }
macro_rules! my_assert2 { ($e:expr) => { if !($e) { panic!() } } }
// Meaningless text goes here
// And some more meaningless text
fn main() {
my_assert2!("test");
} This fails nicely:
But change the last part to
Alternately, with a macro variable at the start of an offending expression, like this: macro_rules! as_isize { ($e:expr) => { $e as isize } }
fn main() { as_isize!("test"); } …we get the other kind of unprintable span, where the beginning is after the end:
|
It looks like #25385 already discovered that last one. |
This is a work in progress PR that potentially should fix #29084, #28308, #25385, #28288, #31011. I think this may also adresse parts of #2887. The problem in this issues seems to be that when transcribing macro arguments, we just clone the argument Nonterminal, which still has to original spans. This leads to the unprintable spans. One solution would be to update the spans of the inserted argument to match the argument in the macro definition. So for [this testcase](https://github.com/rust-lang/rust/compare/master...fhahn:macro-ice?expand=1#diff-f7def7420c51621640707b6337726876R2) the error message would be displayed in the macro definition: src/test/compile-fail/issue-31011.rs:4:12: 4:22 error: attempted access of field `trace` on type `&T`, but no field with that name was found src/test/compile-fail/issue-31011.rs:4 if $ctx.trace { Currently I've added a very simple `update_span` function, which updates the span of the outer-most expression of a `NtExpr`, but this `update_span` function should be updated to handle all Nonterminals. But I'm pretty new to the macro system and would like to check if this approach makes sense, before doing that.
While playing around on the playground, I found that this reports an ICE:
This repros on stable, beta, and nightly
The text was updated successfully, but these errors were encountered: