@@ -288,6 +288,18 @@ fn expand_preparsed_asm(
288288 let msg = "asm template must be a string literal" ;
289289 let template_sp = template_expr. span ;
290290 let template_is_mac_call = matches ! ( template_expr. kind, ast:: ExprKind :: MacCall ( _) ) ;
291+
292+ // Gets the span inside `template_sp` corresponding to the given range
293+ let span_in_template = |range : std:: ops:: Range < usize > | -> Span {
294+ if template_is_mac_call {
295+ // When the template is a macro call we can't reliably get inner spans
296+ // so just use the entire template span (see ICEs #129503, #131292)
297+ template_sp
298+ } else {
299+ template_sp. from_inner ( InnerSpan :: new ( range. start , range. end ) )
300+ }
301+ } ;
302+
291303 let ExprToSpannedString {
292304 symbol : template_str,
293305 style : template_style,
@@ -382,13 +394,8 @@ fn expand_preparsed_asm(
382394
383395 if !parser. errors . is_empty ( ) {
384396 let err = parser. errors . remove ( 0 ) ;
385- let err_sp = if template_is_mac_call {
386- // If the template is a macro call we can't reliably point to the error's
387- // span so just use the template's span as the error span (fixes #129503)
388- template_span
389- } else {
390- template_span. from_inner ( InnerSpan :: new ( err. span . start , err. span . end ) )
391- } ;
397+
398+ let err_sp = span_in_template ( err. span ) ;
392399
393400 let msg = format ! ( "invalid asm template string: {}" , err. description) ;
394401 let mut e = ecx. dcx ( ) . struct_span_err ( err_sp, msg) ;
@@ -397,8 +404,7 @@ fn expand_preparsed_asm(
397404 e. note ( note) ;
398405 }
399406 if let Some ( ( label, span) ) = err. secondary_label {
400- let err_sp = template_span. from_inner ( InnerSpan :: new ( span. start , span. end ) ) ;
401- e. span_label ( err_sp, label) ;
407+ e. span_label ( span_in_template ( span) , label) ;
402408 }
403409 let guar = e. emit ( ) ;
404410 return ExpandResult :: Ready ( Err ( guar) ) ;
@@ -477,8 +483,7 @@ fn expand_preparsed_asm(
477483 ecx. dcx ( )
478484 . create_err ( errors:: AsmNoMatchedArgumentName {
479485 name : name. to_owned ( ) ,
480- span : template_span
481- . from_inner ( InnerSpan :: new ( span. start , span. end ) ) ,
486+ span : span_in_template ( span) ,
482487 } )
483488 . emit ( ) ;
484489 None
@@ -490,11 +495,7 @@ fn expand_preparsed_asm(
490495 let mut chars = arg. format . ty . chars ( ) ;
491496 let mut modifier = chars. next ( ) ;
492497 if chars. next ( ) . is_some ( ) {
493- let span = arg
494- . format
495- . ty_span
496- . map ( |sp| template_sp. from_inner ( InnerSpan :: new ( sp. start , sp. end ) ) )
497- . unwrap_or ( template_sp) ;
498+ let span = arg. format . ty_span . map ( span_in_template) . unwrap_or ( template_sp) ;
498499 ecx. dcx ( ) . emit_err ( errors:: AsmModifierInvalid { span } ) ;
499500 modifier = None ;
500501 }
0 commit comments