@@ -1942,7 +1942,7 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
1942
1942
BorrowKind :: Mut { .. } => is_local_mutation_allowed,
1943
1943
BorrowKind :: Shared | BorrowKind :: Shallow => unreachable ! ( ) ,
1944
1944
} ;
1945
- match self . is_mutable ( & place. base , & place . projection , is_local_mutation_allowed) {
1945
+ match self . is_mutable ( place. as_ref ( ) , is_local_mutation_allowed) {
1946
1946
Ok ( root_place) => {
1947
1947
self . add_used_mut ( root_place, flow_state) ;
1948
1948
return false ;
@@ -1954,7 +1954,7 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
1954
1954
}
1955
1955
}
1956
1956
Reservation ( WriteKind :: Mutate ) | Write ( WriteKind :: Mutate ) => {
1957
- match self . is_mutable ( & place. base , & place . projection , is_local_mutation_allowed) {
1957
+ match self . is_mutable ( place. as_ref ( ) , is_local_mutation_allowed) {
1958
1958
Ok ( root_place) => {
1959
1959
self . add_used_mut ( root_place, flow_state) ;
1960
1960
return false ;
@@ -1974,8 +1974,8 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
1974
1974
| Write ( wk @ WriteKind :: StorageDeadOrDrop )
1975
1975
| Write ( wk @ WriteKind :: MutableBorrow ( BorrowKind :: Shared ) )
1976
1976
| Write ( wk @ WriteKind :: MutableBorrow ( BorrowKind :: Shallow ) ) => {
1977
- if let ( Err ( _place_err ) , true ) = (
1978
- self . is_mutable ( & place. base , & place . projection , is_local_mutation_allowed) ,
1977
+ if let ( Err ( place_err ) , true ) = (
1978
+ self . is_mutable ( place. as_ref ( ) , is_local_mutation_allowed) ,
1979
1979
self . errors_buffer . is_empty ( )
1980
1980
) {
1981
1981
if self . infcx . tcx . migrate_borrowck ( ) {
@@ -1996,10 +1996,7 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
1996
1996
self . report_mutability_error (
1997
1997
place,
1998
1998
span,
1999
- PlaceRef {
2000
- base : _place_err. 0 ,
2001
- projection : _place_err. 1 ,
2002
- } ,
1999
+ place_err,
2003
2000
error_access,
2004
2001
location,
2005
2002
) ;
@@ -2033,10 +2030,7 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
2033
2030
self . report_mutability_error (
2034
2031
place,
2035
2032
span,
2036
- PlaceRef {
2037
- base : the_place_err. 0 ,
2038
- projection : the_place_err. 1 ,
2039
- } ,
2033
+ the_place_err,
2040
2034
error_access,
2041
2035
location,
2042
2036
) ;
@@ -2107,78 +2101,86 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
2107
2101
/// Returns the root place if the place passed in is a projection.
2108
2102
fn is_mutable < ' d > (
2109
2103
& self ,
2110
- place_base : & ' d PlaceBase < ' tcx > ,
2111
- place_projection : & ' d Option < Box < Projection < ' tcx > > > ,
2104
+ place : PlaceRef < ' d , ' tcx > ,
2112
2105
is_local_mutation_allowed : LocalMutationIsAllowed ,
2113
- ) -> Result < RootPlace < ' d , ' tcx > , ( & ' d PlaceBase < ' tcx > , & ' d Option < Box < Projection < ' tcx > > > ) > {
2114
- match ( place_base, place_projection) {
2115
- ( PlaceBase :: Local ( local) , None ) => {
2106
+ ) -> Result < RootPlace < ' d , ' tcx > , PlaceRef < ' d , ' tcx > > {
2107
+ match place {
2108
+ PlaceRef {
2109
+ base : PlaceBase :: Local ( local) ,
2110
+ projection : None ,
2111
+ } => {
2116
2112
let local = & self . body . local_decls [ * local] ;
2117
2113
match local. mutability {
2118
2114
Mutability :: Not => match is_local_mutation_allowed {
2119
2115
LocalMutationIsAllowed :: Yes => Ok ( RootPlace {
2120
- place_base,
2121
- place_projection,
2116
+ place_base : place . base ,
2117
+ place_projection : place . projection ,
2122
2118
is_local_mutation_allowed : LocalMutationIsAllowed :: Yes ,
2123
2119
} ) ,
2124
2120
LocalMutationIsAllowed :: ExceptUpvars => Ok ( RootPlace {
2125
- place_base,
2126
- place_projection,
2121
+ place_base : place . base ,
2122
+ place_projection : place . projection ,
2127
2123
is_local_mutation_allowed : LocalMutationIsAllowed :: ExceptUpvars ,
2128
2124
} ) ,
2129
- LocalMutationIsAllowed :: No => Err ( ( place_base , place_projection ) ) ,
2125
+ LocalMutationIsAllowed :: No => Err ( place ) ,
2130
2126
} ,
2131
2127
Mutability :: Mut => Ok ( RootPlace {
2132
- place_base,
2133
- place_projection,
2128
+ place_base : place . base ,
2129
+ place_projection : place . projection ,
2134
2130
is_local_mutation_allowed,
2135
2131
} ) ,
2136
2132
}
2137
2133
}
2138
2134
// The rules for promotion are made by `qualify_consts`, there wouldn't even be a
2139
2135
// `Place::Promoted` if the promotion weren't 100% legal. So we just forward this
2140
- ( PlaceBase :: Static ( box Static {
2141
- kind : StaticKind :: Promoted ( _) ,
2142
- ..
2143
- } ) , None ) =>
2136
+ PlaceRef {
2137
+ base : PlaceBase :: Static ( box Static {
2138
+ kind : StaticKind :: Promoted ( _) ,
2139
+ ..
2140
+ } ) ,
2141
+ projection : None ,
2142
+ } =>
2144
2143
Ok ( RootPlace {
2145
- place_base,
2146
- place_projection,
2144
+ place_base : place . base ,
2145
+ place_projection : place . projection ,
2147
2146
is_local_mutation_allowed,
2148
2147
} ) ,
2149
- ( PlaceBase :: Static ( box Static {
2150
- kind : StaticKind :: Static ( def_id) ,
2151
- ..
2152
- } ) , None ) => {
2148
+ PlaceRef {
2149
+ base : PlaceBase :: Static ( box Static {
2150
+ kind : StaticKind :: Static ( def_id) ,
2151
+ ..
2152
+ } ) ,
2153
+ projection : None ,
2154
+ } => {
2153
2155
if !self . infcx . tcx . is_mutable_static ( * def_id) {
2154
- Err ( ( place_base , place_projection ) )
2156
+ Err ( place )
2155
2157
} else {
2156
2158
Ok ( RootPlace {
2157
- place_base,
2158
- place_projection,
2159
+ place_base : place . base ,
2160
+ place_projection : place . projection ,
2159
2161
is_local_mutation_allowed,
2160
2162
} )
2161
2163
}
2162
2164
}
2163
- ( _, Some ( ref proj) ) => {
2165
+ PlaceRef {
2166
+ base : _,
2167
+ projection : Some ( proj) ,
2168
+ } => {
2164
2169
match proj. elem {
2165
2170
ProjectionElem :: Deref => {
2166
2171
let base_ty =
2167
- Place :: ty_from ( place_base , & proj. base , self . body , self . infcx . tcx ) . ty ;
2172
+ Place :: ty_from ( place . base , & proj. base , self . body , self . infcx . tcx ) . ty ;
2168
2173
2169
2174
// Check the kind of deref to decide
2170
2175
match base_ty. sty {
2171
2176
ty:: Ref ( _, _, mutbl) => {
2172
2177
match mutbl {
2173
2178
// Shared borrowed data is never mutable
2174
- hir:: MutImmutable => Err ( ( place_base , place_projection ) ) ,
2179
+ hir:: MutImmutable => Err ( place ) ,
2175
2180
// Mutably borrowed data is mutable, but only if we have a
2176
2181
// unique path to the `&mut`
2177
2182
hir:: MutMutable => {
2178
- let mode = match self . is_upvar_field_projection ( PlaceRef {
2179
- base : & place_base,
2180
- projection : & place_projection,
2181
- } ) {
2183
+ let mode = match self . is_upvar_field_projection ( place) {
2182
2184
Some ( field)
2183
2185
if self . upvars [ field. index ( ) ] . by_ref =>
2184
2186
{
@@ -2187,28 +2189,34 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
2187
2189
_ => LocalMutationIsAllowed :: Yes ,
2188
2190
} ;
2189
2191
2190
- self . is_mutable ( place_base, & proj. base , mode)
2192
+ self . is_mutable ( PlaceRef {
2193
+ base : place. base ,
2194
+ projection : & proj. base ,
2195
+ } , mode)
2191
2196
}
2192
2197
}
2193
2198
}
2194
2199
ty:: RawPtr ( tnm) => {
2195
2200
match tnm. mutbl {
2196
2201
// `*const` raw pointers are not mutable
2197
- hir:: MutImmutable => Err ( ( place_base , place_projection ) ) ,
2202
+ hir:: MutImmutable => Err ( place ) ,
2198
2203
// `*mut` raw pointers are always mutable, regardless of
2199
2204
// context. The users have to check by themselves.
2200
2205
hir:: MutMutable => {
2201
2206
Ok ( RootPlace {
2202
- place_base,
2203
- place_projection,
2207
+ place_base : place . base ,
2208
+ place_projection : place . projection ,
2204
2209
is_local_mutation_allowed,
2205
2210
} )
2206
2211
}
2207
2212
}
2208
2213
}
2209
2214
// `Box<T>` owns its content, so mutable if its location is mutable
2210
2215
_ if base_ty. is_box ( ) => {
2211
- self . is_mutable ( place_base, & proj. base , is_local_mutation_allowed)
2216
+ self . is_mutable ( PlaceRef {
2217
+ base : place. base ,
2218
+ projection : & proj. base ,
2219
+ } , is_local_mutation_allowed)
2212
2220
}
2213
2221
// Deref should only be for reference, pointers or boxes
2214
2222
_ => bug ! ( "Deref of unexpected type: {:?}" , base_ty) ,
@@ -2221,21 +2229,18 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
2221
2229
| ProjectionElem :: ConstantIndex { .. }
2222
2230
| ProjectionElem :: Subslice { .. }
2223
2231
| ProjectionElem :: Downcast ( ..) => {
2224
- let upvar_field_projection = self . is_upvar_field_projection ( PlaceRef {
2225
- base : & place_base,
2226
- projection : & place_projection,
2227
- } ) ;
2232
+ let upvar_field_projection = self . is_upvar_field_projection ( place) ;
2228
2233
if let Some ( field) = upvar_field_projection {
2229
2234
let upvar = & self . upvars [ field. index ( ) ] ;
2230
2235
debug ! (
2231
2236
"upvar.mutability={:?} local_mutation_is_allowed={:?} \
2232
- place={:?} {:?} ",
2233
- upvar, is_local_mutation_allowed, place_base , place_projection
2237
+ place={:?}",
2238
+ upvar, is_local_mutation_allowed, place
2234
2239
) ;
2235
2240
match ( upvar. mutability , is_local_mutation_allowed) {
2236
2241
( Mutability :: Not , LocalMutationIsAllowed :: No )
2237
2242
| ( Mutability :: Not , LocalMutationIsAllowed :: ExceptUpvars ) => {
2238
- Err ( ( place_base , place_projection ) )
2243
+ Err ( place )
2239
2244
}
2240
2245
( Mutability :: Not , LocalMutationIsAllowed :: Yes )
2241
2246
| ( Mutability :: Mut , _) => {
@@ -2265,18 +2270,22 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
2265
2270
// });
2266
2271
// }
2267
2272
// ```
2268
- let _ = self . is_mutable ( place_base,
2269
- & proj. base ,
2270
- is_local_mutation_allowed) ?;
2273
+ let _ = self . is_mutable ( PlaceRef {
2274
+ base : place. base ,
2275
+ projection : & proj. base ,
2276
+ } , is_local_mutation_allowed) ?;
2271
2277
Ok ( RootPlace {
2272
- place_base,
2273
- place_projection,
2278
+ place_base : place . base ,
2279
+ place_projection : place . projection ,
2274
2280
is_local_mutation_allowed,
2275
2281
} )
2276
2282
}
2277
2283
}
2278
2284
} else {
2279
- self . is_mutable ( place_base, & proj. base , is_local_mutation_allowed)
2285
+ self . is_mutable ( PlaceRef {
2286
+ base : place. base ,
2287
+ projection : & proj. base ,
2288
+ } , is_local_mutation_allowed)
2280
2289
}
2281
2290
}
2282
2291
}
0 commit comments