Skip to content

Commit 8a17b36

Browse files
committed
CTFE: use binary_op to compare integer with match disriminant
1 parent 1731f0a commit 8a17b36

File tree

1 file changed

+9
-4
lines changed
  • src/librustc_mir/interpret/terminator

1 file changed

+9
-4
lines changed

src/librustc_mir/interpret/terminator/mod.rs

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
use rustc::mir;
22
use rustc::ty::{self, Ty};
3-
use rustc::ty::layout::LayoutOf;
3+
use rustc::ty::layout::{LayoutOf, Size};
44
use syntax::codemap::Span;
55
use rustc_target::spec::abi::Abi;
66

7-
use rustc::mir::interpret::EvalResult;
7+
use rustc::mir::interpret::{EvalResult, Scalar};
88
use super::{EvalContext, Place, Machine, ValTy};
99

1010
use rustc_data_structures::indexed_vec::Idx;
@@ -41,13 +41,18 @@ impl<'a, 'mir, 'tcx, M: Machine<'mir, 'tcx>> EvalContext<'a, 'mir, 'tcx, M> {
4141
let discr_prim = self.value_to_scalar(discr_val)?;
4242
let discr_layout = self.layout_of(discr_val.ty).unwrap();
4343
trace!("SwitchInt({:?}, {:#?})", discr_prim, discr_layout);
44-
let discr_prim = discr_prim.to_bits(discr_layout.size)?;
4544

4645
// Branch to the `otherwise` case by default, if no match is found.
4746
let mut target_block = targets[targets.len() - 1];
4847

4948
for (index, &const_int) in values.iter().enumerate() {
50-
if discr_prim == const_int {
49+
// Compare using binary_op
50+
let const_int = Scalar::Bits { bits: const_int, defined: 128 };
51+
let res = self.binary_op(mir::BinOp::Eq,
52+
discr_prim, discr_val.ty,
53+
const_int, discr_val.ty
54+
)?;
55+
if res.0.to_bits(Size::from_bytes(1))? != 0 {
5156
target_block = targets[index];
5257
break;
5358
}

0 commit comments

Comments
 (0)