about summary refs log tree commit diff
path: root/src/rustc
diff options
context:
space:
mode:
authorMichael Sullivan <sully@msully.net>2012-05-22 14:59:15 -0700
committerMichael Sullivan <sully@msully.net>2012-05-22 14:59:15 -0700
commit15cef374b9a16a0f8b40665dbafdf725e9456ffd (patch)
tree8d817652bb982c05294fb01ff8a80a1ab0689316 /src/rustc
parent8d7f3bd1ca622e6ddc03f4592eb8a451fbf850ab (diff)
downloadrust-15cef374b9a16a0f8b40665dbafdf725e9456ffd.tar.gz
rust-15cef374b9a16a0f8b40665dbafdf725e9456ffd.zip
Get rid of the >>> operator and make >> logical or arithmetic depending on the signedness. Closes #2417.
Diffstat (limited to 'src/rustc')
-rw-r--r--src/rustc/middle/const_eval.rs7
-rw-r--r--src/rustc/middle/trans/base.rs17
-rw-r--r--src/rustc/middle/ty.rs5
-rw-r--r--src/rustc/middle/typeck/check.rs4
4 files changed, 17 insertions, 16 deletions
diff --git a/src/rustc/middle/const_eval.rs b/src/rustc/middle/const_eval.rs
index ca066b127bc..99f058788b2 100644
--- a/src/rustc/middle/const_eval.rs
+++ b/src/rustc/middle/const_eval.rs
@@ -44,8 +44,7 @@ fn eval_const_expr(tcx: middle::ty::ctxt, e: @expr) -> const_val {
               mul { const_int(a * b) } div { const_int(a / b) }
               rem { const_int(a % b) } and | bitand { const_int(a & b) }
               or | bitor { const_int(a | b) } bitxor { const_int(a ^ b) }
-              lsl { const_int(a << b) } lsr { const_int(a >> b) }
-              asr { const_int(a >>> b) }
+              shl { const_int(a << b) } shr { const_int(a >> b) }
               eq { fromb(a == b) } lt { fromb(a < b) }
               le { fromb(a <= b) } ne { fromb(a != b) }
               ge { fromb(a >= b) } gt { fromb(a > b) }
@@ -58,9 +57,7 @@ fn eval_const_expr(tcx: middle::ty::ctxt, e: @expr) -> const_val {
               mul { const_uint(a * b) } div { const_uint(a / b) }
               rem { const_uint(a % b) } and | bitand { const_uint(a & b) }
               or | bitor { const_uint(a | b) } bitxor { const_uint(a ^ b) }
-              lsl { const_int((a << b) as i64) }
-              lsr { const_int((a >> b) as i64) }
-              asr { const_int((a >>> b) as i64) }
+              shl { const_uint(a << b) } shr { const_uint(a >> b) }
               eq { fromb(a == b) } lt { fromb(a < b) }
               le { fromb(a <= b) } ne { fromb(a != b) }
               ge { fromb(a >= b) } gt { fromb(a > b) }
diff --git a/src/rustc/middle/trans/base.rs b/src/rustc/middle/trans/base.rs
index f6da35f902c..038354da683 100644
--- a/src/rustc/middle/trans/base.rs
+++ b/src/rustc/middle/trans/base.rs
@@ -1617,9 +1617,12 @@ fn trans_eager_binop(cx: block, op: ast::binop, lhs: ValueRef,
       ast::bitor { Or(cx, lhs, rhs) }
       ast::bitand { And(cx, lhs, rhs) }
       ast::bitxor { Xor(cx, lhs, rhs) }
-      ast::lsl { Shl(cx, lhs, rhs) }
-      ast::lsr { LShr(cx, lhs, rhs) }
-      ast::asr { AShr(cx, lhs, rhs) }
+      ast::shl { Shl(cx, lhs, rhs) }
+      ast::shr {
+        if ty::type_is_signed(intype) {
+            AShr(cx, lhs, rhs)
+        } else { LShr(cx, lhs, rhs) }
+      }
       _ {
         let cmpr = trans_compare(cx, op, lhs, lhs_t, rhs, rhs_t);
         cx = cmpr.bcx;
@@ -4565,9 +4568,11 @@ fn trans_const_expr(cx: @crate_ctxt, e: @ast::expr) -> ValueRef {
           ast::bitxor { llvm::LLVMConstXor(te1, te2) }
           ast::bitand { llvm::LLVMConstAnd(te1, te2) }
           ast::bitor  { llvm::LLVMConstOr(te1, te2) }
-          ast::lsl    { llvm::LLVMConstShl(te1, te2) }
-          ast::lsr    { llvm::LLVMConstLShr(te1, te2) }
-          ast::asr    { llvm::LLVMConstAShr(te1, te2) }
+          ast::shl    { llvm::LLVMConstShl(te1, te2) }
+          ast::shr    {
+            if signed { llvm::LLVMConstAShr(te1, te2) }
+            else      { llvm::LLVMConstLShr(te1, te2) }
+          }
           ast::eq     |
           ast::lt     |
           ast::le     |
diff --git a/src/rustc/middle/ty.rs b/src/rustc/middle/ty.rs
index 6d0362882fe..ea2154e4f78 100644
--- a/src/rustc/middle/ty.rs
+++ b/src/rustc/middle/ty.rs
@@ -2704,9 +2704,8 @@ fn is_binopable(_cx: ctxt, ty: t, op: ast::binop) -> bool {
           ast::bitxor { opcat_bit }
           ast::bitand { opcat_bit }
           ast::bitor { opcat_bit }
-          ast::lsl { opcat_shift }
-          ast::lsr { opcat_shift }
-          ast::asr { opcat_shift }
+          ast::shl { opcat_shift }
+          ast::shr { opcat_shift }
           ast::eq { opcat_eq }
           ast::ne { opcat_eq }
           ast::lt { opcat_rel }
diff --git a/src/rustc/middle/typeck/check.rs b/src/rustc/middle/typeck/check.rs
index deb2ecd5c15..f3c10547708 100644
--- a/src/rustc/middle/typeck/check.rs
+++ b/src/rustc/middle/typeck/check.rs
@@ -867,8 +867,8 @@ fn check_expr_with_unifier(fcx: @fn_ctxt,
     fn binop_method(op: ast::binop) -> option<str> {
         alt op {
           ast::add | ast::subtract | ast::mul | ast::div | ast::rem |
-          ast::bitxor | ast::bitand | ast::bitor | ast::lsl | ast::lsr |
-          ast::asr { some(ast_util::binop_to_str(op)) }
+          ast::bitxor | ast::bitand | ast::bitor | ast::shl | ast::shr
+          { some(ast_util::binop_to_str(op)) }
           _ { none }
         }
     }