@@ -3209,10 +3209,23 @@ fn trans_index(@block_ctxt cx, &ast.span sp, @ast.expr base,
3209
3209
auto v = lv. val;
3210
3210
auto bcx = ix. bcx;
3211
3211
3212
+ // Cast to an LLVM integer. Rust is less strict than LLVM in this regard.
3213
+ auto ix_val;
3214
+ auto ix_size = llsize_of_real( cx. fcx. ccx, val_ty( ix. val) ) ;
3215
+ auto int_size = llsize_of_real( cx. fcx. ccx, T_int ( ) ) ;
3216
+ if ( ix_size < int_size) {
3217
+ ix_val = bcx. build. ZExt ( ix. val, T_int( ) ) ;
3218
+ } else if ( ix_size > int_size) {
3219
+ ix_val = bcx. build. Trunc ( ix. val, T_int ( ) ) ;
3220
+ } else {
3221
+ ix_val = ix. val;
3222
+ }
3223
+
3212
3224
auto llunit_ty = node_type( cx. fcx. ccx, ann) ;
3213
3225
auto unit_sz = size_of( bcx, node_ann_type( cx. fcx. ccx, ann) ) ;
3214
3226
bcx = unit_sz. bcx;
3215
- auto scaled_ix = bcx. build. Mul ( ix. val, unit_sz. val) ;
3227
+
3228
+ auto scaled_ix = bcx. build. Mul ( ix_val, unit_sz. val) ;
3216
3229
3217
3230
auto lim = bcx. build. GEP ( v, vec( C_int ( 0 ) , C_int ( abi. vec_elt_fill) ) ) ;
3218
3231
lim = bcx. build. Load ( lim) ;
@@ -3229,7 +3242,7 @@ fn trans_index(@block_ctxt cx, &ast.span sp, @ast.expr base,
3229
3242
fail_res. bcx. build. Br ( next_cx. llbb) ;
3230
3243
3231
3244
auto body = next_cx. build. GEP ( v, vec( C_int ( 0 ) , C_int ( abi. vec_elt_data) ) ) ;
3232
- auto elt = next_cx. build. GEP ( body, vec( C_int( 0 ) , ix . val ) ) ;
3245
+ auto elt = next_cx. build. GEP ( body, vec( C_int ( 0 ) , ix_val ) ) ;
3233
3246
ret lval_mem( next_cx, elt) ;
3234
3247
}
3235
3248
0 commit comments