diff --git a/src/interpreter/terminator/mod.rs b/src/interpreter/terminator/mod.rs index fdd703e940bd..414fdeb936dd 100644 --- a/src/interpreter/terminator/mod.rs +++ b/src/interpreter/terminator/mod.rs @@ -252,11 +252,16 @@ impl<'a, 'tcx> EvalContext<'a, 'tcx> { let adt_layout = self.type_layout(adt_ty); let discr_val = match *adt_layout { - General { discr, .. } | CEnum { discr, .. } => { + General { discr, .. } | CEnum { discr, signed: false, .. } => { let discr_size = discr.size().bytes(); self.memory.read_uint(adt_ptr, discr_size as usize)? } + CEnum { discr, signed: true, .. } => { + let discr_size = discr.size().bytes(); + self.memory.read_int(adt_ptr, discr_size as usize)? as u64 + } + RawNullablePointer { nndiscr, .. } => { self.read_nonnull_discriminant_value(adt_ptr, nndiscr)? } diff --git a/tests/run-pass/negative_discriminant.rs b/tests/run-pass/negative_discriminant.rs new file mode 100644 index 000000000000..16f175e7dfc8 --- /dev/null +++ b/tests/run-pass/negative_discriminant.rs @@ -0,0 +1,13 @@ +enum AB { A = -1, B = 1 } + +fn main() { + match AB::A { + AB::A => (), + AB::B => panic!(), + } + + match AB::B { + AB::A => panic!(), + AB::B => (), + } +}