From 823837922bfc55c715a170fda3aa5823ead2e235 Mon Sep 17 00:00:00 2001 From: Ralf Jung Date: Sat, 25 Aug 2018 11:07:21 +0200 Subject: [PATCH] update for enum discriminant changes --- src/intrinsic.rs | 2 +- tests/compile-fail/invalid_enum_discriminant.rs | 5 ++--- tests/compile-fail/invalid_enum_discriminant2.rs | 16 ++++++++++++++++ 3 files changed, 19 insertions(+), 4 deletions(-) create mode 100644 tests/compile-fail/invalid_enum_discriminant2.rs diff --git a/src/intrinsic.rs b/src/intrinsic.rs index 62a1938d0fc1..ed8514863c19 100644 --- a/src/intrinsic.rs +++ b/src/intrinsic.rs @@ -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)?; } diff --git a/tests/compile-fail/invalid_enum_discriminant.rs b/tests/compile-fail/invalid_enum_discriminant.rs index 760b6563d27c..a188623a1e0e 100644 --- a/tests/compile-fail/invalid_enum_discriminant.rs +++ b/tests/compile-fail/invalid_enum_discriminant.rs @@ -8,11 +8,10 @@ pub enum Foo { fn main() { let f = unsafe { std::mem::transmute::(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 +} diff --git a/tests/compile-fail/invalid_enum_discriminant2.rs b/tests/compile-fail/invalid_enum_discriminant2.rs new file mode 100644 index 000000000000..5a5a20c48695 --- /dev/null +++ b/tests/compile-fail/invalid_enum_discriminant2.rs @@ -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::(42) }; + let _ = mem::discriminant(&f); +}