@@ -161,41 +161,32 @@ impl<'cx, 'tcx> crate::MirBorrowckCtxt<'cx, 'tcx> {
161161 msg_old : & str ,
162162 old_load_end_span : Option < Span > ,
163163 ) -> DiagnosticBuilder < ' cx , ErrorGuaranteed > {
164- let via =
165- |msg : & str | if msg. is_empty ( ) { "" . to_string ( ) } else { format ! ( " (via {})" , msg) } ;
166- let mut err = struct_span_err ! (
167- self ,
168- span,
169- E0502 ,
170- "cannot borrow {}{} as {} because {} is also borrowed as {}{}" ,
164+ use crate :: session_diagnostics:: BorrowOccurLabel :: * ;
165+ let via = |msg : & str | msg. is_empty ( ) ;
166+ let ( new_occur, old_occur) = if msg_new == "" {
167+ // If `msg_new` is empty, then this isn't a borrow of a union field.
168+ ( Here { span, kind : kind_new } , Here { span : old_span, kind : kind_old } )
169+ } else {
170+ // If `msg_new` isn't empty, then this a borrow of a union field.
171+ (
172+ HereOverlap { span, kind_new, msg_new, msg_old } ,
173+ HereVia { span : old_span, kind_old, is_msg_old_empty : via ( msg_old) , msg_old } ,
174+ )
175+ } ;
176+ self . infcx . tcx . sess . create_err ( crate :: session_diagnostics:: ReborrowBorrowedErr {
171177 desc_new,
172- via( msg_new) ,
178+ is_msg_new_empty : via ( msg_new) ,
179+ msg_new,
173180 kind_new,
174181 noun_old,
175182 kind_old,
176- via( msg_old) ,
177- ) ;
178-
179- if msg_new == "" {
180- // If `msg_new` is empty, then this isn't a borrow of a union field.
181- err. span_label ( span, format ! ( "{} borrow occurs here" , kind_new) ) ;
182- err. span_label ( old_span, format ! ( "{} borrow occurs here" , kind_old) ) ;
183- } else {
184- // If `msg_new` isn't empty, then this a borrow of a union field.
185- err. span_label (
186- span,
187- format ! (
188- "{} borrow of {} -- which overlaps with {} -- occurs here" ,
189- kind_new, msg_new, msg_old,
190- ) ,
191- ) ;
192- err. span_label ( old_span, format ! ( "{} borrow occurs here{}" , kind_old, via( msg_old) ) ) ;
193- }
194-
195- if let Some ( old_load_end_span) = old_load_end_span {
196- err. span_label ( old_load_end_span, format ! ( "{} borrow ends here" , kind_old) ) ;
197- }
198- err
183+ is_msg_old_empty : via ( msg_old) ,
184+ msg_old,
185+ span,
186+ old_load_end_span,
187+ new_occur,
188+ old_occur,
189+ } )
199190 }
200191
201192 pub ( crate ) fn cannot_assign_to_borrowed (
0 commit comments