diff options
| author | Ralf Jung <post@ralfj.de> | 2021-11-14 13:08:51 -0500 |
|---|---|---|
| committer | Ralf Jung <post@ralfj.de> | 2021-11-14 13:08:51 -0500 |
| commit | 498ebc46baf1d6f588f3b241f779a42edecf79be (patch) | |
| tree | 789e95dc41ea20ff05e6ce4f8eb8cec6337a03bd | |
| parent | 1b12d01903293453dd94aa170c82caf94415629f (diff) | |
| download | rust-498ebc46baf1d6f588f3b241f779a42edecf79be.tar.gz rust-498ebc46baf1d6f588f3b241f779a42edecf79be.zip | |
require full validity when determining the discriminant of a value
| -rw-r--r-- | compiler/rustc_const_eval/src/interpret/intrinsics.rs | 6 | ||||
| -rw-r--r-- | compiler/rustc_const_eval/src/interpret/step.rs | 6 |
2 files changed, 12 insertions, 0 deletions
diff --git a/compiler/rustc_const_eval/src/interpret/intrinsics.rs b/compiler/rustc_const_eval/src/interpret/intrinsics.rs index 698742fe98c..5e7bbc01132 100644 --- a/compiler/rustc_const_eval/src/interpret/intrinsics.rs +++ b/compiler/rustc_const_eval/src/interpret/intrinsics.rs @@ -265,6 +265,12 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { } sym::discriminant_value => { let place = self.deref_operand(&args[0])?; + if M::enforce_validity(self) { + // This is 'using' the value, so make sure the validity invariant is satisfied. + // (Also see https://github.com/rust-lang/rust/pull/89764.) + self.validate_operand(&place.into())?; + } + let discr_val = self.read_discriminant(&place.into())?.0; self.write_scalar(discr_val, dest)?; } diff --git a/compiler/rustc_const_eval/src/interpret/step.rs b/compiler/rustc_const_eval/src/interpret/step.rs index e6037d561de..2759a7d9d26 100644 --- a/compiler/rustc_const_eval/src/interpret/step.rs +++ b/compiler/rustc_const_eval/src/interpret/step.rs @@ -304,6 +304,12 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { Discriminant(place) => { let op = self.eval_place_to_op(place, None)?; + if M::enforce_validity(self) { + // This is 'using' the value, so make sure the validity invariant is satisfied. + // (Also see https://github.com/rust-lang/rust/pull/89764.) + self.validate_operand(&op)?; + } + let discr_val = self.read_discriminant(&op)?.0; self.write_scalar(discr_val, &dest)?; } |
