// revisions: mirunsafeck thirunsafeck // [thirunsafeck]compile-flags: -Z thir-unsafeck #![feature(rustc_attrs)] #![allow(unused,dead_code)] fn tuple_struct() { #[rustc_layout_scalar_valid_range_start(1)] struct NonZero(T); let mut foo = unsafe { NonZero((1,)) }; let a = &mut foo.0.0; //~^ ERROR: mutation of layout constrained field is unsafe } fn slice() { #[rustc_layout_scalar_valid_range_start(1)] struct NonZero<'a, T>(&'a mut [T]); let mut nums = [1, 2, 3, 4]; let mut foo = unsafe { NonZero(&mut nums[..]) }; let a = &mut foo.0[2]; // ^ not unsafe because there is an implicit dereference here } fn array() { #[rustc_layout_scalar_valid_range_start(1)] struct NonZero([T; 4]); let nums = [1, 2, 3, 4]; let mut foo = unsafe { NonZero(nums) }; let a = &mut foo.0[2]; //~^ ERROR: mutation of layout constrained field is unsafe } fn block() { #[rustc_layout_scalar_valid_range_start(1)] struct NonZero(T); let foo = unsafe { NonZero((1,)) }; &mut { foo.0 }.0; // ^ not unsafe because the result of the block expression is a new place } fn mtch() { #[rustc_layout_scalar_valid_range_start(1)] struct NonZero(T); let mut foo = unsafe { NonZero((1,)) }; match &mut foo { NonZero((a,)) => *a = 0, //~^ ERROR: mutation of layout constrained field is unsafe } } fn main() {}