diff options
| author | Michael Sullivan <sully@msully.net> | 2012-05-30 17:09:52 -0700 |
|---|---|---|
| committer | Michael Sullivan <sully@msully.net> | 2012-05-30 17:09:52 -0700 |
| commit | ea8d4d7f1719a53c066713e6893b33556b69dbfe (patch) | |
| tree | 8807c88148152102c8fe27a8766832249d159d98 /src/rustc | |
| parent | 1eebb1fe871addca6c7dcdfb43d0b8693e08b783 (diff) | |
| download | rust-ea8d4d7f1719a53c066713e6893b33556b69dbfe.tar.gz rust-ea8d4d7f1719a53c066713e6893b33556b69dbfe.zip | |
Properly sign extend array indexes. Closes #2468.
Diffstat (limited to 'src/rustc')
| -rw-r--r-- | src/rustc/middle/trans/base.rs | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/src/rustc/middle/trans/base.rs b/src/rustc/middle/trans/base.rs index 62153f9383d..1dee76c61ed 100644 --- a/src/rustc/middle/trans/base.rs +++ b/src/rustc/middle/trans/base.rs @@ -2521,7 +2521,9 @@ fn trans_index(cx: block, ex: @ast::expr, base: @ast::expr, let ix_size = llsize_of_real(cx.ccx(), val_ty(ix.val)); let int_size = llsize_of_real(cx.ccx(), ccx.int_type); let ix_val = if ix_size < int_size { - ZExt(bcx, ix.val, ccx.int_type) + if ty::type_is_signed(expr_ty(cx, idx)) { + SExt(bcx, ix.val, ccx.int_type) + } else { ZExt(bcx, ix.val, ccx.int_type) } } else if ix_size > int_size { Trunc(bcx, ix.val, ccx.int_type) } else { |
