@@ -544,19 +544,6 @@ impl<'c, 'b, 'a: 'b+'c, 'gcx, 'tcx: 'a> MirBorrowckCtxt<'c, 'b, 'a, 'gcx, 'tcx>
544544 }
545545 }
546546 }
547-
548- #[ cfg( not_anymore) ]
549- fn borrow ( & mut self ,
550- context : Context ,
551- location : Location ,
552- bk : BorrowKind ,
553- lvalue_span : ( & Lvalue < ' gcx > , Span ) ,
554- flow_state : & InProgress < ' b , ' gcx > ) {
555- debug ! ( "borrow location: {:?} lvalue: {:?} span: {:?}" ,
556- location, lvalue_span. 0 , lvalue_span. 1 ) ;
557- self . check_if_path_is_moved ( context, lvalue_span, flow_state) ;
558- self . check_for_conflicting_loans ( context, location, bk, lvalue_span, flow_state) ;
559- }
560547}
561548
562549impl < ' c , ' b , ' a : ' b +' c , ' gcx , ' tcx : ' a > MirBorrowckCtxt < ' c , ' b , ' a , ' gcx , ' tcx > {
@@ -697,64 +684,7 @@ impl<'c, 'b, 'a: 'b+'c, 'gcx, 'tcx: 'a> MirBorrowckCtxt<'c, 'b, 'a, 'gcx, 'tcx>
697684 }
698685 }
699686 }
700-
701- #[ cfg( not_anymore) ]
702- fn check_for_conflicting_loans ( & mut self ,
703- context : Context ,
704- _location : Location ,
705- _bk : BorrowKind ,
706- lvalue_span : ( & Lvalue < ' gcx > , Span ) ,
707- flow_state : & InProgress < ' b , ' gcx > ) {
708- // NOTE FIXME: The analogous code in old borrowck
709- // check_loans.rs is careful to iterate over every *issued*
710- // loan, as opposed to just the in scope ones.
711- //
712- // (Or if you prefer, all the *other* iterations over loans
713- // only consider loans that are in scope of some given
714- // region::Scope)
715- //
716- // The (currently skeletal) code here does not encode such a
717- // distinction, which means it is almost certainly over
718- // looking something.
719- //
720- // (It is probably going to reject code that should be
721- // accepted, I suspect, by treated issued-but-out-of-scope
722- // loans as issued-and-in-scope, and thus causing them to
723- // interfere with other loans.)
724- //
725- // However, I just want to get something running, especially
726- // since I am trying to move into new territory with NLL, so
727- // lets get this going first, and then address the issued vs
728- // in-scope distinction later.
729-
730- let state = & flow_state. borrows ;
731- let data = & state. base_results . operator ( ) . borrows ( ) ;
732-
733- debug ! ( "check_for_conflicting_loans location: {:?}" , _location) ;
734-
735- // does any loan generated here conflict with a previously issued loan?
736- let mut loans_generated = 0 ;
737- for ( g, gen) in state. elems_generated ( ) . map ( |g| ( g, & data[ g] ) ) {
738- loans_generated += 1 ;
739- for ( i, issued) in state. elems_incoming ( ) . map ( |i| ( i, & data[ i] ) ) {
740- debug ! ( "check_for_conflicting_loans gen: {:?} issued: {:?} conflicts: {}" ,
741- ( g, gen , self . base_path( & gen . lvalue) ,
742- self . restrictions( & gen . lvalue) . collect:: <Vec <_>>( ) ) ,
743- ( i, issued, self . base_path( & issued. lvalue) ,
744- self . restrictions( & issued. lvalue) . collect:: <Vec <_>>( ) ) ,
745- self . conflicts_with( gen , issued) ) ;
746- if self . conflicts_with ( gen, issued) {
747- self . report_conflicting_borrow ( context, lvalue_span, gen, issued) ;
748- }
749- }
750- }
751-
752- // MIR statically ensures each statement gens *at most one*
753- // loan; mutual conflict (within a statement) can't arise.
754- //
755- // As safe-guard, assert that above property actually holds.
756- assert ! ( loans_generated <= 1 ) ;
757- } }
687+ }
758688
759689impl < ' c , ' b , ' a : ' b +' c , ' gcx , ' tcx : ' a > MirBorrowckCtxt < ' c , ' b , ' a , ' gcx , ' tcx > {
760690 fn each_borrow_involving_path < F > ( & mut self ,
@@ -954,194 +884,6 @@ mod prefixes {
954884 }
955885 }
956886 }
957- }
958-
959- #[ cfg( not_anymore) ]
960- mod restrictions {
961- use super :: MirBorrowckCtxt ;
962-
963- use rustc:: hir;
964- use rustc:: ty:: { self , TyCtxt } ;
965- use rustc:: mir:: { Lvalue , Mir , ProjectionElem } ;
966-
967- pub ( super ) struct Restrictions < ' c , ' tcx : ' c > {
968- mir : & ' c Mir < ' tcx > ,
969- tcx : TyCtxt < ' c , ' tcx , ' tcx > ,
970- lvalue_stack : Vec < & ' c Lvalue < ' tcx > > ,
971- }
972-
973- impl < ' c , ' b , ' a : ' b +' c , ' gcx , ' tcx : ' a > MirBorrowckCtxt < ' c , ' b , ' a , ' gcx , ' tcx > {
974- pub ( super ) fn restrictions < ' d > ( & self ,
975- lvalue : & ' d Lvalue < ' gcx > )
976- -> Restrictions < ' d , ' gcx > where ' b : ' d
977- {
978- let lvalue_stack = if self . has_restrictions ( lvalue) { vec ! [ lvalue] } else { vec ! [ ] } ;
979- Restrictions { lvalue_stack, mir : self . mir , tcx : self . tcx }
980- }
981-
982- fn has_restrictions ( & self , lvalue : & Lvalue < ' gcx > ) -> bool {
983- let mut cursor = lvalue;
984- loop {
985- let proj = match * cursor {
986- Lvalue :: Local ( _) => return true ,
987- Lvalue :: Static ( _) => return false ,
988- Lvalue :: Projection ( ref proj) => proj,
989- } ;
990- match proj. elem {
991- ProjectionElem :: Index ( ..) |
992- ProjectionElem :: ConstantIndex { .. } |
993- ProjectionElem :: Downcast ( ..) |
994- ProjectionElem :: Subslice { .. } |
995- ProjectionElem :: Field ( _/*field*/ , _/*ty*/ ) => {
996- cursor = & proj. base ;
997- continue ;
998- }
999- ProjectionElem :: Deref => {
1000- let ty = proj. base . ty ( self . mir , self . tcx ) . to_ty ( self . tcx ) ;
1001- match ty. sty {
1002- ty:: TyRawPtr ( _) => {
1003- return false ;
1004- }
1005- ty:: TyRef ( _, ty:: TypeAndMut { ty : _, mutbl : hir:: MutImmutable } ) => {
1006- // FIXME: do I need to check validity of
1007- // region here though? (I think the original
1008- // check_loans code did, like readme says)
1009- return false ;
1010- }
1011- ty:: TyRef ( _, ty:: TypeAndMut { ty : _, mutbl : hir:: MutMutable } ) => {
1012- cursor = & proj. base ;
1013- continue ;
1014- }
1015- ty:: TyAdt ( ..) if ty. is_box ( ) => {
1016- cursor = & proj. base ;
1017- continue ;
1018- }
1019- _ => {
1020- panic ! ( "unknown type fed to Projection Deref." ) ;
1021- }
1022- }
1023- }
1024- }
1025- }
1026- }
1027- }
1028-
1029- impl < ' c , ' tcx > Iterator for Restrictions < ' c , ' tcx > {
1030- type Item = & ' c Lvalue < ' tcx > ;
1031- fn next ( & mut self ) -> Option < Self :: Item > {
1032- ' pop: loop {
1033- let lvalue = match self . lvalue_stack . pop ( ) {
1034- None => return None ,
1035- Some ( lvalue) => lvalue,
1036- } ;
1037-
1038- // `lvalue` may not be a restriction itself, but may
1039- // hold one further down (e.g. we never return
1040- // downcasts here, but may return a base of a
1041- // downcast).
1042- //
1043- // Also, we need to enqueue any additional
1044- // subrestrictions that it implies, since we can only
1045- // return from from this call alone.
1046-
1047- let mut cursor = lvalue;
1048- ' cursor: loop {
1049- let proj = match * cursor {
1050- Lvalue :: Local ( _) => return Some ( cursor) , // search yielded this leaf
1051- Lvalue :: Static ( _) => continue ' pop, // fruitless leaf; try next on stack
1052- Lvalue :: Projection ( ref proj) => proj,
1053- } ;
1054-
1055- match proj. elem {
1056- ProjectionElem :: Field ( _/*field*/ , _/*ty*/ ) => {
1057- // FIXME: add union handling
1058- self . lvalue_stack . push ( & proj. base ) ;
1059- return Some ( cursor) ;
1060- }
1061- ProjectionElem :: Downcast ( ..) |
1062- ProjectionElem :: Subslice { .. } |
1063- ProjectionElem :: ConstantIndex { .. } |
1064- ProjectionElem :: Index ( _) => {
1065- cursor = & proj. base ;
1066- continue ' cursor;
1067- }
1068- ProjectionElem :: Deref => {
1069- // (handled below)
1070- }
1071- }
1072-
1073- assert_eq ! ( proj. elem, ProjectionElem :: Deref ) ;
1074-
1075- let ty = proj. base . ty ( self . mir , self . tcx ) . to_ty ( self . tcx ) ;
1076- match ty. sty {
1077- ty:: TyRawPtr ( _) => {
1078- // borrowck ignores raw ptrs; treat analogous to imm borrow
1079- continue ' pop;
1080- }
1081- // R-Deref-Imm-Borrowed
1082- ty:: TyRef ( _/*rgn*/ , ty:: TypeAndMut { ty : _, mutbl : hir:: MutImmutable } ) => {
1083- // immutably-borrowed referents do not
1084- // have recursively-implied restrictions
1085- // (because preventing actions on `*LV`
1086- // does nothing about aliases like `*LV1`)
1087-
1088- // FIXME: do I need to check validity of
1089- // `_r` here though? (I think the original
1090- // check_loans code did, like the readme
1091- // says)
1092-
1093- // (And do I *really* not have to
1094- // recursively process the `base` as a
1095- // further search here? Leaving this `if
1096- // false` here as a hint to look at this
1097- // again later.
1098- //
1099- // Ah, it might be because the
1100- // restrictions are distinct from the path
1101- // substructure. Note that there is a
1102- // separate loop over the path
1103- // substructure in fn
1104- // each_borrow_involving_path, for better
1105- // or for worse.
1106-
1107- if false {
1108- cursor = & proj. base ;
1109- continue ' cursor;
1110- } else {
1111- continue ' pop;
1112- }
1113- }
1114-
1115- // R-Deref-Mut-Borrowed
1116- ty:: TyRef ( _/*rgn*/ , ty:: TypeAndMut { ty : _, mutbl : hir:: MutMutable } ) => {
1117- // mutably-borrowed referents are
1118- // themselves restricted.
1119-
1120- // FIXME: do I need to check validity of
1121- // `_r` here though? (I think the original
1122- // check_loans code did, like the readme
1123- // says)
1124-
1125- // schedule base for future iteration.
1126- self . lvalue_stack . push ( & proj. base ) ;
1127- return Some ( cursor) ; // search yielded interior node
1128- }
1129-
1130- // R-Deref-Send-Pointer
1131- ty:: TyAdt ( ..) if ty. is_box ( ) => {
1132- // borrowing interior of a box implies that
1133- // its base can no longer be mutated (o/w box
1134- // storage would be freed)
1135- self . lvalue_stack . push ( & proj. base ) ;
1136- return Some ( cursor) ; // search yielded interior node
1137- }
1138-
1139- _ => panic ! ( "unknown type fed to Projection Deref." ) ,
1140- }
1141- }
1142- }
1143- }
1144- }
1145887}
1146888
1147889impl < ' c , ' b , ' a : ' b +' c , ' gcx , ' tcx : ' a > MirBorrowckCtxt < ' c , ' b , ' a , ' gcx , ' tcx > {
@@ -1319,26 +1061,6 @@ impl<'c, 'b, 'a: 'b+'c, 'gcx, 'tcx: 'a> MirBorrowckCtxt<'c, 'b, 'a, 'gcx, 'tcx>
13191061}
13201062
13211063impl < ' c , ' b , ' a : ' b +' c , ' gcx , ' tcx : ' a > MirBorrowckCtxt < ' c , ' b , ' a , ' gcx , ' tcx > {
1322- // FIXME: needs to be able to express errors analogous to check_loans.rs
1323- #[ cfg( not_anymore) ]
1324- fn conflicts_with ( & self , loan1 : & BorrowData < ' gcx > , loan2 : & BorrowData < ' gcx > ) -> bool {
1325- if loan1. compatible_with ( loan2. kind ) { return false ; }
1326-
1327- let loan2_base_path = self . base_path ( & loan2. lvalue ) ;
1328- for restricted in self . restrictions ( & loan1. lvalue ) {
1329- if restricted != loan2_base_path { continue ; }
1330- return true ;
1331- }
1332-
1333- let loan1_base_path = self . base_path ( & loan1. lvalue ) ;
1334- for restricted in self . restrictions ( & loan2. lvalue ) {
1335- if restricted != loan1_base_path { continue ; }
1336- return true ;
1337- }
1338-
1339- return false ;
1340- }
1341-
13421064 // FIXME (#16118): function intended to allow the borrow checker
13431065 // to be less precise in its handling of Box while still allowing
13441066 // moves out of a Box. They should be removed when/if we stop
@@ -1518,28 +1240,8 @@ impl<BD> FlowInProgress<BD> where BD: BitDenotation {
15181240 self . curr_state . subtract ( & self . stmt_kill ) ;
15191241 }
15201242
1521- #[ allow( dead_code) ]
1522- fn elems_generated ( & self ) -> indexed_set:: Elems < BD :: Idx > {
1523- let univ = self . base_results . sets ( ) . bits_per_block ( ) ;
1524- self . stmt_gen . elems ( univ)
1525- }
1526-
15271243 fn elems_incoming ( & self ) -> indexed_set:: Elems < BD :: Idx > {
15281244 let univ = self . base_results . sets ( ) . bits_per_block ( ) ;
15291245 self . curr_state . elems ( univ)
15301246 }
15311247}
1532-
1533- impl < ' tcx > BorrowData < ' tcx > {
1534- #[ allow( dead_code) ]
1535- fn compatible_with ( & self , bk : BorrowKind ) -> bool {
1536- match ( self . kind , bk) {
1537- ( BorrowKind :: Shared , BorrowKind :: Shared ) => true ,
1538-
1539- ( BorrowKind :: Mut , _) |
1540- ( BorrowKind :: Unique , _) |
1541- ( _, BorrowKind :: Mut ) |
1542- ( _, BorrowKind :: Unique ) => false ,
1543- }
1544- }
1545- }
0 commit comments