summaryrefslogtreecommitdiffstats
path: root/src/test/ui/union/union-borrow-move-parent-sibling.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/test/ui/union/union-borrow-move-parent-sibling.rs')
-rw-r--r--src/test/ui/union/union-borrow-move-parent-sibling.rs96
1 files changed, 0 insertions, 96 deletions
diff --git a/src/test/ui/union/union-borrow-move-parent-sibling.rs b/src/test/ui/union/union-borrow-move-parent-sibling.rs
deleted file mode 100644
index 83781c5e5..000000000
--- a/src/test/ui/union/union-borrow-move-parent-sibling.rs
+++ /dev/null
@@ -1,96 +0,0 @@
-// revisions: mirunsafeck thirunsafeck
-// [thirunsafeck]compile-flags: -Z thir-unsafeck
-
-#![allow(unused)]
-
-use std::ops::{Deref, DerefMut};
-use std::mem::ManuallyDrop;
-
-#[derive(Default)]
-struct MockBox<T> {
- value: [T; 1],
-}
-
-impl<T> MockBox<T> {
- fn new(value: T) -> Self { MockBox { value: [value] } }
-}
-
-impl<T> Deref for MockBox<T> {
- type Target = T;
- fn deref(&self) -> &T { &self.value[0] }
-}
-
-impl<T> DerefMut for MockBox<T> {
- fn deref_mut(&mut self) -> &mut T { &mut self.value[0] }
-}
-
-#[derive(Default)]
-struct MockVec<T> {
- value: [T; 0],
-}
-
-impl<T> MockVec<T> {
- fn new() -> Self { MockVec { value: [] } }
-}
-
-impl<T> Deref for MockVec<T> {
- type Target = [T];
- fn deref(&self) -> &[T] { &self.value }
-}
-
-impl<T> DerefMut for MockVec<T> {
- fn deref_mut(&mut self) -> &mut [T] { &mut self.value }
-}
-
-
-union U {
- x: ManuallyDrop<((MockVec<u8>, MockVec<u8>), MockVec<u8>)>,
- y: ManuallyDrop<MockBox<MockVec<u8>>>,
-}
-
-fn use_borrow<T>(_: &T) {}
-
-unsafe fn parent_sibling_borrow() {
- let mut u = U { x: ManuallyDrop::new(((MockVec::new(), MockVec::new()), MockVec::new())) };
- let a = &mut (*u.x).0;
- let b = &u.y; //~ ERROR cannot borrow `u` (via `u.y`)
- use_borrow(a);
-}
-
-unsafe fn parent_sibling_move() {
- let u = U { x: ManuallyDrop::new(((MockVec::new(), MockVec::new()), MockVec::new())) };
- let a = u.x.0; //~ERROR cannot move out of dereference
- let a = u.x;
- let b = u.y; //~ ERROR use of moved value: `u`
-}
-
-unsafe fn grandparent_sibling_borrow() {
- let mut u = U { x: ManuallyDrop::new(((MockVec::new(), MockVec::new()), MockVec::new())) };
- let a = &mut ((*u.x).0).0;
- let b = &u.y; //~ ERROR cannot borrow `u` (via `u.y`)
- use_borrow(a);
-}
-
-unsafe fn grandparent_sibling_move() {
- let u = U { x: ManuallyDrop::new(((MockVec::new(), MockVec::new()), MockVec::new())) };
- let a = (u.x.0).0; //~ERROR cannot move out of dereference
- let a = u.x;
- let b = u.y; //~ ERROR use of moved value: `u`
-}
-
-unsafe fn deref_sibling_borrow() {
- let mut u = U { y: ManuallyDrop::new(MockBox::default()) };
- let a = &mut *u.y;
- let b = &u.x; //~ ERROR cannot borrow `u` (via `u.x`)
- use_borrow(a);
-}
-
-unsafe fn deref_sibling_move() {
- let u = U { x: ManuallyDrop::new(((MockVec::new(), MockVec::new()), MockVec::new())) };
- // No way to test deref-move without Box in union
- // let a = *u.y;
- // let b = u.x; ERROR use of moved value: `u`
-}
-
-
-fn main() {}