diff options
| author | Ralf Jung <post@ralfj.de> | 2018-07-15 11:35:18 +0200 |
|---|---|---|
| committer | Ralf Jung <post@ralfj.de> | 2018-07-15 11:35:18 +0200 |
| commit | 8a17b36fc5cdd33fdd8a705b82118980b48681f7 (patch) | |
| tree | da5ad72400849b9175f459874904e2d2a22b87d9 | |
| parent | 1731f0af22af16c461b2b7abe58988b8549b2de6 (diff) | |
| download | rust-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.rs | 13 |
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; } |
