From: Scott Olson Date: Sat, 23 Apr 2016 06:39:38 +0000 (-0600) Subject: Implement boolean binops. X-Git-Url: https://git.lizzy.rs/?a=commitdiff_plain;h=2db3597b564cfb63b36bbd49a6b4bbc146df2adb;p=rust.git Implement boolean binops. --- diff --git a/src/primval.rs b/src/primval.rs index c9117d033fd..3d844cebd31 100644 --- a/src/primval.rs +++ b/src/primval.rs @@ -14,10 +14,11 @@ pub enum PrimVal { } pub fn binary_op(bin_op: mir::BinOp, left: PrimVal, right: PrimVal) -> EvalResult { + 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 { } } - 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 { (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 { 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), diff --git a/tests/run-pass/specialization.rs b/tests/run-pass/specialization.rs index b82038f4003..4b5f510ad44 100644 --- a/tests/run-pass/specialization.rs +++ b/tests/run-pass/specialization.rs @@ -18,6 +18,7 @@ fn specialization() -> (bool, bool) { (i32::is_unit(), <()>::is_unit()) } +#[miri_run] fn main() { assert_eq!(specialization(), (false, true)); }