@@ -991,19 +991,19 @@ fn check_borrow_conflicts_in_at_patterns(cx: &MatchVisitor<'_, '_, '_>, pat: &Pa
991991 // Report errors if any.
992992 if !conflicts_mut_mut. is_empty ( ) {
993993 // Report mutability conflicts for e.g. `ref mut x @ Some(ref mut y)`.
994- let mut err = sess
995- . struct_span_err ( pat. span , "cannot borrow value as mutable more than once at a time" ) ;
996- err. span_label ( binding_span, format ! ( "first mutable borrow, by `{}`, occurs here" , name) ) ;
994+ let mut occurences = vec ! [ ] ;
995+
997996 for ( span, name) in conflicts_mut_mut {
998- err . span_label ( span , format ! ( "another mutable borrow, by `{}`, occurs here" , name) ) ;
997+ occurences . push ( MultipleMutBorrowOccurence :: Mutable { span , name_mut : name } ) ;
999998 }
1000999 for ( span, name) in conflicts_mut_ref {
1001- err . span_label ( span , format ! ( "also borrowed as immutable, by `{}`, here" , name) ) ;
1000+ occurences . push ( MultipleMutBorrowOccurence :: Immutable { span , name_immut : name } ) ;
10021001 }
10031002 for ( span, name) in conflicts_move {
1004- err . span_label ( span , format ! ( "also moved into `{}` here" , name) ) ;
1003+ occurences . push ( MultipleMutBorrowOccurence :: Moved { span , name_moved : name } ) ;
10051004 }
1006- err. emit ( ) ;
1005+
1006+ sess. emit_err ( MultipleMutBorrows { span : pat. span , binding_span, occurences, name } ) ;
10071007 } else if !conflicts_mut_ref. is_empty ( ) {
10081008 // Report mutability conflicts for e.g. `ref x @ Some(ref mut y)` or the converse.
10091009 let ( primary, also) = match mut_outer {
0 commit comments