update for enum discriminant changes

This commit is contained in:
Ralf Jung 2018-08-25 11:07:21 +02:00
parent 9280d17d98
commit 823837922b
3 changed files with 19 additions and 4 deletions

View file

@ -198,7 +198,7 @@ impl<'a, 'mir, 'tcx> EvalContextExt<'tcx> for EvalContext<'a, 'mir, 'tcx, super:
"discriminant_value" => {
let place = self.ref_to_mplace(self.read_value(args[0])?)?;
let discr_val = self.read_discriminant_value(place.into())?;
let discr_val = self.read_discriminant(place.into())?.0;
self.write_scalar(Scalar::from_uint(discr_val, dest.layout.size), dest)?;
}

View file

@ -8,11 +8,10 @@ pub enum Foo {
fn main() {
let f = unsafe { std::mem::transmute::<i32, Foo>(42) };
match f {
match f { //~ ERROR invalid enum discriminant
Foo::A => {},
Foo::B => {},
Foo::C => {},
Foo::D => {},
}
} //~ ERROR constant evaluation error
//~^ NOTE entered unreachable code
}

View file

@ -0,0 +1,16 @@
// Validation makes this fail in the wrong place
// compile-flags: -Zmir-emit-validate=0
// error-pattern: invalid enum discriminant
use std::mem;
#[repr(C)]
pub enum Foo {
A, B, C, D
}
fn main() {
let f = unsafe { std::mem::transmute::<i32, Foo>(42) };
let _ = mem::discriminant(&f);
}