]> git.lizzy.rs Git - rust.git/blob - src/test/ui/union/union-borrow-move-parent-sibling.rs
Merge commit '6ed6f1e6a1a8f414ba7e6d9b8222e7e5a1686e42' into clippyup
[rust.git] / src / test / ui / union / union-borrow-move-parent-sibling.rs
1 #![feature(untagged_unions)]
2 #![allow(unused)]
3
4 use std::ops::{Deref, DerefMut};
5
6 #[derive(Default)]
7 struct MockBox<T> {
8     value: [T; 1],
9 }
10
11 impl<T> MockBox<T> {
12     fn new(value: T) -> Self { MockBox { value: [value] } }
13 }
14
15 impl<T> Deref for MockBox<T> {
16     type Target = T;
17     fn deref(&self) -> &T { &self.value[0] }
18 }
19
20 impl<T> DerefMut for MockBox<T> {
21     fn deref_mut(&mut self) -> &mut T { &mut self.value[0] }
22 }
23
24 #[derive(Default)]
25 struct MockVec<T> {
26     value: [T; 0],
27 }
28
29 impl<T> MockVec<T> {
30     fn new() -> Self { MockVec { value: [] } }
31 }
32
33 impl<T> Deref for MockVec<T> {
34     type Target = [T];
35     fn deref(&self) -> &[T] { &self.value }
36 }
37
38 impl<T> DerefMut for MockVec<T> {
39     fn deref_mut(&mut self) -> &mut [T] { &mut self.value }
40 }
41
42
43 union U {
44     x: ((MockVec<u8>, MockVec<u8>), MockVec<u8>),
45     y: MockBox<MockVec<u8>>,
46 }
47
48 fn use_borrow<T>(_: &T) {}
49
50 unsafe fn parent_sibling_borrow() {
51     let mut u = U { x: ((MockVec::new(), MockVec::new()), MockVec::new()) };
52     let a = &mut u.x.0;
53     let b = &u.y; //~ ERROR cannot borrow `u` (via `u.y`)
54     use_borrow(a);
55 }
56
57 unsafe fn parent_sibling_move() {
58     let u = U { x: ((MockVec::new(), MockVec::new()), MockVec::new()) };
59     let a = u.x.0;
60     let b = u.y; //~ ERROR use of moved value: `u`
61 }
62
63 unsafe fn grandparent_sibling_borrow() {
64     let mut u = U { x: ((MockVec::new(), MockVec::new()), MockVec::new()) };
65     let a = &mut (u.x.0).0;
66     let b = &u.y; //~ ERROR cannot borrow `u` (via `u.y`)
67     use_borrow(a);
68 }
69
70 unsafe fn grandparent_sibling_move() {
71     let u = U { x: ((MockVec::new(), MockVec::new()), MockVec::new()) };
72     let a = (u.x.0).0;
73     let b = u.y; //~ ERROR use of moved value: `u`
74 }
75
76 unsafe fn deref_sibling_borrow() {
77     let mut u = U { y: MockBox::default() };
78     let a = &mut *u.y;
79     let b = &u.x; //~ ERROR cannot borrow `u` (via `u.x`)
80     use_borrow(a);
81 }
82
83 unsafe fn deref_sibling_move() {
84     let u = U { x: ((MockVec::new(), MockVec::new()), MockVec::new()) };
85     // No way to test deref-move without Box in union
86     // let a = *u.y;
87     // let b = u.x; ERROR use of moved value: `u`
88 }
89
90
91 fn main() {}