@@ -1208,6 +1208,7 @@ pub struct CguMessage;
12081208// - `is_lint`: lints aren't relevant during codegen.
12091209// - `emitted_at`: not used for codegen diagnostics.
12101210struct Diagnostic {
1211+ span : Vec < SpanData > ,
12111212 level : Level ,
12121213 messages : Vec < ( DiagMessage , Style ) > ,
12131214 code : Option < ErrCode > ,
@@ -1218,7 +1219,7 @@ struct Diagnostic {
12181219// A cut-down version of `rustc_errors::Subdiag` that impls `Send`. It's
12191220// missing the following fields from `rustc_errors::Subdiag`.
12201221// - `span`: it doesn't impl `Send`.
1221- pub ( crate ) struct Subdiagnostic {
1222+ struct Subdiagnostic {
12221223 level : Level ,
12231224 messages : Vec < ( DiagMessage , Style ) > ,
12241225}
@@ -1897,10 +1898,17 @@ fn spawn_thin_lto_work<'a, B: ExtraBackendMethods>(
18971898
18981899enum SharedEmitterMessage {
18991900 Diagnostic ( Diagnostic ) ,
1900- InlineAsmError ( SpanData , String , Level , Option < ( String , Vec < InnerSpan > ) > ) ,
1901+ InlineAsmError ( InlineAsmError ) ,
19011902 Fatal ( String ) ,
19021903}
19031904
1905+ pub struct InlineAsmError {
1906+ pub span : SpanData ,
1907+ pub msg : String ,
1908+ pub level : Level ,
1909+ pub source : Option < ( String , Vec < InnerSpan > ) > ,
1910+ }
1911+
19041912#[ derive( Clone ) ]
19051913pub struct SharedEmitter {
19061914 sender : Sender < SharedEmitterMessage > ,
@@ -1917,14 +1925,8 @@ impl SharedEmitter {
19171925 ( SharedEmitter { sender } , SharedEmitterMain { receiver } )
19181926 }
19191927
1920- pub fn inline_asm_error (
1921- & self ,
1922- span : SpanData ,
1923- msg : String ,
1924- level : Level ,
1925- source : Option < ( String , Vec < InnerSpan > ) > ,
1926- ) {
1927- drop ( self . sender . send ( SharedEmitterMessage :: InlineAsmError ( span, msg, level, source) ) ) ;
1928+ pub fn inline_asm_error ( & self , err : InlineAsmError ) {
1929+ drop ( self . sender . send ( SharedEmitterMessage :: InlineAsmError ( err) ) ) ;
19281930 }
19291931
19301932 fn fatal ( & self , msg : & str ) {
@@ -1940,7 +1942,7 @@ impl Emitter for SharedEmitter {
19401942 ) {
19411943 // Check that we aren't missing anything interesting when converting to
19421944 // the cut-down local `DiagInner`.
1943- assert_eq ! ( diag. span, MultiSpan :: new ( ) ) ;
1945+ assert ! ( ! diag. span. has_span_labels ( ) ) ;
19441946 assert_eq ! ( diag. suggestions, Suggestions :: Enabled ( vec![ ] ) ) ;
19451947 assert_eq ! ( diag. sort_span, rustc_span:: DUMMY_SP ) ;
19461948 assert_eq ! ( diag. is_lint, None ) ;
@@ -1949,6 +1951,7 @@ impl Emitter for SharedEmitter {
19491951 let args = mem:: replace ( & mut diag. args , DiagArgMap :: default ( ) ) ;
19501952 drop (
19511953 self . sender . send ( SharedEmitterMessage :: Diagnostic ( Diagnostic {
1954+ span : diag. span . primary_spans ( ) . iter ( ) . map ( |span| span. data ( ) ) . collect :: < Vec < _ > > ( ) ,
19521955 level : diag. level ( ) ,
19531956 messages : diag. messages ,
19541957 code : diag. code ,
@@ -1993,6 +1996,9 @@ impl SharedEmitterMain {
19931996 let dcx = sess. dcx ( ) ;
19941997 let mut d =
19951998 rustc_errors:: DiagInner :: new_with_messages ( diag. level , diag. messages ) ;
1999+ d. span = MultiSpan :: from_spans (
2000+ diag. span . into_iter ( ) . map ( |span| span. span ( ) ) . collect ( ) ,
2001+ ) ;
19962002 d. code = diag. code ; // may be `None`, that's ok
19972003 d. children = diag
19982004 . children
@@ -2007,15 +2013,15 @@ impl SharedEmitterMain {
20072013 dcx. emit_diagnostic ( d) ;
20082014 sess. dcx ( ) . abort_if_errors ( ) ;
20092015 }
2010- Ok ( SharedEmitterMessage :: InlineAsmError ( span , msg , level , source ) ) => {
2011- assert_matches ! ( level, Level :: Error | Level :: Warning | Level :: Note ) ;
2012- let mut err = Diag :: < ( ) > :: new ( sess. dcx ( ) , level, msg) ;
2013- if !span. is_dummy ( ) {
2014- err. span ( span. span ( ) ) ;
2016+ Ok ( SharedEmitterMessage :: InlineAsmError ( inner ) ) => {
2017+ assert_matches ! ( inner . level, Level :: Error | Level :: Warning | Level :: Note ) ;
2018+ let mut err = Diag :: < ( ) > :: new ( sess. dcx ( ) , inner . level , inner . msg ) ;
2019+ if !inner . span . is_dummy ( ) {
2020+ err. span ( inner . span . span ( ) ) ;
20152021 }
20162022
20172023 // Point to the generated assembly if it is available.
2018- if let Some ( ( buffer, spans) ) = source {
2024+ if let Some ( ( buffer, spans) ) = inner . source {
20192025 let source = sess
20202026 . source_map ( )
20212027 . new_source_file ( FileName :: inline_asm_source_code ( & buffer) , buffer) ;
0 commit comments