// This test enumerates various cases of interest where an ADT or tuple is // partially initialized and then used in some way that is wrong *even* // after rust-lang/rust#54987 is implemented. // // See rust-lang/rust#21232, rust-lang/rust#54986, and rust-lang/rust#54987. // // See issue-21232-partial-init-and-use.rs for cases of tests that are // meant to compile and run successfully once rust-lang/rust#54987 is // implemented. struct D { x: u32, s: S, } struct S { y: u32, z: u32, } impl Drop for D { fn drop(&mut self) { } } fn cannot_partially_init_adt_with_drop() { let d: D; d.x = 10; //~ ERROR E0381 } fn cannot_partially_init_mutable_adt_with_drop() { let mut d: D; d.x = 10; //~ ERROR E0381 } fn cannot_partially_reinit_adt_with_drop() { let mut d = D { x: 0, s: S{ y: 0, z: 0 } }; drop(d); d.x = 10; //~^ ERROR assign of moved value: `d` [E0382] } fn cannot_partially_init_inner_adt_via_outer_with_drop() { let d: D; d.s.y = 20; //~ ERROR E0381 } fn cannot_partially_init_inner_adt_via_mutable_outer_with_drop() { let mut d: D; d.s.y = 20; //~ ERROR E0381 } fn cannot_partially_reinit_inner_adt_via_outer_with_drop() { let mut d = D { x: 0, s: S{ y: 0, z: 0} }; drop(d); d.s.y = 20; //~^ ERROR assign to part of moved value: `d` [E0382] } fn main() { }