Skip to content

Commit 86062ef

Browse files
committed
Read discriminant as a signed integer if specified by layout.
This ensures it gets sign extended correctly. Fixes rust-lang#78
1 parent ce8806d commit 86062ef

File tree

2 files changed

+19
-1
lines changed

2 files changed

+19
-1
lines changed

src/interpreter/terminator/mod.rs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -252,11 +252,16 @@ impl<'a, 'tcx> EvalContext<'a, 'tcx> {
252252
let adt_layout = self.type_layout(adt_ty);
253253

254254
let discr_val = match *adt_layout {
255-
General { discr, .. } | CEnum { discr, .. } => {
255+
General { discr, .. } | CEnum { discr, signed: false, .. } => {
256256
let discr_size = discr.size().bytes();
257257
self.memory.read_uint(adt_ptr, discr_size as usize)?
258258
}
259259

260+
CEnum { discr, signed: true, .. } => {
261+
let discr_size = discr.size().bytes();
262+
self.memory.read_int(adt_ptr, discr_size as usize)? as u64
263+
}
264+
260265
RawNullablePointer { nndiscr, .. } => {
261266
self.read_nonnull_discriminant_value(adt_ptr, nndiscr)?
262267
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
enum AB { A = -1, B = 1 }
2+
3+
fn main() {
4+
match AB::A {
5+
AB::A => (),
6+
AB::B => panic!(),
7+
}
8+
9+
match AB::B {
10+
AB::A => panic!(),
11+
AB::B => (),
12+
}
13+
}

0 commit comments

Comments
 (0)