]> git.lizzy.rs Git - rust.git/commitdiff
Implement boolean binops.
authorScott Olson <scott@solson.me>
Sat, 23 Apr 2016 06:39:38 +0000 (00:39 -0600)
committerScott Olson <scott@solson.me>
Sat, 23 Apr 2016 06:39:38 +0000 (00:39 -0600)
src/primval.rs
tests/run-pass/specialization.rs

index c9117d033fdd5c584c11bf77d63f8eed1375f39e..3d844cebd31174699c4986187c2f1c52d754b96d 100644 (file)
@@ -14,10 +14,11 @@ pub enum PrimVal {
 }
 
 pub fn binary_op(bin_op: mir::BinOp, left: PrimVal, right: PrimVal) -> EvalResult<PrimVal> {
+    use rustc::mir::repr::BinOp::*;
+    use self::PrimVal::*;
+
     macro_rules! int_binops {
         ($v:ident, $l:ident, $r:ident) => ({
-            use rustc::mir::repr::BinOp::*;
-            use self::PrimVal::*;
             match bin_op {
                 Add    => $v($l + $r),
                 Sub    => $v($l - $r),
@@ -52,7 +53,6 @@ fn unrelated_ptr_ops(bin_op: mir::BinOp) -> EvalResult<PrimVal> {
         }
     }
 
-    use self::PrimVal::*;
     let val = match (left, right) {
         (I8(l),  I8(r))  => int_binops!(I8, l, r),
         (I16(l), I16(r)) => int_binops!(I16, l, r),
@@ -63,6 +63,18 @@ fn unrelated_ptr_ops(bin_op: mir::BinOp) -> EvalResult<PrimVal> {
         (U32(l), U32(r)) => int_binops!(U32, l, r),
         (U64(l), U64(r)) => int_binops!(U64, l, r),
 
+        (Bool(l), Bool(r)) => {
+            Bool(match bin_op {
+                Eq => l == r,
+                Ne => l != r,
+                Lt => l < r,
+                Le => l <= r,
+                Gt => l > r,
+                Ge => l >= r,
+                _ => panic!("invalid binary operation on booleans: {:?}", bin_op),
+            })
+        }
+
         (IntegerPtr(l), IntegerPtr(r)) => int_binops!(IntegerPtr, l, r),
 
         (AbstractPtr(_), IntegerPtr(_)) | (IntegerPtr(_), AbstractPtr(_)) =>
@@ -76,7 +88,6 @@ fn unrelated_ptr_ops(bin_op: mir::BinOp) -> EvalResult<PrimVal> {
             let l = l_ptr.offset;
             let r = r_ptr.offset;
 
-            use rustc::mir::repr::BinOp::*;
             match bin_op {
                 Eq => Bool(l == r),
                 Ne => Bool(l != r),
index b82038f400308c7312f0603a858b742015044426..4b5f510ad44091789ca67775fcf4e7ed59e587e5 100644 (file)
@@ -18,6 +18,7 @@ fn specialization() -> (bool, bool) {
     (i32::is_unit(), <()>::is_unit())
 }
 
+#[miri_run]
 fn main() {
     assert_eq!(specialization(), (false, true));
 }