about summary refs log tree commit diff
path: root/compiler/rustc_const_eval/src
diff options
context:
space:
mode:
authorRalf Jung <post@ralfj.de>2024-09-29 08:30:46 +0200
committerRalf Jung <post@ralfj.de>2024-09-29 18:18:33 +0200
commit7caf2cdc2cc50310f556fe07be63b2b85feabc77 (patch)
tree48a5f8da90c739978dcb82f96a6d61cc7751229a /compiler/rustc_const_eval/src
parent1d9162bced9a499d10ec49ce37ea023a30c685db (diff)
downloadrust-7caf2cdc2cc50310f556fe07be63b2b85feabc77.tar.gz
rust-7caf2cdc2cc50310f556fe07be63b2b85feabc77.zip
interpret: always enable write_immediate sanity checks
Diffstat (limited to 'compiler/rustc_const_eval/src')
-rw-r--r--compiler/rustc_const_eval/src/interpret/operand.rs1
-rw-r--r--compiler/rustc_const_eval/src/interpret/place.rs8
2 files changed, 6 insertions, 3 deletions
diff --git a/compiler/rustc_const_eval/src/interpret/operand.rs b/compiler/rustc_const_eval/src/interpret/operand.rs
index 31ee3e6519a..b96643ea70f 100644
--- a/compiler/rustc_const_eval/src/interpret/operand.rs
+++ b/compiler/rustc_const_eval/src/interpret/operand.rs
@@ -118,6 +118,7 @@ impl<Prov: Provenance> Immediate<Prov> {
             (Immediate::Scalar(scalar), Abi::Scalar(s)) => {
                 assert_eq!(scalar.size(), s.size(cx));
                 if !matches!(s.primitive(), abi::Pointer(..)) {
+                    // This is not a pointer, it should not carry provenance.
                     assert!(matches!(scalar, Scalar::Int(..)));
                 }
             }
diff --git a/compiler/rustc_const_eval/src/interpret/place.rs b/compiler/rustc_const_eval/src/interpret/place.rs
index 32f90254a94..d22d966faea 100644
--- a/compiler/rustc_const_eval/src/interpret/place.rs
+++ b/compiler/rustc_const_eval/src/interpret/place.rs
@@ -652,6 +652,8 @@ where
                     M::after_local_write(self, local, /*storage_live*/ false)?;
                 }
                 // Double-check that the value we are storing and the local fit to each other.
+                // Things can ge wrong in quite weird ways when this is violated.
+                // Unfortunately this is too expensive to do in release builds.
                 if cfg!(debug_assertions) {
                     src.assert_matches_abi(local_layout.abi, self);
                 }
@@ -672,9 +674,9 @@ where
         layout: TyAndLayout<'tcx>,
         dest: MemPlace<M::Provenance>,
     ) -> InterpResult<'tcx> {
-        if cfg!(debug_assertions) {
-            value.assert_matches_abi(layout.abi, self);
-        }
+        // We use the sizes from `value` below.
+        // Ensure that matches the type of the place it is written to.
+        value.assert_matches_abi(layout.abi, self);
         // Note that it is really important that the type here is the right one, and matches the
         // type things are read at. In case `value` is a `ScalarPair`, we don't do any magic here
         // to handle padding properly, which is only correct if we never look at this data with the