]> git.proxmox.com Git - rustc.git/blame - src/test/ui/union/union-move.rs
Update unsuspicious file list
[rustc.git] / src / test / ui / union / union-move.rs
CommitLineData
136023e0
XL
1// revisions: mirunsafeck thirunsafeck
2// [thirunsafeck]compile-flags: -Z thir-unsafeck
3
1b1a35ee
XL
4//! Test the behavior of moving out of non-`Copy` union fields.
5//! Avoid types that `Drop`, we want to focus on moving.
1b1a35ee
XL
6
7use std::cell::RefCell;
064997fb 8use std::mem::ManuallyDrop;
1b1a35ee
XL
9
10fn move_out<T>(x: T) {}
11
12union U1 {
064997fb
FG
13 f1_nocopy: ManuallyDrop<RefCell<i32>>,
14 f2_nocopy: ManuallyDrop<RefCell<i32>>,
1b1a35ee
XL
15 f3_copy: i32,
16}
17
18union U2 {
064997fb 19 f1_nocopy: ManuallyDrop<RefCell<i32>>,
1b1a35ee
XL
20}
21impl Drop for U2 {
22 fn drop(&mut self) {}
23}
24
25fn test1(x: U1) {
26 // Moving out of a nocopy field prevents accessing other nocopy field.
27 unsafe {
28 move_out(x.f1_nocopy);
29 move_out(x.f2_nocopy); //~ ERROR use of moved value: `x`
30 }
31}
32
33fn test2(x: U1) {
34 // "Moving" out of copy field doesn't prevent later field accesses.
35 unsafe {
36 move_out(x.f3_copy);
37 move_out(x.f2_nocopy); // no error
38 }
39}
40
41fn test3(x: U1) {
42 // Moving out of a nocopy field prevents accessing other copy field.
43 unsafe {
44 move_out(x.f2_nocopy);
45 move_out(x.f3_copy); //~ ERROR use of moved value: `x`
46 }
47}
48
49fn test4(x: U2) {
50 // Cannot move out of union that implements `Drop`.
51 unsafe {
52 move_out(x.f1_nocopy); //~ ERROR cannot move out of type `U2`, which implements the `Drop`
53 }
54}
55
56fn main() {}