about summary refs log tree commit diff
path: root/src/rustc
diff options
context:
space:
mode:
authorMichael Sullivan <sully@msully.net>2012-05-30 17:09:52 -0700
committerMichael Sullivan <sully@msully.net>2012-05-30 17:09:52 -0700
commitea8d4d7f1719a53c066713e6893b33556b69dbfe (patch)
tree8807c88148152102c8fe27a8766832249d159d98 /src/rustc
parent1eebb1fe871addca6c7dcdfb43d0b8693e08b783 (diff)
downloadrust-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.rs4
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 {