diff --git a/kmir/src/kmir/kdist/mir-semantics/rt/data.md b/kmir/src/kmir/kdist/mir-semantics/rt/data.md index f76620160..0dba629bd 100644 --- a/kmir/src/kmir/kdist/mir-semantics/rt/data.md +++ b/kmir/src/kmir/kdist/mir-semantics/rt/data.md @@ -452,6 +452,17 @@ This is done without consideration of the validity of the Downcast[^downcast]. [^downcast]: See discussion in https://github.com/rust-lang/rust/issues/93688#issuecomment-1032929496. ```k + // fast elimination: SingletonArray + Field(0) + ConstantIndex(0) on a single-element Aggregate + rule #traverseProjection( + DEST, + Aggregate(IDX, ARGS), + projectionElemSingletonArray projectionElemField(fieldIdx(0), TY) projectionElemConstantIndex(0, 0, false) PROJS, + CTXTS + ) + => #traverseProjection(DEST, Aggregate(IDX, ARGS), projectionElemField(fieldIdx(0), TY) PROJS, CTXTS) ... + requires size(ARGS) ==Int 1 + [preserves-definedness] + rule #traverseProjection( DEST, Aggregate(IDX, ARGS), diff --git a/kmir/src/tests/integration/data/prove-rs/write_volatile_pubkey_array.rs b/kmir/src/tests/integration/data/prove-rs/write_volatile_pubkey_array.rs new file mode 100644 index 000000000..226770ce2 --- /dev/null +++ b/kmir/src/tests/integration/data/prove-rs/write_volatile_pubkey_array.rs @@ -0,0 +1,37 @@ +#![allow(invalid_reference_casting)] + +fn main() { + let _keep: fn(&AccountInfo<'_>, Pubkey) = repro; +} + +#[inline(never)] +#[no_mangle] +pub fn repro(account: &AccountInfo<'_>, replacement: Pubkey) { + account.assign(replacement); + assert_eq!(*account.owner, replacement); +} + +struct AccountInfo<'a> { + owner: &'a Pubkey, +} + +impl<'a> AccountInfo<'a> { + #[inline(never)] + fn assign(&self, new_owner: Pubkey) { + unsafe { + std::ptr::write_volatile( + self.owner as *const Pubkey as *mut [u8; 32], + new_owner.to_bytes(), + ); + } + } +} + +#[derive(Clone, Copy, Debug, PartialEq, Eq)] +struct Pubkey([u8; 32]); + +impl Pubkey { + fn to_bytes(self) -> [u8; 32] { + self.0 + } +} diff --git a/kmir/src/tests/integration/test_integration.py b/kmir/src/tests/integration/test_integration.py index 8c59cce9b..6e9ec7133 100644 --- a/kmir/src/tests/integration/test_integration.py +++ b/kmir/src/tests/integration/test_integration.py @@ -40,6 +40,7 @@ 'test_offset_from-fail': ['testing'], 'iter-eq-copied-take-dereftruncate': ['repro'], 'spl-multisig-iter-eq-copied-next': ['repro'], + 'write_volatile_pubkey_array': ['repro'], } PROVE_SHOW_SPECS = [ 'local-raw-fail',