@@ -19,7 +19,6 @@ use std::cell::RefCell;
1919use std:: collections:: BTreeMap ;
2020use std:: marker:: PhantomData ;
2121use std:: ops:: Deref ;
22- use std:: rc:: Rc ;
2322
2423use consumers:: { BodyWithBorrowckFacts , ConsumerOptions } ;
2524use rustc_data_structures:: fx:: { FxIndexMap , FxIndexSet } ;
@@ -200,8 +199,7 @@ fn do_mir_borrowck<'tcx>(
200199. into_results_cursor ( body) ;
201200
202201let locals_are_invalidated_at_exit = tcx. hir ( ) . body_owner_kind ( def) . is_fn_or_closure ( ) ;
203- let borrow_set =
204- Rc :: new ( BorrowSet :: build ( tcx, body, locals_are_invalidated_at_exit, & move_data) ) ;
202+ let borrow_set = BorrowSet :: build ( tcx, body, locals_are_invalidated_at_exit, & move_data) ;
205203
206204// Compute non-lexical lifetimes.
207205let nll:: NllOutput {
@@ -245,8 +243,6 @@ fn do_mir_borrowck<'tcx>(
245243// usage significantly on some benchmarks.
246244drop ( flow_inits) ;
247245
248- let regioncx = Rc :: new ( regioncx) ;
249-
250246let flow_borrows = Borrows :: new ( tcx, body, & regioncx, & borrow_set)
251247. into_engine ( tcx, body)
252248. pass_name ( "borrowck" )
@@ -288,10 +284,10 @@ fn do_mir_borrowck<'tcx>(
288284access_place_error_reported : Default :: default ( ) ,
289285reservation_error_reported : Default :: default ( ) ,
290286uninitialized_error_reported : Default :: default ( ) ,
291- regioncx : regioncx. clone ( ) ,
287+ regioncx : & regioncx,
292288used_mut : Default :: default ( ) ,
293289used_mut_upvars : SmallVec :: new ( ) ,
294- borrow_set : Rc :: clone ( & borrow_set) ,
290+ borrow_set : & borrow_set,
295291upvars : & [ ] ,
296292local_names : IndexVec :: from_elem ( None , & promoted_body. local_decls ) ,
297293region_names : RefCell :: default ( ) ,
@@ -329,10 +325,10 @@ fn do_mir_borrowck<'tcx>(
329325access_place_error_reported : Default :: default ( ) ,
330326reservation_error_reported : Default :: default ( ) ,
331327uninitialized_error_reported : Default :: default ( ) ,
332- regioncx : Rc :: clone ( & regioncx) ,
328+ regioncx : & regioncx,
333329used_mut : Default :: default ( ) ,
334330used_mut_upvars : SmallVec :: new ( ) ,
335- borrow_set : Rc :: clone ( & borrow_set) ,
331+ borrow_set : & borrow_set,
336332upvars : tcx. closure_captures ( def) ,
337333 local_names,
338334region_names : RefCell :: default ( ) ,
@@ -569,10 +565,10 @@ struct MirBorrowckCtxt<'a, 'infcx, 'tcx> {
569565used_mut_upvars : SmallVec < [ FieldIdx ; 8 ] > ,
570566/// Region inference context. This contains the results from region inference and lets us e.g.
571567/// find out which CFG points are contained in each borrow region.
572- regioncx : Rc < RegionInferenceContext < ' tcx > > ,
568+ regioncx : & ' a RegionInferenceContext < ' tcx > ,
573569
574570/// The set of borrows extracted from the MIR
575- borrow_set : Rc < BorrowSet < ' tcx > > ,
571+ borrow_set : & ' a BorrowSet < ' tcx > ,
576572
577573/// Information about upvars not necessarily preserved in types or MIR
578574upvars : & ' tcx [ & ' tcx ty:: CapturedPlace < ' tcx > ] ,
@@ -588,7 +584,7 @@ struct MirBorrowckCtxt<'a, 'infcx, 'tcx> {
588584next_region_name : RefCell < usize > ,
589585
590586/// Results of Polonius analysis.
591- polonius_output : Option < Rc < PoloniusOutput > > ,
587+ polonius_output : Option < Box < PoloniusOutput > > ,
592588
593589diags : diags:: BorrowckDiags < ' infcx , ' tcx > ,
594590move_errors : Vec < MoveError < ' tcx > > ,
@@ -800,9 +796,8 @@ impl<'a, 'tcx, R> rustc_mir_dataflow::ResultsVisitor<'a, 'tcx, R>
800796TerminatorKind :: Yield { value : _, resume : _, resume_arg : _, drop : _ } => {
801797if self . movable_coroutine {
802798// Look for any active borrows to locals
803- let borrow_set = self . borrow_set . clone ( ) ;
804799for i in state. borrows . iter ( ) {
805- let borrow = & borrow_set[ i] ;
800+ let borrow = & self . borrow_set [ i] ;
806801self . check_for_local_borrow ( borrow, span) ;
807802}
808803}
@@ -816,9 +811,8 @@ impl<'a, 'tcx, R> rustc_mir_dataflow::ResultsVisitor<'a, 'tcx, R>
816811// Often, the storage will already have been killed by an explicit
817812// StorageDead, but we don't always emit those (notably on unwind paths),
818813// so this "extra check" serves as a kind of backup.
819- let borrow_set = self . borrow_set . clone ( ) ;
820814for i in state. borrows . iter ( ) {
821- let borrow = & borrow_set[ i] ;
815+ let borrow = & self . borrow_set [ i] ;
822816self . check_for_invalidation_at_exit ( loc, borrow, span) ;
823817}
824818}
@@ -1037,13 +1031,12 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, '_, 'tcx> {
10371031state : & BorrowckDomain < ' a , ' tcx > ,
10381032) -> bool {
10391033let mut error_reported = false ;
1040- let borrow_set = Rc :: clone ( & self . borrow_set ) ;
10411034
10421035// Use polonius output if it has been enabled.
10431036let mut polonius_output;
10441037let borrows_in_scope = if let Some ( polonius) = & self . polonius_output {
10451038let location = self . location_table . start_index ( location) ;
1046- polonius_output = BitSet :: new_empty ( borrow_set. len ( ) ) ;
1039+ polonius_output = BitSet :: new_empty ( self . borrow_set . len ( ) ) ;
10471040for & idx in polonius. errors_at ( location) {
10481041 polonius_output. insert ( idx) ;
10491042}
@@ -1057,7 +1050,7 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, '_, 'tcx> {
10571050self . infcx . tcx ,
10581051self . body ,
10591052( sd, place_span. 0 ) ,
1060- & borrow_set,
1053+ self . borrow_set ,
10611054 |borrow_index| borrows_in_scope. contains ( borrow_index) ,
10621055 |this, borrow_index, borrow| match ( rw, borrow. kind ) {
10631056// Obviously an activation is compatible with its own
@@ -1580,9 +1573,8 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, '_, 'tcx> {
15801573// Two-phase borrow support: For each activation that is newly
15811574// generated at this statement, check if it interferes with
15821575// another borrow.
1583- let borrow_set = self . borrow_set . clone ( ) ;
1584- for & borrow_index in borrow_set. activations_at_location ( location) {
1585- let borrow = & borrow_set[ borrow_index] ;
1576+ for & borrow_index in self . borrow_set . activations_at_location ( location) {
1577+ let borrow = & self . borrow_set [ borrow_index] ;
15861578
15871579// only mutable borrows should be 2-phase
15881580assert ! ( match borrow. kind {
0 commit comments