@@ -144,10 +144,9 @@ use middle::trans::tvec;
144
144
use middle:: trans:: type_of;
145
145
use middle:: ty:: struct_fields;
146
146
use middle:: ty:: { AutoDerefRef , AutoAddEnv } ;
147
- use middle:: ty:: { AutoPtr , AutoBorrowVec , AutoBorrowVecRef , AutoBorrowFn } ;
148
- use middle:: ty;
149
147
use middle:: ty:: { AutoPtr , AutoBorrowVec , AutoBorrowVecRef , AutoBorrowFn ,
150
148
AutoDerefRef , AutoAddEnv , AutoUnsafe } ;
149
+ use middle:: ty;
151
150
use util:: common:: indenter;
152
151
use util:: ppaux:: Repr ;
153
152
@@ -215,10 +214,12 @@ pub fn trans_to_datum(bcx: block, expr: @ast::expr) -> DatumBlock {
215
214
unpack_datum ! ( bcx, auto_ref( bcx, datum) )
216
215
}
217
216
Some ( AutoBorrowVec ( * ) ) => {
218
- unpack_datum ! ( bcx, auto_slice( bcx, expr, datum) )
217
+ unpack_datum ! ( bcx, auto_slice( bcx, adj. autoderefs,
218
+ expr, datum) )
219
219
}
220
220
Some ( AutoBorrowVecRef ( * ) ) => {
221
- unpack_datum ! ( bcx, auto_slice_and_ref( bcx, expr, datum) )
221
+ unpack_datum ! ( bcx, auto_slice_and_ref( bcx, adj. autoderefs,
222
+ expr, datum) )
222
223
}
223
224
Some ( AutoBorrowFn ( * ) ) => {
224
225
let adjusted_ty = ty:: adjust_ty ( bcx. tcx ( ) , expr. span ,
@@ -246,7 +247,10 @@ pub fn trans_to_datum(bcx: block, expr: @ast::expr) -> DatumBlock {
246
247
mode : datum. mode , source : datum. source } }
247
248
}
248
249
249
- fn auto_slice ( bcx : block , expr : @ast:: expr , datum : Datum ) -> DatumBlock {
250
+ fn auto_slice ( bcx : block ,
251
+ autoderefs : uint ,
252
+ expr : @ast:: expr ,
253
+ datum : Datum ) -> DatumBlock {
250
254
// This is not the most efficient thing possible; since slices
251
255
// are two words it'd be better if this were compiled in
252
256
// 'dest' mode, but I can't find a nice way to structure the
@@ -256,9 +260,8 @@ pub fn trans_to_datum(bcx: block, expr: @ast::expr) -> DatumBlock {
256
260
let tcx = bcx. tcx ( ) ;
257
261
let unit_ty = ty:: sequence_element_type ( tcx, datum. ty ) ;
258
262
259
- // FIXME(#6272) need to distinguish "auto-slice" from explicit index?
260
263
let ( bcx, base, len) =
261
- datum. get_vec_base_and_len ( bcx, expr. span , expr. id ) ;
264
+ datum. get_vec_base_and_len ( bcx, expr. span , expr. id , autoderefs+ 1 ) ;
262
265
263
266
// this type may have a different region/mutability than the
264
267
// real one, but it will have the same runtime representation
@@ -292,9 +295,10 @@ pub fn trans_to_datum(bcx: block, expr: @ast::expr) -> DatumBlock {
292
295
}
293
296
294
297
fn auto_slice_and_ref ( bcx : block ,
298
+ autoderefs : uint ,
295
299
expr : @ast:: expr ,
296
300
datum : Datum ) -> DatumBlock {
297
- let DatumBlock { bcx, datum } = auto_slice ( bcx, expr, datum) ;
301
+ let DatumBlock { bcx, datum } = auto_slice ( bcx, autoderefs , expr, datum) ;
298
302
auto_ref ( bcx, datum)
299
303
}
300
304
}
@@ -913,7 +917,8 @@ fn trans_lvalue_unadjusted(bcx: block, expr: @ast::expr) -> DatumBlock {
913
917
base:: maybe_name_value ( bcx. ccx ( ) , scaled_ix, ~"scaled_ix") ;
914
918
915
919
let mut ( bcx, base, len) =
916
- base_datum. get_vec_base_and_len ( bcx, index_expr. span , index_expr. id ) ;
920
+ base_datum. get_vec_base_and_len ( bcx, index_expr. span ,
921
+ index_expr. id , 0 ) ;
917
922
918
923
if ty:: type_is_str ( base_ty) {
919
924
// acccount for null terminator in the case of string
0 commit comments