]> git.lizzy.rs Git - rust.git/blob - src/test/ui/nll/issue-21232-partial-init-and-erroneous-use.rs
Rollup merge of #103146 - joboet:cleanup_pthread_condvar, r=Mark-Simulacrum
[rust.git] / src / test / ui / nll / issue-21232-partial-init-and-erroneous-use.rs
1 // This test enumerates various cases of interest where an ADT or tuple is
2 // partially initialized and then used in some way that is wrong *even*
3 // after rust-lang/rust#54987 is implemented.
4 //
5 // See rust-lang/rust#21232, rust-lang/rust#54986, and rust-lang/rust#54987.
6 //
7 // See issue-21232-partial-init-and-use.rs for cases of tests that are
8 // meant to compile and run successfully once rust-lang/rust#54987 is
9 // implemented.
10
11 struct D {
12     x: u32,
13     s: S,
14 }
15
16 struct S {
17     y: u32,
18     z: u32,
19 }
20
21
22 impl Drop for D {
23     fn drop(&mut self) { }
24 }
25
26 fn cannot_partially_init_adt_with_drop() {
27     let d: D;
28     d.x = 10; //~ ERROR E0381
29 }
30
31 fn cannot_partially_init_mutable_adt_with_drop() {
32     let mut d: D;
33     d.x = 10; //~ ERROR E0381
34 }
35
36 fn cannot_partially_reinit_adt_with_drop() {
37     let mut d = D { x: 0, s: S{ y: 0, z: 0 } };
38     drop(d);
39     d.x = 10;
40     //~^ ERROR assign of moved value: `d` [E0382]
41 }
42
43 fn cannot_partially_init_inner_adt_via_outer_with_drop() {
44     let d: D;
45     d.s.y = 20; //~ ERROR E0381
46 }
47
48 fn cannot_partially_init_inner_adt_via_mutable_outer_with_drop() {
49     let mut d: D;
50     d.s.y = 20; //~ ERROR E0381
51 }
52
53 fn cannot_partially_reinit_inner_adt_via_outer_with_drop() {
54     let mut d = D { x: 0, s: S{ y: 0, z: 0} };
55     drop(d);
56     d.s.y = 20;
57     //~^ ERROR assign to part of moved value: `d` [E0382]
58 }
59
60 fn main() { }