mirror of https://github.com/rust-lang/rust
61 lines
1.3 KiB
Rust
61 lines
1.3 KiB
Rust
// 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() { }
|