@@ -1506,20 +1506,35 @@ impl<'cx, 'gcx, 'tcx> MirBorrowckCtxt<'cx, 'gcx, 'tcx> {
15061506 }
15071507
15081508 fn specialized_description ( & self , place : & Place < ' tcx > ) -> Option < String > {
1509- if let Some ( name ) = self . describe_place ( place) {
1510- Some ( format ! ( "`&`-reference `{}`" , name ) )
1509+ if let Some ( _name ) = self . describe_place ( place) {
1510+ Some ( format ! ( "data in a `&` reference" ) )
15111511 } else {
15121512 None
15131513 }
15141514 }
15151515
1516- fn get_main_error_message ( & self , place : & Place < ' tcx > ) -> String {
1516+ fn get_default_err_msg ( & self , place : & Place < ' tcx > ) -> String {
15171517 match self . describe_place ( place) {
15181518 Some ( name) => format ! ( "immutable item `{}`" , name) ,
15191519 None => "immutable item" . to_owned ( ) ,
15201520 }
15211521 }
15221522
1523+ fn get_secondary_err_msg ( & self , place : & Place < ' tcx > ) -> String {
1524+ match self . specialized_description ( place) {
1525+ Some ( _) => format ! ( "data in a `&` reference" ) ,
1526+ None => self . get_default_err_msg ( place)
1527+ }
1528+ }
1529+
1530+ fn get_primary_err_msg ( & self , place : & Place < ' tcx > ) -> String {
1531+ if let Some ( name) = self . describe_place ( place) {
1532+ format ! ( "`{}` is a `&` reference, so the data it refers to cannot be written" , name)
1533+ } else {
1534+ format ! ( "cannot assign through `&`-reference" )
1535+ }
1536+ }
1537+
15231538 /// Check the permissions for the given place and read or write kind
15241539 ///
15251540 /// Returns true if an error is reported, false otherwise.
@@ -1546,7 +1561,7 @@ impl<'cx, 'gcx, 'tcx> MirBorrowckCtxt<'cx, 'gcx, 'tcx> {
15461561 self . is_mutable ( place, is_local_mutation_allowed)
15471562 {
15481563 error_reported = true ;
1549- let item_msg = self . get_main_error_message ( place) ;
1564+ let item_msg = self . get_default_err_msg ( place) ;
15501565 let mut err = self . tcx
15511566 . cannot_borrow_path_as_mutable ( span, & item_msg, Origin :: Mir ) ;
15521567 err. span_label ( span, "cannot borrow as mutable" ) ;
@@ -1576,18 +1591,16 @@ impl<'cx, 'gcx, 'tcx> MirBorrowckCtxt<'cx, 'gcx, 'tcx> {
15761591 let locations = self . mir . find_assignments ( local) ;
15771592 if locations. len ( ) > 0 {
15781593 let item_msg = if error_reported {
1579- match self . specialized_description ( base) {
1580- Some ( msg) => msg,
1581- None => self . get_main_error_message ( place)
1582- }
1594+ self . get_secondary_err_msg ( base)
15831595 } else {
1584- self . get_main_error_message ( place)
1596+ self . get_default_err_msg ( place)
15851597 } ;
1598+
15861599 err_info = Some ( (
15871600 self . mir . source_info ( locations[ 0 ] ) . span ,
15881601 "consider changing this to be a \
15891602 mutable reference: `&mut`", item_msg,
1590- "cannot assign through `&`-reference" ) ) ;
1603+ self . get_primary_err_msg ( base ) ) ) ;
15911604 }
15921605 } ,
15931606 _ => { } ,
@@ -1597,15 +1610,15 @@ impl<'cx, 'gcx, 'tcx> MirBorrowckCtxt<'cx, 'gcx, 'tcx> {
15971610 }
15981611
15991612 if let Some ( ( err_help_span, err_help_stmt, item_msg, sec_span) ) = err_info {
1600- let mut err = self . tcx . cannot_assign ( span, & item_msg, Origin :: Mir , true ) ;
1613+ let mut err = self . tcx . cannot_assign ( span, & item_msg, Origin :: Mir ) ;
16011614 err. span_suggestion ( err_help_span, err_help_stmt, format ! ( "" ) ) ;
16021615 if place != place_err {
16031616 err. span_label ( span, sec_span) ;
16041617 }
16051618 err. emit ( )
16061619 } else {
1607- let item_msg_ = self . get_main_error_message ( place) ;
1608- let mut err = self . tcx . cannot_assign ( span, & item_msg_, Origin :: Mir , false ) ;
1620+ let item_msg_ = self . get_default_err_msg ( place) ;
1621+ let mut err = self . tcx . cannot_assign ( span, & item_msg_, Origin :: Mir ) ;
16091622 err. span_label ( span, "cannot mutate" ) ;
16101623 if place != place_err {
16111624 if let Some ( name) = self . describe_place ( place_err) {
0 commit comments