From ee666d8987f29a86a8bd37a85aecc9608ba2d2eb Mon Sep 17 00:00:00 2001 From: Ralf Jung Date: Sun, 28 Nov 2021 10:07:31 -0500 Subject: [PATCH] add tests for alignment on array initialization --- rust-version | 2 +- tests/run-pass/async-fn.rs | 13 ++++++++++++ tests/run-pass/issue-miri-1925.rs | 33 +++++++++++++++++++++++++++++++ 3 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 tests/run-pass/issue-miri-1925.rs diff --git a/rust-version b/rust-version index 0844897398..cc01c7ccb4 100644 --- a/rust-version +++ b/rust-version @@ -1 +1 @@ -686e313a9aa14107c8631ffe48fa09110a7692db +58f9efd36de5669ab731ec7ebf565999ff17b159 diff --git a/tests/run-pass/async-fn.rs b/tests/run-pass/async-fn.rs index 414d5aaf5c..1602b5638e 100644 --- a/tests/run-pass/async-fn.rs +++ b/tests/run-pass/async-fn.rs @@ -45,6 +45,18 @@ async fn partial_init(x: u32) -> u32 { let _x: (String, !) = (String::new(), return async { x + x }.await); } +async fn read_exact(_from: &mut &[u8], _to: &mut [u8]) -> Option<()> { + Some(()) +} + +async fn hello_world() { + let data = [0u8; 1]; + let mut reader = &data[..]; + + let mut marker = [0u8; 1]; + read_exact(&mut reader, &mut marker).await.unwrap(); +} + fn run_fut(fut: impl Future) -> T { use std::sync::Arc; use std::task::{Context, Poll, Wake, Waker}; @@ -74,4 +86,5 @@ fn main() { assert_eq!(run_fut(build_aggregate(1, 2, 3, 4)), 10); assert_eq!(run_fut(includes_never(false, 4)), 16); assert_eq!(run_fut(partial_init(4)), 8); + run_fut(hello_world()); } diff --git a/tests/run-pass/issue-miri-1925.rs b/tests/run-pass/issue-miri-1925.rs new file mode 100644 index 0000000000..262889f56e --- /dev/null +++ b/tests/run-pass/issue-miri-1925.rs @@ -0,0 +1,33 @@ +// compile-flags: -Zmiri-symbolic-alignment-check + +use std::mem::size_of; + +fn main() { + let mut a = Params::new(); + a.key_block = [0; BLOCKBYTES]; +} + +#[repr(C)] +#[derive(Clone)] +#[allow(unused)] +pub struct Params { + hash_length: u8, + key_length: u8, + key_block: [u8; BLOCKBYTES], + max_leaf_length: u32, +} + +pub const OUTBYTES: usize = 8 * size_of::(); +pub const KEYBYTES: usize = 8 * size_of::(); +pub const BLOCKBYTES: usize = 16 * size_of::(); + +impl Params { + pub fn new() -> Self { + Self { + hash_length: OUTBYTES as u8, + key_length: 0, + key_block: [0; BLOCKBYTES], + max_leaf_length: 0, + } + } +}