blob: 5cb04d0f8be19bda720e58479a2e6592f98696fc [file] [log] [blame]
fn empty_array() -> [u16; 0] {
[]
}
fn mini_array() -> [u16; 1] {
[42]
}
fn big_array() -> [u16; 5] {
[5, 4, 3, 2, 1]
}
fn array_array() -> [[u8; 2]; 3] {
[[5, 4], [3, 2], [1, 0]]
}
fn index_unsafe() -> i32 {
let a = [0, 10, 20, 30];
unsafe { *a.get_unchecked(2) }
}
fn index() -> i32 {
let a = [0, 10, 20, 30];
a[2]
}
fn array_repeat() -> [u8; 8] {
[42; 8]
}
fn slice_index() -> u8 {
let arr: &[_] = &[101, 102, 103, 104, 105, 106];
arr[5]
}
fn from() {
const N: usize = 16;
type Array = [u8; N];
let array: Array = [0; N];
let slice: &[u8] = &array[..];
let result = <&Array>::try_from(slice);
assert_eq!(&array, result.unwrap());
let vec = Vec::from(array);
assert_eq!(vec.len(), N);
}
fn eq() {
const N: usize = 16;
type Array = [u8; N];
let array1: Array = [0; N];
let array2: Array = [0; N];
let array3: Array = [1; N];
assert_eq!(array1, array2);
assert_ne!(array1, array3);
}
fn debug() {
let array = [0u8, 42, 13, 71];
println!("{:?}", array);
}
fn huge_zst() {
fn id<T>(x: T) -> T {
x
}
// A "huge" zero-sized array. Make sure we don't loop over it in any part of Miri.
let val = [(); usize::MAX];
id(val); // make a copy
let val = [val; 2];
id(val);
// Also wrap it in a union (which, in particular, hits the logic for computing union padding).
let _copy = std::mem::MaybeUninit::new(val);
}
fn main() {
assert_eq!(empty_array(), []);
assert_eq!(index_unsafe(), 20);
assert_eq!(index(), 20);
assert_eq!(slice_index(), 106);
assert_eq!(big_array(), [5, 4, 3, 2, 1]);
assert_eq!(array_array(), [[5, 4], [3, 2], [1, 0]]);
assert_eq!(array_repeat(), [42; 8]);
assert_eq!(mini_array(), [42]);
from();
eq();
debug();
huge_zst();
}