@@ -729,7 +729,14 @@ fn bind_subslice_pat(bcx: Block,
729
729
let ( base, len) = vec_datum. get_vec_base_and_len ( bcx) ;
730
730
731
731
let slice_begin = InBoundsGEP ( bcx, base, & [ C_uint ( bcx. ccx ( ) , offset_left) ] ) ;
732
- let slice_len_offset = C_uint ( bcx. ccx ( ) , offset_left + offset_right) ;
732
+ let diff = offset_left + offset_right;
733
+ if let ty:: TyArray ( ty, n) = vec_ty_contents. sty {
734
+ let array_ty = bcx. tcx ( ) . mk_array ( ty, n-diff) ;
735
+ let llty_array = type_of:: type_of ( bcx. ccx ( ) , array_ty) ;
736
+ return PointerCast ( bcx, slice_begin, llty_array. ptr_to ( ) ) ;
737
+ }
738
+
739
+ let slice_len_offset = C_uint ( bcx. ccx ( ) , diff) ;
733
740
let slice_len = Sub ( bcx, len, slice_len_offset, DebugLoc :: None ) ;
734
741
let slice_ty = bcx. tcx ( ) . mk_imm_ref ( bcx. tcx ( ) . mk_region ( ty:: ReErased ) ,
735
742
bcx. tcx ( ) . mk_slice ( unit_ty) ) ;
@@ -1205,7 +1212,12 @@ fn compile_submatch_continue<'a, 'p, 'blk, 'tcx>(mut bcx: Block<'blk, 'tcx>,
1205
1212
}
1206
1213
Some ( field_vals)
1207
1214
} else if any_uniq_pat ( m, col) || any_region_pat ( m, col) {
1208
- Some ( vec ! ( Load ( bcx, val. val) ) )
1215
+ let ptr = if type_is_fat_ptr ( bcx. tcx ( ) , left_ty) {
1216
+ val. val
1217
+ } else {
1218
+ Load ( bcx, val. val )
1219
+ } ;
1220
+ Some ( vec ! ( ptr) )
1209
1221
} else {
1210
1222
match left_ty. sty {
1211
1223
ty:: TyArray ( _, n) => {
0 commit comments