@@ -95,35 +95,37 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
9595
9696impl < ' pat , ' tcx > MatchPair < ' pat , ' tcx > {
9797 pub ( in crate :: build) fn new (
98- mut place : PlaceBuilder < ' tcx > ,
98+ mut place_builder : PlaceBuilder < ' tcx > ,
9999 pattern : & ' pat Pat < ' tcx > ,
100100 cx : & mut Builder < ' _ , ' tcx > ,
101101 ) -> MatchPair < ' pat , ' tcx > {
102102 // Force the place type to the pattern's type.
103103 // FIXME(oli-obk): can we use this to simplify slice/array pattern hacks?
104- if let Some ( resolved) = place . resolve_upvar ( cx) {
105- place = resolved;
104+ if let Some ( resolved) = place_builder . resolve_upvar ( cx) {
105+ place_builder = resolved;
106106 }
107107
108108 // Only add the OpaqueCast projection if the given place is an opaque type and the
109109 // expected type from the pattern is not.
110- let may_need_cast = match place . base ( ) {
110+ let may_need_cast = match place_builder . base ( ) {
111111 PlaceBase :: Local ( local) => {
112- let ty = Place :: ty_from ( local, place. projection ( ) , & cx. local_decls , cx. tcx ) . ty ;
112+ let ty =
113+ Place :: ty_from ( local, place_builder. projection ( ) , & cx. local_decls , cx. tcx ) . ty ;
113114 ty != pattern. ty && ty. has_opaque_types ( )
114115 }
115116 _ => true ,
116117 } ;
117118 if may_need_cast {
118- place = place . project ( ProjectionElem :: OpaqueCast ( pattern. ty ) ) ;
119+ place_builder = place_builder . project ( ProjectionElem :: OpaqueCast ( pattern. ty ) ) ;
119120 }
120121
122+ let place = place_builder. try_to_place ( cx) ;
121123 let default_irrefutable = || TestCase :: Irrefutable { binding : None , ascription : None } ;
122124 let mut subpairs = Vec :: new ( ) ;
123125 let test_case = match pattern. kind {
124126 PatKind :: Never | PatKind :: Wild | PatKind :: Error ( _) => default_irrefutable ( ) ,
125127 PatKind :: Or { ref pats } => TestCase :: Or {
126- pats : pats. iter ( ) . map ( |pat| FlatPat :: new ( place . clone ( ) , pat, cx) ) . collect ( ) ,
128+ pats : pats. iter ( ) . map ( |pat| FlatPat :: new ( place_builder . clone ( ) , pat, cx) ) . collect ( ) ,
127129 } ,
128130
129131 PatKind :: Range ( ref range) => {
@@ -142,13 +144,13 @@ impl<'pat, 'tcx> MatchPair<'pat, 'tcx> {
142144 ..
143145 } => {
144146 // Apply the type ascription to the value at `match_pair.place`
145- let ascription = place. try_to_place ( cx ) . map ( |source| super :: Ascription {
147+ let ascription = place. map ( |source| super :: Ascription {
146148 annotation : annotation. clone ( ) ,
147149 source,
148150 variance,
149151 } ) ;
150152
151- subpairs. push ( MatchPair :: new ( place . clone ( ) , subpattern, cx) ) ;
153+ subpairs. push ( MatchPair :: new ( place_builder , subpattern, cx) ) ;
152154 TestCase :: Irrefutable { ascription, binding : None }
153155 }
154156
@@ -161,7 +163,7 @@ impl<'pat, 'tcx> MatchPair<'pat, 'tcx> {
161163 ref subpattern,
162164 is_primary : _,
163165 } => {
164- let binding = place. try_to_place ( cx ) . map ( |source| super :: Binding {
166+ let binding = place. map ( |source| super :: Binding {
165167 span : pattern. span ,
166168 source,
167169 var_id : var,
@@ -170,14 +172,14 @@ impl<'pat, 'tcx> MatchPair<'pat, 'tcx> {
170172
171173 if let Some ( subpattern) = subpattern. as_ref ( ) {
172174 // this is the `x @ P` case; have to keep matching against `P` now
173- subpairs. push ( MatchPair :: new ( place . clone ( ) , subpattern, cx) ) ;
175+ subpairs. push ( MatchPair :: new ( place_builder , subpattern, cx) ) ;
174176 }
175177 TestCase :: Irrefutable { ascription : None , binding }
176178 }
177179
178180 PatKind :: InlineConstant { subpattern : ref pattern, def, .. } => {
179181 // Apply a type ascription for the inline constant to the value at `match_pair.place`
180- let ascription = place. try_to_place ( cx ) . map ( |source| {
182+ let ascription = place. map ( |source| {
181183 let span = pattern. span ;
182184 let parent_id = cx. tcx . typeck_root_def_id ( cx. def_id . to_def_id ( ) ) ;
183185 let args = ty:: InlineConstArgs :: new (
@@ -203,16 +205,16 @@ impl<'pat, 'tcx> MatchPair<'pat, 'tcx> {
203205 super :: Ascription { annotation, source, variance : ty:: Contravariant }
204206 } ) ;
205207
206- subpairs. push ( MatchPair :: new ( place . clone ( ) , pattern, cx) ) ;
208+ subpairs. push ( MatchPair :: new ( place_builder , pattern, cx) ) ;
207209 TestCase :: Irrefutable { ascription, binding : None }
208210 }
209211
210212 PatKind :: Array { ref prefix, ref slice, ref suffix } => {
211- cx. prefix_slice_suffix ( & mut subpairs, & place , prefix, slice, suffix) ;
213+ cx. prefix_slice_suffix ( & mut subpairs, & place_builder , prefix, slice, suffix) ;
212214 default_irrefutable ( )
213215 }
214216 PatKind :: Slice { ref prefix, ref slice, ref suffix } => {
215- cx. prefix_slice_suffix ( & mut subpairs, & place , prefix, slice, suffix) ;
217+ cx. prefix_slice_suffix ( & mut subpairs, & place_builder , prefix, slice, suffix) ;
216218
217219 if prefix. is_empty ( ) && slice. is_some ( ) && suffix. is_empty ( ) {
218220 default_irrefutable ( )
@@ -225,7 +227,7 @@ impl<'pat, 'tcx> MatchPair<'pat, 'tcx> {
225227 }
226228
227229 PatKind :: Variant { adt_def, variant_index, args, ref subpatterns } => {
228- let downcast_place = place . clone ( ) . downcast ( adt_def, variant_index) ; // `(x as Variant)`
230+ let downcast_place = place_builder . downcast ( adt_def, variant_index) ; // `(x as Variant)`
229231 subpairs = cx. field_match_pairs ( downcast_place, subpatterns) ;
230232
231233 let irrefutable = adt_def. variants ( ) . iter_enumerated ( ) . all ( |( i, v) | {
@@ -247,13 +249,12 @@ impl<'pat, 'tcx> MatchPair<'pat, 'tcx> {
247249 }
248250
249251 PatKind :: Leaf { ref subpatterns } => {
250- subpairs = cx. field_match_pairs ( place . clone ( ) , subpatterns) ;
252+ subpairs = cx. field_match_pairs ( place_builder , subpatterns) ;
251253 default_irrefutable ( )
252254 }
253255
254256 PatKind :: Deref { ref subpattern } => {
255- let place_builder = place. clone ( ) . deref ( ) ;
256- subpairs. push ( MatchPair :: new ( place_builder, subpattern, cx) ) ;
257+ subpairs. push ( MatchPair :: new ( place_builder. deref ( ) , subpattern, cx) ) ;
257258 default_irrefutable ( )
258259 }
259260
@@ -310,8 +311,8 @@ impl<'a, 'b, 'tcx> FakeBorrowCollector<'a, 'b, 'tcx> {
310311 }
311312 } else {
312313 // Insert a Shallow borrow of any place that is switched on.
313- if let Some ( resolved_place ) = match_pair. place . try_to_place ( self . cx ) {
314- self . fake_borrows . insert ( resolved_place ) ;
314+ if let Some ( place ) = match_pair. place {
315+ self . fake_borrows . insert ( place ) ;
315316 }
316317
317318 for subpair in & match_pair. subpairs {
0 commit comments