| //@ compile-flags: --crate-type=lib |
| #![allow(incomplete_features)] |
| #![feature(unsafe_fields)] |
| |
| struct WithUnsafeField { |
| unsafe unsafe_field: u32, |
| safe_field: u32, |
| } |
| |
| enum A { |
| WithUnsafeField { unsafe unsafe_field: u32, safe_field: u32 }, |
| } |
| |
| fn f(a: A) { |
| let A::WithUnsafeField { unsafe_field, safe_field } = a; |
| //~^ ERROR |
| } |
| |
| struct WithInvalidUnsafeField { |
| unsafe unsafe_noncopy_field: Vec<u32>, |
| } |
| |
| struct WithManuallyDropUnsafeField { |
| unsafe unsafe_noncopy_field: std::mem::ManuallyDrop<Vec<u32>>, |
| } |
| |
| union WithUnsafeFieldUnion { |
| unsafe unsafe_field: u32, |
| safe_field: u32, |
| } |
| |
| impl WithUnsafeField { |
| fn new() -> WithUnsafeField { |
| unsafe { |
| WithUnsafeField { |
| unsafe_field: 0, |
| safe_field: 0, |
| } |
| } |
| } |
| |
| fn new_without_unsafe() -> WithUnsafeField { |
| WithUnsafeField { //~ ERROR |
| unsafe_field: 0, |
| safe_field: 0, |
| } |
| } |
| |
| fn operate_on_safe_field(&mut self) { |
| self.safe_field = 2; |
| &self.safe_field; |
| self.safe_field; |
| } |
| |
| fn set_unsafe_field(&mut self) { |
| unsafe { |
| self.unsafe_field = 2; |
| } |
| } |
| |
| fn read_unsafe_field(&self) -> u32 { |
| unsafe { |
| self.unsafe_field |
| } |
| } |
| |
| fn ref_unsafe_field(&self) -> &u32 { |
| unsafe { |
| &self.unsafe_field |
| } |
| } |
| |
| fn destructure(&self) { |
| unsafe { |
| let Self { safe_field, unsafe_field } = self; |
| } |
| } |
| |
| fn set_unsafe_field_without_unsafe(&mut self) { |
| self.unsafe_field = 2; |
| //~^ ERROR |
| } |
| |
| fn read_unsafe_field_without_unsafe(&self) -> u32 { |
| self.unsafe_field |
| //~^ ERROR |
| } |
| |
| fn ref_unsafe_field_without_unsafe(&self) -> &u32 { |
| &self.unsafe_field |
| //~^ ERROR |
| } |
| |
| fn destructure_without_unsafe(&self) { |
| let Self { safe_field, unsafe_field } = self; |
| //~^ ERROR |
| |
| let WithUnsafeField { safe_field, .. } = self; |
| } |
| |
| fn offset_of(&self) -> usize { |
| std::mem::offset_of!(WithUnsafeField, unsafe_field) |
| } |
| |
| fn raw_const(&self) -> *const u32 { |
| &raw const self.unsafe_field |
| //~^ ERROR |
| } |
| } |