Fix error span when arg to asm!() is a macro call
When the template string passed to asm!() is produced by a macro call like concat!() we were producing wrong error spans. Now in the case of a macro call we just use the entire arg to asm!(), macro call and all, as the error span.
This commit is contained in:
parent
2b11f265b6
commit
3dd583d540
@ -507,6 +507,7 @@ fn expand_preparsed_asm(
|
|||||||
|
|
||||||
let msg = "asm template must be a string literal";
|
let msg = "asm template must be a string literal";
|
||||||
let template_sp = template_expr.span;
|
let template_sp = template_expr.span;
|
||||||
|
let template_is_mac_call = matches!(template_expr.kind, ast::ExprKind::MacCall(_));
|
||||||
let (template_str, template_style, template_span) = {
|
let (template_str, template_style, template_span) = {
|
||||||
let ExpandResult::Ready(mac) = expr_to_spanned_string(ecx, template_expr, msg) else {
|
let ExpandResult::Ready(mac) = expr_to_spanned_string(ecx, template_expr, msg) else {
|
||||||
return ExpandResult::Retry(());
|
return ExpandResult::Retry(());
|
||||||
@ -596,7 +597,14 @@ fn expand_preparsed_asm(
|
|||||||
|
|
||||||
if !parser.errors.is_empty() {
|
if !parser.errors.is_empty() {
|
||||||
let err = parser.errors.remove(0);
|
let err = parser.errors.remove(0);
|
||||||
let err_sp = template_span.from_inner(InnerSpan::new(err.span.start, err.span.end));
|
let err_sp = if template_is_mac_call {
|
||||||
|
// If the template is a macro call we can't reliably point to the error's
|
||||||
|
// span so just use the template's span as the error span (fixes #129503)
|
||||||
|
template_span
|
||||||
|
} else {
|
||||||
|
template_span.from_inner(InnerSpan::new(err.span.start, err.span.end))
|
||||||
|
};
|
||||||
|
|
||||||
let msg = format!("invalid asm template string: {}", err.description);
|
let msg = format!("invalid asm template string: {}", err.description);
|
||||||
let mut e = ecx.dcx().struct_span_err(err_sp, msg);
|
let mut e = ecx.dcx().struct_span_err(err_sp, msg);
|
||||||
e.span_label(err_sp, err.label + " in asm template string");
|
e.span_label(err_sp, err.label + " in asm template string");
|
||||||
|
@ -1,7 +0,0 @@
|
|||||||
//@ known-bug: rust-lang/rust#129503
|
|
||||||
|
|
||||||
use std::arch::asm;
|
|
||||||
|
|
||||||
unsafe fn f6() {
|
|
||||||
asm!(concat!(r#"lJÆ<F0908FBF>.<>"#, "r} {}"));
|
|
||||||
}
|
|
26
tests/ui/asm/ice-bad-err-span-in-template-129503.rs
Normal file
26
tests/ui/asm/ice-bad-err-span-in-template-129503.rs
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
// Regression test for ICE #129503
|
||||||
|
|
||||||
|
|
||||||
|
// Tests that we come up with decent error spans
|
||||||
|
// when the template fed to `asm!()` is itself a
|
||||||
|
// macro call like `concat!()` and should not ICE
|
||||||
|
|
||||||
|
use std::arch::asm;
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
// Should not ICE
|
||||||
|
asm!(concat!(r#"lJÆ<F0908FBF>.<>"#, "r} {}"));
|
||||||
|
//~^ ERROR invalid asm template string: unmatched `}` found
|
||||||
|
|
||||||
|
|
||||||
|
// Macro call template: should point to
|
||||||
|
// everything within `asm!()` as error span
|
||||||
|
asm!(concat!("abc", "r} {}"));
|
||||||
|
//~^ ERROR invalid asm template string: unmatched `}` found
|
||||||
|
|
||||||
|
|
||||||
|
// Literal template: should point precisely to
|
||||||
|
// just the `}` as error span
|
||||||
|
asm!("abc", "r} {}");
|
||||||
|
//~^ ERROR invalid asm template string: unmatched `}` found
|
||||||
|
}
|
28
tests/ui/asm/ice-bad-err-span-in-template-129503.stderr
Normal file
28
tests/ui/asm/ice-bad-err-span-in-template-129503.stderr
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
error: invalid asm template string: unmatched `}` found
|
||||||
|
--> $DIR/ice-bad-err-span-in-template-129503.rs:12:10
|
||||||
|
|
|
||||||
|
LL | asm!(concat!(r#"lJÆ<F0908FBF>.<>"#, "r} {}"));
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ unmatched `}` in asm template string
|
||||||
|
|
|
||||||
|
= note: if you intended to print `}`, you can escape it using `}}`
|
||||||
|
= note: this error originates in the macro `concat` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||||
|
|
||||||
|
error: invalid asm template string: unmatched `}` found
|
||||||
|
--> $DIR/ice-bad-err-span-in-template-129503.rs:18:10
|
||||||
|
|
|
||||||
|
LL | asm!(concat!("abc", "r} {}"));
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^ unmatched `}` in asm template string
|
||||||
|
|
|
||||||
|
= note: if you intended to print `}`, you can escape it using `}}`
|
||||||
|
= note: this error originates in the macro `concat` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||||
|
|
||||||
|
error: invalid asm template string: unmatched `}` found
|
||||||
|
--> $DIR/ice-bad-err-span-in-template-129503.rs:24:19
|
||||||
|
|
|
||||||
|
LL | asm!("abc", "r} {}");
|
||||||
|
| ^ unmatched `}` in asm template string
|
||||||
|
|
|
||||||
|
= note: if you intended to print `}`, you can escape it using `}}`
|
||||||
|
|
||||||
|
error: aborting due to 3 previous errors
|
||||||
|
|
Loading…
Reference in New Issue
Block a user