blob: 46a156d2af9eeaa083336a64748ea155f4f1b242 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
|
// 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() { }
|