about summary refs log tree commit diff
diff options
context:
space:
mode:
authorRalf Jung <post@ralfj.de>2018-07-15 11:35:18 +0200
committerRalf Jung <post@ralfj.de>2018-07-15 11:35:18 +0200
commit8a17b36fc5cdd33fdd8a705b82118980b48681f7 (patch)
treeda5ad72400849b9175f459874904e2d2a22b87d9
parent1731f0af22af16c461b2b7abe58988b8549b2de6 (diff)
downloadrust-8a17b36fc5cdd33fdd8a705b82118980b48681f7.tar.gz
rust-8a17b36fc5cdd33fdd8a705b82118980b48681f7.zip
CTFE: use binary_op to compare integer with match disriminant
-rw-r--r--src/librustc_mir/interpret/terminator/mod.rs13
1 files changed, 9 insertions, 4 deletions
diff --git a/src/librustc_mir/interpret/terminator/mod.rs b/src/librustc_mir/interpret/terminator/mod.rs
index 2994b1b387f..e281ba79639 100644
--- a/src/librustc_mir/interpret/terminator/mod.rs
+++ b/src/librustc_mir/interpret/terminator/mod.rs
@@ -1,10 +1,10 @@
 use rustc::mir;
 use rustc::ty::{self, Ty};
-use rustc::ty::layout::LayoutOf;
+use rustc::ty::layout::{LayoutOf, Size};
 use syntax::codemap::Span;
 use rustc_target::spec::abi::Abi;
 
-use rustc::mir::interpret::EvalResult;
+use rustc::mir::interpret::{EvalResult, Scalar};
 use super::{EvalContext, Place, Machine, ValTy};
 
 use rustc_data_structures::indexed_vec::Idx;
@@ -41,13 +41,18 @@ impl<'a, 'mir, 'tcx, M: Machine<'mir, 'tcx>> EvalContext<'a, 'mir, 'tcx, M> {
                 let discr_prim = self.value_to_scalar(discr_val)?;
                 let discr_layout = self.layout_of(discr_val.ty).unwrap();
                 trace!("SwitchInt({:?}, {:#?})", discr_prim, discr_layout);
-                let discr_prim = discr_prim.to_bits(discr_layout.size)?;
 
                 // Branch to the `otherwise` case by default, if no match is found.
                 let mut target_block = targets[targets.len() - 1];
 
                 for (index, &const_int) in values.iter().enumerate() {
-                    if discr_prim == const_int {
+                    // Compare using binary_op
+                    let const_int = Scalar::Bits { bits: const_int, defined: 128 };
+                    let res = self.binary_op(mir::BinOp::Eq,
+                        discr_prim, discr_val.ty,
+                        const_int, discr_val.ty
+                    )?;
+                    if res.0.to_bits(Size::from_bytes(1))? != 0 {
                         target_block = targets[index];
                         break;
                     }