diff options
| author | Matthias Krüger <matthias.krueger@famsik.de> | 2021-11-25 15:05:39 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-11-25 15:05:39 +0100 |
| commit | 5fff1d77e75762d9fe581735779e9c1caef8224f (patch) | |
| tree | e1289623eb73d607abe42039982a729221cf949f /compiler/rustc_const_eval/src | |
| parent | 5f6cb2c552a723c41ae31794c7f2f3a61704df69 (diff) | |
| parent | 5f6ccf61218fb98c2aa2cff0af83557d7ccaa5fd (diff) | |
| download | rust-5fff1d77e75762d9fe581735779e9c1caef8224f.tar.gz rust-5fff1d77e75762d9fe581735779e9c1caef8224f.zip | |
Rollup merge of #91162 - RalfJung:miri-shift-truncation, r=oli-obk
explain why CTFE/Miri perform truncation on shift offset Closes https://github.com/rust-lang/miri/issues/1920
Diffstat (limited to 'compiler/rustc_const_eval/src')
| -rw-r--r-- | compiler/rustc_const_eval/src/interpret/operator.rs | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/compiler/rustc_const_eval/src/interpret/operator.rs b/compiler/rustc_const_eval/src/interpret/operator.rs index ac000b1bb56..a90582fc338 100644 --- a/compiler/rustc_const_eval/src/interpret/operator.rs +++ b/compiler/rustc_const_eval/src/interpret/operator.rs @@ -130,7 +130,12 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { let signed = left_layout.abi.is_signed(); let size = u128::from(left_layout.size.bits()); let overflow = r >= size; - let r = r % size; // mask to type size + // The shift offset is implicitly masked to the type size, to make sure this operation + // is always defined. This is the one MIR operator that does *not* directly map to a + // single LLVM operation. See + // <https://github.com/rust-lang/rust/blob/a3b9405ae7bb6ab4e8103b414e75c44598a10fd2/compiler/rustc_codegen_ssa/src/common.rs#L131-L158> + // for the corresponding truncation in our codegen backends. + let r = r % size; let r = u32::try_from(r).unwrap(); // we masked so this will always fit let result = if signed { let l = self.sign_extend(l, left_layout) as i128; |
