From 64d98f8ee037282c35007b64c2649055c56af1db Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Wed, 17 Apr 2024 14:19:03 +0200 Subject: Merging upstream version 1.68.2+dfsg1. Signed-off-by: Daniel Baumann --- src/test/ui/union/auxiliary/union.rs | 4 - src/test/ui/union/field_checks.rs | 65 -------- src/test/ui/union/field_checks.stderr | 63 -------- src/test/ui/union/issue-41073.rs | 22 --- src/test/ui/union/issue-41073.stderr | 15 -- src/test/ui/union/issue-81199.rs | 21 --- src/test/ui/union/issue-81199.stderr | 19 --- src/test/ui/union/issue-99375.rs | 21 --- src/test/ui/union/union-align.rs | 65 -------- src/test/ui/union/union-backcomp.rs | 28 ---- src/test/ui/union/union-basic.rs | 62 -------- ...n-borrow-move-parent-sibling.mirunsafeck.stderr | 80 ---------- .../ui/union/union-borrow-move-parent-sibling.rs | 96 ------------ ...-borrow-move-parent-sibling.thirunsafeck.stderr | 80 ---------- src/test/ui/union/union-const-codegen.rs | 19 --- src/test/ui/union/union-const-eval-field.rs | 45 ------ src/test/ui/union/union-const-eval.rs | 15 -- src/test/ui/union/union-const-pat.rs | 13 -- src/test/ui/union/union-const-pat.stderr | 8 - src/test/ui/union/union-copy.rs | 14 -- src/test/ui/union/union-copy.stderr | 18 --- src/test/ui/union/union-deref.mirunsafeck.stderr | 56 ------- src/test/ui/union/union-deref.rs | 29 ---- src/test/ui/union/union-deref.thirunsafeck.stderr | 56 ------- .../ui/union/union-derive-clone.mirunsafeck.stderr | 49 ------ src/test/ui/union/union-derive-clone.rs | 39 ----- .../union/union-derive-clone.thirunsafeck.stderr | 49 ------ .../ui/union/union-derive-eq.mirunsafeck.stderr | 23 --- src/test/ui/union/union-derive-eq.rs | 21 --- .../ui/union/union-derive-eq.thirunsafeck.stderr | 23 --- src/test/ui/union/union-derive-rpass.rs | 42 ----- src/test/ui/union/union-derive.rs | 16 -- src/test/ui/union/union-derive.stderr | 38 ----- src/test/ui/union/union-drop-assign.rs | 37 ----- src/test/ui/union/union-drop.rs | 60 ------- src/test/ui/union/union-empty.rs | 3 - src/test/ui/union/union-empty.stderr | 8 - .../ui/union/union-fields-1.mirunsafeck.stderr | 42 ----- src/test/ui/union/union-fields-1.rs | 35 ----- .../ui/union/union-fields-1.thirunsafeck.stderr | 42 ----- .../ui/union/union-fields-2.mirunsafeck.stderr | 84 ---------- src/test/ui/union/union-fields-2.rs | 26 ---- .../ui/union/union-fields-2.thirunsafeck.stderr | 84 ---------- src/test/ui/union/union-generic-rpass.rs | 34 ---- src/test/ui/union/union-generic.mirunsafeck.stderr | 27 ---- src/test/ui/union/union-generic.rs | 15 -- .../ui/union/union-generic.thirunsafeck.stderr | 27 ---- src/test/ui/union/union-inherent-method.rs | 16 -- .../union/union-lint-dead-code.mirunsafeck.stderr | 17 -- src/test/ui/union/union-lint-dead-code.rs | 18 --- .../union/union-lint-dead-code.thirunsafeck.stderr | 17 -- src/test/ui/union/union-macro.rs | 27 ---- src/test/ui/union/union-manuallydrop-rpass.rs | 44 ------ src/test/ui/union/union-move.mirunsafeck.stderr | 51 ------ src/test/ui/union/union-move.rs | 56 ------- src/test/ui/union/union-move.thirunsafeck.stderr | 51 ------ src/test/ui/union/union-nodrop.rs | 62 -------- src/test/ui/union/union-nonrepresentable.rs | 6 - src/test/ui/union/union-nonrepresentable.stderr | 17 -- src/test/ui/union/union-nonzero.rs | 54 ------- src/test/ui/union/union-overwrite.rs | 80 ---------- src/test/ui/union/union-packed.rs | 173 --------------------- src/test/ui/union/union-pat-refutability.rs | 57 ------- src/test/ui/union/union-repr-c.rs | 18 --- src/test/ui/union/union-repr-c.stderr | 21 --- src/test/ui/union/union-sized-field.rs | 19 --- src/test/ui/union/union-sized-field.stderr | 78 ---------- .../union/union-suggest-field.mirunsafeck.stderr | 27 ---- src/test/ui/union/union-suggest-field.rs | 24 --- .../union/union-suggest-field.thirunsafeck.stderr | 27 ---- src/test/ui/union/union-trait-impl.rs | 19 --- src/test/ui/union/union-transmute.rs | 27 ---- src/test/ui/union/union-unsafe.mir.stderr | 75 --------- src/test/ui/union/union-unsafe.rs | 78 ---------- src/test/ui/union/union-unsafe.thir.stderr | 75 --------- src/test/ui/union/union-unsized.mirunsafeck.stderr | 39 ----- src/test/ui/union/union-unsized.rs | 17 -- .../ui/union/union-unsized.thirunsafeck.stderr | 39 ----- .../union-with-drop-fields.mirunsafeck.stderr | 39 ----- src/test/ui/union/union-with-drop-fields.rs | 31 ---- .../union-with-drop-fields.thirunsafeck.stderr | 39 ----- 81 files changed, 3176 deletions(-) delete mode 100644 src/test/ui/union/auxiliary/union.rs delete mode 100644 src/test/ui/union/field_checks.rs delete mode 100644 src/test/ui/union/field_checks.stderr delete mode 100644 src/test/ui/union/issue-41073.rs delete mode 100644 src/test/ui/union/issue-41073.stderr delete mode 100644 src/test/ui/union/issue-81199.rs delete mode 100644 src/test/ui/union/issue-81199.stderr delete mode 100644 src/test/ui/union/issue-99375.rs delete mode 100644 src/test/ui/union/union-align.rs delete mode 100644 src/test/ui/union/union-backcomp.rs delete mode 100644 src/test/ui/union/union-basic.rs delete mode 100644 src/test/ui/union/union-borrow-move-parent-sibling.mirunsafeck.stderr delete mode 100644 src/test/ui/union/union-borrow-move-parent-sibling.rs delete mode 100644 src/test/ui/union/union-borrow-move-parent-sibling.thirunsafeck.stderr delete mode 100644 src/test/ui/union/union-const-codegen.rs delete mode 100644 src/test/ui/union/union-const-eval-field.rs delete mode 100644 src/test/ui/union/union-const-eval.rs delete mode 100644 src/test/ui/union/union-const-pat.rs delete mode 100644 src/test/ui/union/union-const-pat.stderr delete mode 100644 src/test/ui/union/union-copy.rs delete mode 100644 src/test/ui/union/union-copy.stderr delete mode 100644 src/test/ui/union/union-deref.mirunsafeck.stderr delete mode 100644 src/test/ui/union/union-deref.rs delete mode 100644 src/test/ui/union/union-deref.thirunsafeck.stderr delete mode 100644 src/test/ui/union/union-derive-clone.mirunsafeck.stderr delete mode 100644 src/test/ui/union/union-derive-clone.rs delete mode 100644 src/test/ui/union/union-derive-clone.thirunsafeck.stderr delete mode 100644 src/test/ui/union/union-derive-eq.mirunsafeck.stderr delete mode 100644 src/test/ui/union/union-derive-eq.rs delete mode 100644 src/test/ui/union/union-derive-eq.thirunsafeck.stderr delete mode 100644 src/test/ui/union/union-derive-rpass.rs delete mode 100644 src/test/ui/union/union-derive.rs delete mode 100644 src/test/ui/union/union-derive.stderr delete mode 100644 src/test/ui/union/union-drop-assign.rs delete mode 100644 src/test/ui/union/union-drop.rs delete mode 100644 src/test/ui/union/union-empty.rs delete mode 100644 src/test/ui/union/union-empty.stderr delete mode 100644 src/test/ui/union/union-fields-1.mirunsafeck.stderr delete mode 100644 src/test/ui/union/union-fields-1.rs delete mode 100644 src/test/ui/union/union-fields-1.thirunsafeck.stderr delete mode 100644 src/test/ui/union/union-fields-2.mirunsafeck.stderr delete mode 100644 src/test/ui/union/union-fields-2.rs delete mode 100644 src/test/ui/union/union-fields-2.thirunsafeck.stderr delete mode 100644 src/test/ui/union/union-generic-rpass.rs delete mode 100644 src/test/ui/union/union-generic.mirunsafeck.stderr delete mode 100644 src/test/ui/union/union-generic.rs delete mode 100644 src/test/ui/union/union-generic.thirunsafeck.stderr delete mode 100644 src/test/ui/union/union-inherent-method.rs delete mode 100644 src/test/ui/union/union-lint-dead-code.mirunsafeck.stderr delete mode 100644 src/test/ui/union/union-lint-dead-code.rs delete mode 100644 src/test/ui/union/union-lint-dead-code.thirunsafeck.stderr delete mode 100644 src/test/ui/union/union-macro.rs delete mode 100644 src/test/ui/union/union-manuallydrop-rpass.rs delete mode 100644 src/test/ui/union/union-move.mirunsafeck.stderr delete mode 100644 src/test/ui/union/union-move.rs delete mode 100644 src/test/ui/union/union-move.thirunsafeck.stderr delete mode 100644 src/test/ui/union/union-nodrop.rs delete mode 100644 src/test/ui/union/union-nonrepresentable.rs delete mode 100644 src/test/ui/union/union-nonrepresentable.stderr delete mode 100644 src/test/ui/union/union-nonzero.rs delete mode 100644 src/test/ui/union/union-overwrite.rs delete mode 100644 src/test/ui/union/union-packed.rs delete mode 100644 src/test/ui/union/union-pat-refutability.rs delete mode 100644 src/test/ui/union/union-repr-c.rs delete mode 100644 src/test/ui/union/union-repr-c.stderr delete mode 100644 src/test/ui/union/union-sized-field.rs delete mode 100644 src/test/ui/union/union-sized-field.stderr delete mode 100644 src/test/ui/union/union-suggest-field.mirunsafeck.stderr delete mode 100644 src/test/ui/union/union-suggest-field.rs delete mode 100644 src/test/ui/union/union-suggest-field.thirunsafeck.stderr delete mode 100644 src/test/ui/union/union-trait-impl.rs delete mode 100644 src/test/ui/union/union-transmute.rs delete mode 100644 src/test/ui/union/union-unsafe.mir.stderr delete mode 100644 src/test/ui/union/union-unsafe.rs delete mode 100644 src/test/ui/union/union-unsafe.thir.stderr delete mode 100644 src/test/ui/union/union-unsized.mirunsafeck.stderr delete mode 100644 src/test/ui/union/union-unsized.rs delete mode 100644 src/test/ui/union/union-unsized.thirunsafeck.stderr delete mode 100644 src/test/ui/union/union-with-drop-fields.mirunsafeck.stderr delete mode 100644 src/test/ui/union/union-with-drop-fields.rs delete mode 100644 src/test/ui/union/union-with-drop-fields.thirunsafeck.stderr (limited to 'src/test/ui/union') diff --git a/src/test/ui/union/auxiliary/union.rs b/src/test/ui/union/auxiliary/union.rs deleted file mode 100644 index e785e35ae..000000000 --- a/src/test/ui/union/auxiliary/union.rs +++ /dev/null @@ -1,4 +0,0 @@ -pub union U { - pub a: u8, - pub b: u16, -} diff --git a/src/test/ui/union/field_checks.rs b/src/test/ui/union/field_checks.rs deleted file mode 100644 index d5d1e44ac..000000000 --- a/src/test/ui/union/field_checks.rs +++ /dev/null @@ -1,65 +0,0 @@ -use std::mem::ManuallyDrop; - -union U1 { // OK - a: u8, -} - -union U2 { // OK - a: T, -} - -union U22 { // OK - a: ManuallyDrop, -} - -union U23 { // OK - a: (ManuallyDrop, i32), -} - -union U24 { // OK - a: [ManuallyDrop; 2], -} - -union U3 { - a: String, //~ ERROR unions cannot contain fields that may need dropping -} - -union U32 { // field that does not drop but is not `Copy`, either - a: std::cell::RefCell, //~ ERROR unions cannot contain fields that may need dropping -} - -union U4 { - a: T, //~ ERROR unions cannot contain fields that may need dropping -} - -union U5 { // Having a drop impl is OK - a: u8, -} - -impl Drop for U5 { - fn drop(&mut self) {} -} - -union U5Nested { // a nested union that drops is NOT OK - nest: U5, //~ ERROR unions cannot contain fields that may need dropping -} - -union U5Nested2 { // for now we don't special-case empty arrays - nest: [U5; 0], //~ ERROR unions cannot contain fields that may need dropping -} - -union U6 { // OK - s: &'static i32, - m: &'static mut i32, -} - -union U7 { // OK - f: (&'static mut i32, ManuallyDrop, i32), -} - -union U8 { // OK - f1: [(&'static mut i32, i32); 8], - f2: [ManuallyDrop; 2], -} - -fn main() {} diff --git a/src/test/ui/union/field_checks.stderr b/src/test/ui/union/field_checks.stderr deleted file mode 100644 index 1f97e97ac..000000000 --- a/src/test/ui/union/field_checks.stderr +++ /dev/null @@ -1,63 +0,0 @@ -error[E0740]: unions cannot contain fields that may need dropping - --> $DIR/field_checks.rs:24:5 - | -LL | a: String, - | ^^^^^^^^^ - | - = note: a type is guaranteed not to need dropping when it implements `Copy`, or when it is the special `ManuallyDrop<_>` type -help: when the type does not implement `Copy`, wrap it inside a `ManuallyDrop<_>` and ensure it is manually dropped - | -LL | a: std::mem::ManuallyDrop, - | +++++++++++++++++++++++ + - -error[E0740]: unions cannot contain fields that may need dropping - --> $DIR/field_checks.rs:28:5 - | -LL | a: std::cell::RefCell, - | ^^^^^^^^^^^^^^^^^^^^^^^^^^ - | - = note: a type is guaranteed not to need dropping when it implements `Copy`, or when it is the special `ManuallyDrop<_>` type -help: when the type does not implement `Copy`, wrap it inside a `ManuallyDrop<_>` and ensure it is manually dropped - | -LL | a: std::mem::ManuallyDrop>, - | +++++++++++++++++++++++ + - -error[E0740]: unions cannot contain fields that may need dropping - --> $DIR/field_checks.rs:32:5 - | -LL | a: T, - | ^^^^ - | - = note: a type is guaranteed not to need dropping when it implements `Copy`, or when it is the special `ManuallyDrop<_>` type -help: when the type does not implement `Copy`, wrap it inside a `ManuallyDrop<_>` and ensure it is manually dropped - | -LL | a: std::mem::ManuallyDrop, - | +++++++++++++++++++++++ + - -error[E0740]: unions cannot contain fields that may need dropping - --> $DIR/field_checks.rs:44:5 - | -LL | nest: U5, - | ^^^^^^^^ - | - = note: a type is guaranteed not to need dropping when it implements `Copy`, or when it is the special `ManuallyDrop<_>` type -help: when the type does not implement `Copy`, wrap it inside a `ManuallyDrop<_>` and ensure it is manually dropped - | -LL | nest: std::mem::ManuallyDrop, - | +++++++++++++++++++++++ + - -error[E0740]: unions cannot contain fields that may need dropping - --> $DIR/field_checks.rs:48:5 - | -LL | nest: [U5; 0], - | ^^^^^^^^^^^^^ - | - = note: a type is guaranteed not to need dropping when it implements `Copy`, or when it is the special `ManuallyDrop<_>` type -help: when the type does not implement `Copy`, wrap it inside a `ManuallyDrop<_>` and ensure it is manually dropped - | -LL | nest: std::mem::ManuallyDrop<[U5; 0]>, - | +++++++++++++++++++++++ + - -error: aborting due to 5 previous errors - -For more information about this error, try `rustc --explain E0740`. diff --git a/src/test/ui/union/issue-41073.rs b/src/test/ui/union/issue-41073.rs deleted file mode 100644 index 4dfdc606b..000000000 --- a/src/test/ui/union/issue-41073.rs +++ /dev/null @@ -1,22 +0,0 @@ -union Test { - a: A, //~ ERROR unions cannot contain fields that may need dropping - b: B -} - -#[derive(Debug)] -struct A(i32); -impl Drop for A { - fn drop(&mut self) { println!("A"); } -} - -#[derive(Debug)] -struct B(f32); -impl Drop for B { - fn drop(&mut self) { println!("B"); } -} - -fn main() { - let mut test = Test { a: A(3) }; - println!("{:?}", unsafe { test.b }); - unsafe { test.b = B(0.5); } -} diff --git a/src/test/ui/union/issue-41073.stderr b/src/test/ui/union/issue-41073.stderr deleted file mode 100644 index b3887fa0f..000000000 --- a/src/test/ui/union/issue-41073.stderr +++ /dev/null @@ -1,15 +0,0 @@ -error[E0740]: unions cannot contain fields that may need dropping - --> $DIR/issue-41073.rs:2:5 - | -LL | a: A, - | ^^^^ - | - = note: a type is guaranteed not to need dropping when it implements `Copy`, or when it is the special `ManuallyDrop<_>` type -help: when the type does not implement `Copy`, wrap it inside a `ManuallyDrop<_>` and ensure it is manually dropped - | -LL | a: std::mem::ManuallyDrop, - | +++++++++++++++++++++++ + - -error: aborting due to previous error - -For more information about this error, try `rustc --explain E0740`. diff --git a/src/test/ui/union/issue-81199.rs b/src/test/ui/union/issue-81199.rs deleted file mode 100644 index 628e7c6ed..000000000 --- a/src/test/ui/union/issue-81199.rs +++ /dev/null @@ -1,21 +0,0 @@ -#[repr(C)] -union PtrRepr { - const_ptr: *const T, - mut_ptr: *mut T, - components: PtrComponents, - //~^ ERROR the trait bound -} - -#[repr(C)] -struct PtrComponents { - data_address: *const (), - metadata: ::Metadata, -} - - - -pub trait Pointee { - type Metadata; -} - -fn main() {} diff --git a/src/test/ui/union/issue-81199.stderr b/src/test/ui/union/issue-81199.stderr deleted file mode 100644 index 5bb986753..000000000 --- a/src/test/ui/union/issue-81199.stderr +++ /dev/null @@ -1,19 +0,0 @@ -error[E0277]: the trait bound `T: Pointee` is not satisfied - --> $DIR/issue-81199.rs:5:17 - | -LL | components: PtrComponents, - | ^^^^^^^^^^^^^^^^ the trait `Pointee` is not implemented for `T` - | -note: required by a bound in `PtrComponents` - --> $DIR/issue-81199.rs:10:25 - | -LL | struct PtrComponents { - | ^^^^^^^ required by this bound in `PtrComponents` -help: consider further restricting this bound - | -LL | union PtrRepr { - | +++++++++ - -error: aborting due to previous error - -For more information about this error, try `rustc --explain E0277`. diff --git a/src/test/ui/union/issue-99375.rs b/src/test/ui/union/issue-99375.rs deleted file mode 100644 index 175018a7d..000000000 --- a/src/test/ui/union/issue-99375.rs +++ /dev/null @@ -1,21 +0,0 @@ -// check-pass - -union URes { - uninit: (), - init: R, -} - -struct Params { - function: F, - result: URes, -} - -unsafe extern "C" fn do_call(params: *mut Params) -where - R: Copy, - F: Fn() -> R, -{ - (*params).result.init = ((*params).function)(); -} - -fn main() {} diff --git a/src/test/ui/union/union-align.rs b/src/test/ui/union/union-align.rs deleted file mode 100644 index 6a44f27db..000000000 --- a/src/test/ui/union/union-align.rs +++ /dev/null @@ -1,65 +0,0 @@ -// run-pass -// revisions: mirunsafeck thirunsafeck -// [thirunsafeck]compile-flags: -Z thir-unsafeck - -#![allow(dead_code)] - -use std::mem::{size_of, size_of_val, align_of, align_of_val}; - -#[repr(align(16))] -pub union U16 { - a: u8, - b: u32 -} - -fn main() { - assert_eq!(align_of::(), 16); - assert_eq!(size_of::(), 16); - let u = U16 { a: 10 }; - unsafe { - assert_eq!(align_of_val(&u.a), 1); - assert_eq!(size_of_val(&u.a), 1); - assert_eq!(u.a, 10); - } - - let u = U16 { b: 11 }; - unsafe { - assert_eq!(align_of_val(&u.b), 4); - assert_eq!(size_of_val(&u.b), 4); - assert_eq!(u.b, 11); - } - - hybrid::check_hybrid(); -} - -mod hybrid { - use std::mem::{size_of, align_of}; - - #[repr(align(16))] - #[derive(Copy, Clone)] - struct S1 { - a: u16, - b: u8, - } - - #[repr(align(32))] - union U { - s: S1, - c: u16, - } - - #[repr(align(64))] - struct S2 { - d: u8, - u: U, - } - - pub fn check_hybrid() { - assert_eq!(align_of::(), 16); - assert_eq!(size_of::(), 16); - assert_eq!(align_of::(), 32); - assert_eq!(size_of::(), 32); - assert_eq!(align_of::(), 64); - assert_eq!(size_of::(), 64); - } -} diff --git a/src/test/ui/union/union-backcomp.rs b/src/test/ui/union/union-backcomp.rs deleted file mode 100644 index b19eab9f5..000000000 --- a/src/test/ui/union/union-backcomp.rs +++ /dev/null @@ -1,28 +0,0 @@ -// run-pass -// revisions: mirunsafeck thirunsafeck -// [thirunsafeck]compile-flags: -Z thir-unsafeck - -#![allow(path_statements)] -#![allow(dead_code)] - -macro_rules! union { - () => (struct S;) -} - -union!(); - -fn union() {} - -fn main() { - union(); - - let union = 10; - - union; - - union as u8; - - union U { - a: u8, - } -} diff --git a/src/test/ui/union/union-basic.rs b/src/test/ui/union/union-basic.rs deleted file mode 100644 index dcc552ac7..000000000 --- a/src/test/ui/union/union-basic.rs +++ /dev/null @@ -1,62 +0,0 @@ -// run-pass -// revisions: mirunsafeck thirunsafeck -// [thirunsafeck]compile-flags: -Z thir-unsafeck - -#![allow(unused_imports)] - -// aux-build:union.rs - -extern crate union; -use std::mem::{size_of, align_of, zeroed}; - -union U { - a: u8, - b: u16 -} - -fn local() { - assert_eq!(size_of::(), 2); - assert_eq!(align_of::(), 2); - - let u = U { a: 10 }; - unsafe { - assert_eq!(u.a, 10); - let U { a } = u; - assert_eq!(a, 10); - } - - let mut w = U { b: 0 }; - unsafe { - assert_eq!(w.a, 0); - assert_eq!(w.b, 0); - w.a = 1; - assert_eq!(w.a, 1); - assert_eq!(w.b.to_le(), 1); - } -} - -fn xcrate() { - assert_eq!(size_of::(), 2); - assert_eq!(align_of::(), 2); - - let u = union::U { a: 10 }; - unsafe { - assert_eq!(u.a, 10); - let union::U { a } = u; - assert_eq!(a, 10); - } - - let mut w = union::U { b: 0 }; - unsafe { - assert_eq!(w.a, 0); - assert_eq!(w.b, 0); - w.a = 1; - assert_eq!(w.a, 1); - assert_eq!(w.b.to_le(), 1); - } -} - -fn main() { - local(); - xcrate(); -} diff --git a/src/test/ui/union/union-borrow-move-parent-sibling.mirunsafeck.stderr b/src/test/ui/union/union-borrow-move-parent-sibling.mirunsafeck.stderr deleted file mode 100644 index ca02de4c6..000000000 --- a/src/test/ui/union/union-borrow-move-parent-sibling.mirunsafeck.stderr +++ /dev/null @@ -1,80 +0,0 @@ -error[E0502]: cannot borrow `u` (via `u.y`) as immutable because it is also borrowed as mutable (via `u.x`) - --> $DIR/union-borrow-move-parent-sibling.rs:56:13 - | -LL | let a = &mut (*u.x).0; - | --- mutable borrow occurs here (via `u.x`) -LL | let b = &u.y; - | ^^^^ immutable borrow of `u.y` -- which overlaps with `u.x` -- occurs here -LL | use_borrow(a); - | - mutable borrow later used here - | - = note: `u.y` is a field of the union `U`, so it overlaps the field `u.x` - -error[E0507]: cannot move out of dereference of `ManuallyDrop<((MockVec, MockVec), MockVec)>` - --> $DIR/union-borrow-move-parent-sibling.rs:62:13 - | -LL | let a = u.x.0; - | ^^^^^ - | | - | move occurs because value has type `(MockVec, MockVec)`, which does not implement the `Copy` trait - | help: consider borrowing here: `&u.x.0` - -error[E0382]: use of moved value: `u` - --> $DIR/union-borrow-move-parent-sibling.rs:64:13 - | -LL | let u = U { x: ManuallyDrop::new(((MockVec::new(), MockVec::new()), MockVec::new())) }; - | - move occurs because `u` has type `U`, which does not implement the `Copy` trait -LL | let a = u.x.0; -LL | let a = u.x; - | --- value moved here -LL | let b = u.y; - | ^^^ value used here after move - -error[E0502]: cannot borrow `u` (via `u.y`) as immutable because it is also borrowed as mutable (via `u.x`) - --> $DIR/union-borrow-move-parent-sibling.rs:70:13 - | -LL | let a = &mut ((*u.x).0).0; - | --- mutable borrow occurs here (via `u.x`) -LL | let b = &u.y; - | ^^^^ immutable borrow of `u.y` -- which overlaps with `u.x` -- occurs here -LL | use_borrow(a); - | - mutable borrow later used here - | - = note: `u.y` is a field of the union `U`, so it overlaps the field `u.x` - -error[E0507]: cannot move out of dereference of `ManuallyDrop<((MockVec, MockVec), MockVec)>` - --> $DIR/union-borrow-move-parent-sibling.rs:76:13 - | -LL | let a = (u.x.0).0; - | ^^^^^^^^^ - | | - | move occurs because value has type `MockVec`, which does not implement the `Copy` trait - | help: consider borrowing here: `&(u.x.0).0` - -error[E0382]: use of moved value: `u` - --> $DIR/union-borrow-move-parent-sibling.rs:78:13 - | -LL | let u = U { x: ManuallyDrop::new(((MockVec::new(), MockVec::new()), MockVec::new())) }; - | - move occurs because `u` has type `U`, which does not implement the `Copy` trait -LL | let a = (u.x.0).0; -LL | let a = u.x; - | --- value moved here -LL | let b = u.y; - | ^^^ value used here after move - -error[E0502]: cannot borrow `u` (via `u.x`) as immutable because it is also borrowed as mutable (via `u.y`) - --> $DIR/union-borrow-move-parent-sibling.rs:84:13 - | -LL | let a = &mut *u.y; - | --- mutable borrow occurs here (via `u.y`) -LL | let b = &u.x; - | ^^^^ immutable borrow of `u.x` -- which overlaps with `u.y` -- occurs here -LL | use_borrow(a); - | - mutable borrow later used here - | - = note: `u.x` is a field of the union `U`, so it overlaps the field `u.y` - -error: aborting due to 7 previous errors - -Some errors have detailed explanations: E0382, E0502, E0507. -For more information about an error, try `rustc --explain E0382`. 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 { - value: [T; 1], -} - -impl MockBox { - fn new(value: T) -> Self { MockBox { value: [value] } } -} - -impl Deref for MockBox { - type Target = T; - fn deref(&self) -> &T { &self.value[0] } -} - -impl DerefMut for MockBox { - fn deref_mut(&mut self) -> &mut T { &mut self.value[0] } -} - -#[derive(Default)] -struct MockVec { - value: [T; 0], -} - -impl MockVec { - fn new() -> Self { MockVec { value: [] } } -} - -impl Deref for MockVec { - type Target = [T]; - fn deref(&self) -> &[T] { &self.value } -} - -impl DerefMut for MockVec { - fn deref_mut(&mut self) -> &mut [T] { &mut self.value } -} - - -union U { - x: ManuallyDrop<((MockVec, MockVec), MockVec)>, - y: ManuallyDrop>>, -} - -fn use_borrow(_: &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() {} diff --git a/src/test/ui/union/union-borrow-move-parent-sibling.thirunsafeck.stderr b/src/test/ui/union/union-borrow-move-parent-sibling.thirunsafeck.stderr deleted file mode 100644 index ca02de4c6..000000000 --- a/src/test/ui/union/union-borrow-move-parent-sibling.thirunsafeck.stderr +++ /dev/null @@ -1,80 +0,0 @@ -error[E0502]: cannot borrow `u` (via `u.y`) as immutable because it is also borrowed as mutable (via `u.x`) - --> $DIR/union-borrow-move-parent-sibling.rs:56:13 - | -LL | let a = &mut (*u.x).0; - | --- mutable borrow occurs here (via `u.x`) -LL | let b = &u.y; - | ^^^^ immutable borrow of `u.y` -- which overlaps with `u.x` -- occurs here -LL | use_borrow(a); - | - mutable borrow later used here - | - = note: `u.y` is a field of the union `U`, so it overlaps the field `u.x` - -error[E0507]: cannot move out of dereference of `ManuallyDrop<((MockVec, MockVec), MockVec)>` - --> $DIR/union-borrow-move-parent-sibling.rs:62:13 - | -LL | let a = u.x.0; - | ^^^^^ - | | - | move occurs because value has type `(MockVec, MockVec)`, which does not implement the `Copy` trait - | help: consider borrowing here: `&u.x.0` - -error[E0382]: use of moved value: `u` - --> $DIR/union-borrow-move-parent-sibling.rs:64:13 - | -LL | let u = U { x: ManuallyDrop::new(((MockVec::new(), MockVec::new()), MockVec::new())) }; - | - move occurs because `u` has type `U`, which does not implement the `Copy` trait -LL | let a = u.x.0; -LL | let a = u.x; - | --- value moved here -LL | let b = u.y; - | ^^^ value used here after move - -error[E0502]: cannot borrow `u` (via `u.y`) as immutable because it is also borrowed as mutable (via `u.x`) - --> $DIR/union-borrow-move-parent-sibling.rs:70:13 - | -LL | let a = &mut ((*u.x).0).0; - | --- mutable borrow occurs here (via `u.x`) -LL | let b = &u.y; - | ^^^^ immutable borrow of `u.y` -- which overlaps with `u.x` -- occurs here -LL | use_borrow(a); - | - mutable borrow later used here - | - = note: `u.y` is a field of the union `U`, so it overlaps the field `u.x` - -error[E0507]: cannot move out of dereference of `ManuallyDrop<((MockVec, MockVec), MockVec)>` - --> $DIR/union-borrow-move-parent-sibling.rs:76:13 - | -LL | let a = (u.x.0).0; - | ^^^^^^^^^ - | | - | move occurs because value has type `MockVec`, which does not implement the `Copy` trait - | help: consider borrowing here: `&(u.x.0).0` - -error[E0382]: use of moved value: `u` - --> $DIR/union-borrow-move-parent-sibling.rs:78:13 - | -LL | let u = U { x: ManuallyDrop::new(((MockVec::new(), MockVec::new()), MockVec::new())) }; - | - move occurs because `u` has type `U`, which does not implement the `Copy` trait -LL | let a = (u.x.0).0; -LL | let a = u.x; - | --- value moved here -LL | let b = u.y; - | ^^^ value used here after move - -error[E0502]: cannot borrow `u` (via `u.x`) as immutable because it is also borrowed as mutable (via `u.y`) - --> $DIR/union-borrow-move-parent-sibling.rs:84:13 - | -LL | let a = &mut *u.y; - | --- mutable borrow occurs here (via `u.y`) -LL | let b = &u.x; - | ^^^^ immutable borrow of `u.x` -- which overlaps with `u.y` -- occurs here -LL | use_borrow(a); - | - mutable borrow later used here - | - = note: `u.x` is a field of the union `U`, so it overlaps the field `u.y` - -error: aborting due to 7 previous errors - -Some errors have detailed explanations: E0382, E0502, E0507. -For more information about an error, try `rustc --explain E0382`. diff --git a/src/test/ui/union/union-const-codegen.rs b/src/test/ui/union/union-const-codegen.rs deleted file mode 100644 index 32a546cf3..000000000 --- a/src/test/ui/union/union-const-codegen.rs +++ /dev/null @@ -1,19 +0,0 @@ -// run-pass -// revisions: mirunsafeck thirunsafeck -// [thirunsafeck]compile-flags: -Z thir-unsafeck - -union U { - a: u64, - b: u64, -} - -const C: U = U { b: 10 }; - -fn main() { - unsafe { - let a = C.a; - let b = C.b; - assert_eq!(a, 10); - assert_eq!(b, 10); - } -} diff --git a/src/test/ui/union/union-const-eval-field.rs b/src/test/ui/union/union-const-eval-field.rs deleted file mode 100644 index ca48785cd..000000000 --- a/src/test/ui/union/union-const-eval-field.rs +++ /dev/null @@ -1,45 +0,0 @@ -// run-pass -// revisions: mirunsafeck thirunsafeck -// [thirunsafeck]compile-flags: -Z thir-unsafeck - -type Field1 = (i32, u32); -type Field2 = f32; -type Field3 = i64; - -union DummyUnion { - field1: Field1, - field2: Field2, - field3: Field3, -} - -const FLOAT1_AS_I32: i32 = 1065353216; -const UNION: DummyUnion = DummyUnion { field1: (FLOAT1_AS_I32, 0) }; - -const fn read_field1() -> Field1 { - const FIELD1: Field1 = unsafe { UNION.field1 }; - FIELD1 -} - -const fn read_field2() -> Field2 { - const FIELD2: Field2 = unsafe { UNION.field2 }; - FIELD2 -} - -const fn read_field3() -> Field3 { - const FIELD3: Field3 = unsafe { UNION.field3 }; - FIELD3 -} - -fn main() { - let foo = FLOAT1_AS_I32; - assert_eq!(read_field1().0, foo); - assert_eq!(read_field1().0, FLOAT1_AS_I32); - - let foo = 1.0; - assert_eq!(read_field2(), foo); - assert_eq!(read_field2(), 1.0); - - assert_eq!(read_field3(), unsafe { UNION.field3 }); - let foo = unsafe { UNION.field3 }; - assert_eq!(read_field3(), foo); -} diff --git a/src/test/ui/union/union-const-eval.rs b/src/test/ui/union/union-const-eval.rs deleted file mode 100644 index 32ee4a739..000000000 --- a/src/test/ui/union/union-const-eval.rs +++ /dev/null @@ -1,15 +0,0 @@ -// check-pass -// revisions: mirunsafeck thirunsafeck -// [thirunsafeck]compile-flags: -Z thir-unsafeck - -union U { - a: usize, - b: usize, -} - -const C: U = U { a: 10 }; - -fn main() { - let a: [u8; unsafe { C.a }]; - let b: [u8; unsafe { C.b }]; -} diff --git a/src/test/ui/union/union-const-pat.rs b/src/test/ui/union/union-const-pat.rs deleted file mode 100644 index e7cb248a2..000000000 --- a/src/test/ui/union/union-const-pat.rs +++ /dev/null @@ -1,13 +0,0 @@ -union U { - a: usize, - b: usize, -} - -const C: U = U { a: 10 }; - -fn main() { - match C { - C => {} //~ ERROR cannot use unions in constant patterns - _ => {} - } -} diff --git a/src/test/ui/union/union-const-pat.stderr b/src/test/ui/union/union-const-pat.stderr deleted file mode 100644 index dc87f4de5..000000000 --- a/src/test/ui/union/union-const-pat.stderr +++ /dev/null @@ -1,8 +0,0 @@ -error: cannot use unions in constant patterns - --> $DIR/union-const-pat.rs:10:9 - | -LL | C => {} - | ^ - -error: aborting due to previous error - diff --git a/src/test/ui/union/union-copy.rs b/src/test/ui/union/union-copy.rs deleted file mode 100644 index 5c3f8d908..000000000 --- a/src/test/ui/union/union-copy.rs +++ /dev/null @@ -1,14 +0,0 @@ -#[derive(Clone)] -union U { - a: u8 -} - -#[derive(Clone)] -union W { - a: std::mem::ManuallyDrop -} - -impl Copy for U {} // OK -impl Copy for W {} //~ ERROR the trait `Copy` may not be implemented for this type - -fn main() {} diff --git a/src/test/ui/union/union-copy.stderr b/src/test/ui/union/union-copy.stderr deleted file mode 100644 index 53ee4dd2e..000000000 --- a/src/test/ui/union/union-copy.stderr +++ /dev/null @@ -1,18 +0,0 @@ -error[E0204]: the trait `Copy` may not be implemented for this type - --> $DIR/union-copy.rs:12:15 - | -LL | a: std::mem::ManuallyDrop - | --------------------------------- this field does not implement `Copy` -... -LL | impl Copy for W {} - | ^ - | -note: the `Copy` impl for `ManuallyDrop` requires that `String: Copy` - --> $DIR/union-copy.rs:8:8 - | -LL | a: std::mem::ManuallyDrop - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -error: aborting due to previous error - -For more information about this error, try `rustc --explain E0204`. diff --git a/src/test/ui/union/union-deref.mirunsafeck.stderr b/src/test/ui/union/union-deref.mirunsafeck.stderr deleted file mode 100644 index be5e60ab8..000000000 --- a/src/test/ui/union/union-deref.mirunsafeck.stderr +++ /dev/null @@ -1,56 +0,0 @@ -error: not automatically applying `DerefMut` on `ManuallyDrop` union field - --> $DIR/union-deref.rs:16:14 - | -LL | unsafe { u.f.0 = Vec::new() }; - | ^^^ - | - = help: writing to this reference calls the destructor for the old value - = help: add an explicit `*` if that is desired, or call `ptr::write` to not run the destructor - -error: not automatically applying `DerefMut` on `ManuallyDrop` union field - --> $DIR/union-deref.rs:18:19 - | -LL | unsafe { &mut u.f.0 }; - | ^^^ - | - = help: writing to this reference calls the destructor for the old value - = help: add an explicit `*` if that is desired, or call `ptr::write` to not run the destructor - -error: not automatically applying `DerefMut` on `ManuallyDrop` union field - --> $DIR/union-deref.rs:20:14 - | -LL | unsafe { u.f.0.push(0) }; - | ^^^ - | - = help: writing to this reference calls the destructor for the old value - = help: add an explicit `*` if that is desired, or call `ptr::write` to not run the destructor - -error: not automatically applying `DerefMut` on `ManuallyDrop` union field - --> $DIR/union-deref.rs:24:14 - | -LL | unsafe { u.f.0.0 = Vec::new() }; - | ^^^^^ - | - = help: writing to this reference calls the destructor for the old value - = help: add an explicit `*` if that is desired, or call `ptr::write` to not run the destructor - -error: not automatically applying `DerefMut` on `ManuallyDrop` union field - --> $DIR/union-deref.rs:26:19 - | -LL | unsafe { &mut u.f.0.0 }; - | ^^^^^ - | - = help: writing to this reference calls the destructor for the old value - = help: add an explicit `*` if that is desired, or call `ptr::write` to not run the destructor - -error: not automatically applying `DerefMut` on `ManuallyDrop` union field - --> $DIR/union-deref.rs:28:14 - | -LL | unsafe { u.f.0.0.push(0) }; - | ^^^^^ - | - = help: writing to this reference calls the destructor for the old value - = help: add an explicit `*` if that is desired, or call `ptr::write` to not run the destructor - -error: aborting due to 6 previous errors - diff --git a/src/test/ui/union/union-deref.rs b/src/test/ui/union/union-deref.rs deleted file mode 100644 index 5aa28d93f..000000000 --- a/src/test/ui/union/union-deref.rs +++ /dev/null @@ -1,29 +0,0 @@ -// revisions: mirunsafeck thirunsafeck -// [thirunsafeck]compile-flags: -Z thir-unsafeck - -//! Test the part of RFC 2514 that is about not applying `DerefMut` coercions -//! of union fields. - -use std::mem::ManuallyDrop; - -union U1 { x:(), f: ManuallyDrop<(T,)> } - -union U2 { x:(), f: (ManuallyDrop<(T,)>,) } - -fn main() { - let mut u : U1> = U1 { x: () }; - unsafe { (*u.f).0 = Vec::new() }; // explicit deref, this compiles - unsafe { u.f.0 = Vec::new() }; //~ERROR not automatically applying `DerefMut` on `ManuallyDrop` union field - unsafe { &mut (*u.f).0 }; // explicit deref, this compiles - unsafe { &mut u.f.0 }; //~ERROR not automatically applying `DerefMut` on `ManuallyDrop` union field - unsafe { (*u.f).0.push(0) }; // explicit deref, this compiles - unsafe { u.f.0.push(0) }; //~ERROR not automatically applying `DerefMut` on `ManuallyDrop` union field - - let mut u : U2> = U2 { x: () }; - unsafe { (*u.f.0).0 = Vec::new() }; // explicit deref, this compiles - unsafe { u.f.0.0 = Vec::new() }; //~ERROR not automatically applying `DerefMut` on `ManuallyDrop` union field - unsafe { &mut (*u.f.0).0 }; // explicit deref, this compiles - unsafe { &mut u.f.0.0 }; //~ERROR not automatically applying `DerefMut` on `ManuallyDrop` union field - unsafe { (*u.f.0).0.push(0) }; // explicit deref, this compiles - unsafe { u.f.0.0.push(0) }; //~ERROR not automatically applying `DerefMut` on `ManuallyDrop` union field -} diff --git a/src/test/ui/union/union-deref.thirunsafeck.stderr b/src/test/ui/union/union-deref.thirunsafeck.stderr deleted file mode 100644 index be5e60ab8..000000000 --- a/src/test/ui/union/union-deref.thirunsafeck.stderr +++ /dev/null @@ -1,56 +0,0 @@ -error: not automatically applying `DerefMut` on `ManuallyDrop` union field - --> $DIR/union-deref.rs:16:14 - | -LL | unsafe { u.f.0 = Vec::new() }; - | ^^^ - | - = help: writing to this reference calls the destructor for the old value - = help: add an explicit `*` if that is desired, or call `ptr::write` to not run the destructor - -error: not automatically applying `DerefMut` on `ManuallyDrop` union field - --> $DIR/union-deref.rs:18:19 - | -LL | unsafe { &mut u.f.0 }; - | ^^^ - | - = help: writing to this reference calls the destructor for the old value - = help: add an explicit `*` if that is desired, or call `ptr::write` to not run the destructor - -error: not automatically applying `DerefMut` on `ManuallyDrop` union field - --> $DIR/union-deref.rs:20:14 - | -LL | unsafe { u.f.0.push(0) }; - | ^^^ - | - = help: writing to this reference calls the destructor for the old value - = help: add an explicit `*` if that is desired, or call `ptr::write` to not run the destructor - -error: not automatically applying `DerefMut` on `ManuallyDrop` union field - --> $DIR/union-deref.rs:24:14 - | -LL | unsafe { u.f.0.0 = Vec::new() }; - | ^^^^^ - | - = help: writing to this reference calls the destructor for the old value - = help: add an explicit `*` if that is desired, or call `ptr::write` to not run the destructor - -error: not automatically applying `DerefMut` on `ManuallyDrop` union field - --> $DIR/union-deref.rs:26:19 - | -LL | unsafe { &mut u.f.0.0 }; - | ^^^^^ - | - = help: writing to this reference calls the destructor for the old value - = help: add an explicit `*` if that is desired, or call `ptr::write` to not run the destructor - -error: not automatically applying `DerefMut` on `ManuallyDrop` union field - --> $DIR/union-deref.rs:28:14 - | -LL | unsafe { u.f.0.0.push(0) }; - | ^^^^^ - | - = help: writing to this reference calls the destructor for the old value - = help: add an explicit `*` if that is desired, or call `ptr::write` to not run the destructor - -error: aborting due to 6 previous errors - diff --git a/src/test/ui/union/union-derive-clone.mirunsafeck.stderr b/src/test/ui/union/union-derive-clone.mirunsafeck.stderr deleted file mode 100644 index 148fb5046..000000000 --- a/src/test/ui/union/union-derive-clone.mirunsafeck.stderr +++ /dev/null @@ -1,49 +0,0 @@ -error[E0277]: the trait bound `U1: Copy` is not satisfied - --> $DIR/union-derive-clone.rs:6:10 - | -LL | #[derive(Clone)] - | ^^^^^ the trait `Copy` is not implemented for `U1` - | -note: required by a bound in `AssertParamIsCopy` - --> $SRC_DIR/core/src/clone.rs:LL:COL - | -LL | pub struct AssertParamIsCopy { - | ^^^^ required by this bound in `AssertParamIsCopy` - = note: this error originates in the derive macro `Clone` (in Nightly builds, run with -Z macro-backtrace for more info) -help: consider annotating `U1` with `#[derive(Copy)]` - | -LL | #[derive(Copy)] - | - -error[E0599]: the method `clone` exists for union `U5`, but its trait bounds were not satisfied - --> $DIR/union-derive-clone.rs:38:15 - | -LL | union U5 { - | ----------- - | | - | method `clone` not found for this union - | doesn't satisfy `U5: Clone` -... -LL | struct CloneNoCopy; - | ------------------ doesn't satisfy `CloneNoCopy: Copy` -... -LL | let w = u.clone(); - | ^^^^^ method cannot be called on `U5` due to unsatisfied trait bounds - | -note: trait bound `CloneNoCopy: Copy` was not satisfied - --> $DIR/union-derive-clone.rs:28:10 - | -LL | #[derive(Clone, Copy)] - | ^^^^^ unsatisfied trait bound introduced in this `derive` macro - = note: the following trait bounds were not satisfied: - `CloneNoCopy: Copy` - which is required by `U5: Clone` -help: consider annotating `CloneNoCopy` with `#[derive(Clone, Copy)]` - | -LL | #[derive(Clone, Copy)] - | - -error: aborting due to 2 previous errors - -Some errors have detailed explanations: E0277, E0599. -For more information about an error, try `rustc --explain E0277`. diff --git a/src/test/ui/union/union-derive-clone.rs b/src/test/ui/union/union-derive-clone.rs deleted file mode 100644 index 7aa62146e..000000000 --- a/src/test/ui/union/union-derive-clone.rs +++ /dev/null @@ -1,39 +0,0 @@ -// revisions: mirunsafeck thirunsafeck -// [thirunsafeck]compile-flags: -Z thir-unsafeck - -use std::mem::ManuallyDrop; - -#[derive(Clone)] //~ ERROR the trait bound `U1: Copy` is not satisfied -union U1 { - a: u8, -} - -#[derive(Clone)] -union U2 { - a: u8, // OK -} - -impl Copy for U2 {} - -#[derive(Clone, Copy)] -union U3 { - a: u8, // OK -} - -#[derive(Clone, Copy)] -union U4 { - a: T, // OK -} - -#[derive(Clone, Copy)] -union U5 { - a: ManuallyDrop, // OK -} - -#[derive(Clone)] -struct CloneNoCopy; - -fn main() { - let u = U5 { a: ManuallyDrop::new(CloneNoCopy) }; - let w = u.clone(); //~ ERROR the method -} diff --git a/src/test/ui/union/union-derive-clone.thirunsafeck.stderr b/src/test/ui/union/union-derive-clone.thirunsafeck.stderr deleted file mode 100644 index 148fb5046..000000000 --- a/src/test/ui/union/union-derive-clone.thirunsafeck.stderr +++ /dev/null @@ -1,49 +0,0 @@ -error[E0277]: the trait bound `U1: Copy` is not satisfied - --> $DIR/union-derive-clone.rs:6:10 - | -LL | #[derive(Clone)] - | ^^^^^ the trait `Copy` is not implemented for `U1` - | -note: required by a bound in `AssertParamIsCopy` - --> $SRC_DIR/core/src/clone.rs:LL:COL - | -LL | pub struct AssertParamIsCopy { - | ^^^^ required by this bound in `AssertParamIsCopy` - = note: this error originates in the derive macro `Clone` (in Nightly builds, run with -Z macro-backtrace for more info) -help: consider annotating `U1` with `#[derive(Copy)]` - | -LL | #[derive(Copy)] - | - -error[E0599]: the method `clone` exists for union `U5`, but its trait bounds were not satisfied - --> $DIR/union-derive-clone.rs:38:15 - | -LL | union U5 { - | ----------- - | | - | method `clone` not found for this union - | doesn't satisfy `U5: Clone` -... -LL | struct CloneNoCopy; - | ------------------ doesn't satisfy `CloneNoCopy: Copy` -... -LL | let w = u.clone(); - | ^^^^^ method cannot be called on `U5` due to unsatisfied trait bounds - | -note: trait bound `CloneNoCopy: Copy` was not satisfied - --> $DIR/union-derive-clone.rs:28:10 - | -LL | #[derive(Clone, Copy)] - | ^^^^^ unsatisfied trait bound introduced in this `derive` macro - = note: the following trait bounds were not satisfied: - `CloneNoCopy: Copy` - which is required by `U5: Clone` -help: consider annotating `CloneNoCopy` with `#[derive(Clone, Copy)]` - | -LL | #[derive(Clone, Copy)] - | - -error: aborting due to 2 previous errors - -Some errors have detailed explanations: E0277, E0599. -For more information about an error, try `rustc --explain E0277`. diff --git a/src/test/ui/union/union-derive-eq.mirunsafeck.stderr b/src/test/ui/union/union-derive-eq.mirunsafeck.stderr deleted file mode 100644 index 99505f316..000000000 --- a/src/test/ui/union/union-derive-eq.mirunsafeck.stderr +++ /dev/null @@ -1,23 +0,0 @@ -error[E0277]: the trait bound `PartialEqNotEq: Eq` is not satisfied - --> $DIR/union-derive-eq.rs:16:5 - | -LL | #[derive(Eq)] - | -- in this derive macro expansion -LL | union U2 { -LL | a: PartialEqNotEq, - | ^^^^^^^^^^^^^^^^^ the trait `Eq` is not implemented for `PartialEqNotEq` - | -note: required by a bound in `AssertParamIsEq` - --> $SRC_DIR/core/src/cmp.rs:LL:COL - | -LL | pub struct AssertParamIsEq { - | ^^ required by this bound in `AssertParamIsEq` - = note: this error originates in the derive macro `Eq` (in Nightly builds, run with -Z macro-backtrace for more info) -help: consider annotating `PartialEqNotEq` with `#[derive(Eq)]` - | -LL | #[derive(Eq)] - | - -error: aborting due to previous error - -For more information about this error, try `rustc --explain E0277`. diff --git a/src/test/ui/union/union-derive-eq.rs b/src/test/ui/union/union-derive-eq.rs deleted file mode 100644 index b7e7f343f..000000000 --- a/src/test/ui/union/union-derive-eq.rs +++ /dev/null @@ -1,21 +0,0 @@ -// revisions: mirunsafeck thirunsafeck -// [thirunsafeck]compile-flags: -Z thir-unsafeck - -#[derive(Eq)] // OK -union U1 { - a: u8, -} - -impl PartialEq for U1 { fn eq(&self, rhs: &Self) -> bool { true } } - -#[derive(PartialEq, Copy, Clone)] -struct PartialEqNotEq; - -#[derive(Eq)] -union U2 { - a: PartialEqNotEq, //~ ERROR the trait bound `PartialEqNotEq: Eq` is not satisfied -} - -impl PartialEq for U2 { fn eq(&self, rhs: &Self) -> bool { true } } - -fn main() {} diff --git a/src/test/ui/union/union-derive-eq.thirunsafeck.stderr b/src/test/ui/union/union-derive-eq.thirunsafeck.stderr deleted file mode 100644 index 99505f316..000000000 --- a/src/test/ui/union/union-derive-eq.thirunsafeck.stderr +++ /dev/null @@ -1,23 +0,0 @@ -error[E0277]: the trait bound `PartialEqNotEq: Eq` is not satisfied - --> $DIR/union-derive-eq.rs:16:5 - | -LL | #[derive(Eq)] - | -- in this derive macro expansion -LL | union U2 { -LL | a: PartialEqNotEq, - | ^^^^^^^^^^^^^^^^^ the trait `Eq` is not implemented for `PartialEqNotEq` - | -note: required by a bound in `AssertParamIsEq` - --> $SRC_DIR/core/src/cmp.rs:LL:COL - | -LL | pub struct AssertParamIsEq { - | ^^ required by this bound in `AssertParamIsEq` - = note: this error originates in the derive macro `Eq` (in Nightly builds, run with -Z macro-backtrace for more info) -help: consider annotating `PartialEqNotEq` with `#[derive(Eq)]` - | -LL | #[derive(Eq)] - | - -error: aborting due to previous error - -For more information about this error, try `rustc --explain E0277`. diff --git a/src/test/ui/union/union-derive-rpass.rs b/src/test/ui/union/union-derive-rpass.rs deleted file mode 100644 index 8276bc635..000000000 --- a/src/test/ui/union/union-derive-rpass.rs +++ /dev/null @@ -1,42 +0,0 @@ -// run-pass -// revisions: mirunsafeck thirunsafeck -// [thirunsafeck]compile-flags: -Z thir-unsafeck - -#![allow(dead_code)] -#![allow(unused_variables)] - -// Some traits can be derived for unions. - -#[derive( - Copy, - Clone, - Eq, -)] -union U { - a: u8, - b: u16, -} - -impl PartialEq for U { fn eq(&self, rhs: &Self) -> bool { true } } - -#[derive( - Clone, - Copy, - Eq -)] -union W { - a: T, -} - -impl PartialEq for W { fn eq(&self, rhs: &Self) -> bool { true } } - -fn main() { - let u = U { b: 0 }; - let u1 = u; - let u2 = u.clone(); - assert!(u1 == u2); - - let w = W { a: 0 }; - let w1 = w.clone(); - assert!(w == w1); -} diff --git a/src/test/ui/union/union-derive.rs b/src/test/ui/union/union-derive.rs deleted file mode 100644 index 652a6b24c..000000000 --- a/src/test/ui/union/union-derive.rs +++ /dev/null @@ -1,16 +0,0 @@ -// Most traits cannot be derived for unions. - -#[derive( - PartialEq, //~ ERROR this trait cannot be derived for unions - PartialOrd, //~ ERROR this trait cannot be derived for unions - Ord, //~ ERROR this trait cannot be derived for unions - Hash, //~ ERROR this trait cannot be derived for unions - Default, //~ ERROR this trait cannot be derived for unions - Debug, //~ ERROR this trait cannot be derived for unions -)] -union U { - a: u8, - b: u16, -} - -fn main() {} diff --git a/src/test/ui/union/union-derive.stderr b/src/test/ui/union/union-derive.stderr deleted file mode 100644 index 6ef72c901..000000000 --- a/src/test/ui/union/union-derive.stderr +++ /dev/null @@ -1,38 +0,0 @@ -error: this trait cannot be derived for unions - --> $DIR/union-derive.rs:4:5 - | -LL | PartialEq, - | ^^^^^^^^^ - -error: this trait cannot be derived for unions - --> $DIR/union-derive.rs:5:5 - | -LL | PartialOrd, - | ^^^^^^^^^^ - -error: this trait cannot be derived for unions - --> $DIR/union-derive.rs:6:5 - | -LL | Ord, - | ^^^ - -error: this trait cannot be derived for unions - --> $DIR/union-derive.rs:7:5 - | -LL | Hash, - | ^^^^ - -error: this trait cannot be derived for unions - --> $DIR/union-derive.rs:8:5 - | -LL | Default, - | ^^^^^^^ - -error: this trait cannot be derived for unions - --> $DIR/union-derive.rs:9:5 - | -LL | Debug, - | ^^^^^ - -error: aborting due to 6 previous errors - diff --git a/src/test/ui/union/union-drop-assign.rs b/src/test/ui/union/union-drop-assign.rs deleted file mode 100644 index 215666bdd..000000000 --- a/src/test/ui/union/union-drop-assign.rs +++ /dev/null @@ -1,37 +0,0 @@ -// run-pass -#![allow(unused_assignments)] - -// Drop works for union itself. - -use std::mem::ManuallyDrop; - -struct S; - -union U { - a: ManuallyDrop -} - -impl Drop for S { - fn drop(&mut self) { - unsafe { CHECK += 10; } - } -} - -impl Drop for U { - fn drop(&mut self) { - unsafe { CHECK += 1; } - } -} - -static mut CHECK: u8 = 0; - -fn main() { - unsafe { - let mut u = U { a: ManuallyDrop::new(S) }; - assert_eq!(CHECK, 0); - u = U { a: ManuallyDrop::new(S) }; - assert_eq!(CHECK, 1); // union itself is assigned, union is dropped, field is not dropped - *u.a = S; - assert_eq!(CHECK, 11); // union field is assigned, field is dropped - } -} diff --git a/src/test/ui/union/union-drop.rs b/src/test/ui/union/union-drop.rs deleted file mode 100644 index c3d7d41ca..000000000 --- a/src/test/ui/union/union-drop.rs +++ /dev/null @@ -1,60 +0,0 @@ -// run-pass -// revisions: mirunsafeck thirunsafeck -// [thirunsafeck]compile-flags: -Z thir-unsafeck - -#![allow(dead_code)] -#![allow(unused_variables)] - -// Drop works for union itself. - -#[derive(Copy, Clone)] -struct S; - -union U { - a: u8 -} - -union W { - a: S, -} - -union Y { - a: S, -} - -impl Drop for U { - fn drop(&mut self) { - unsafe { CHECK += 1; } - } -} - -impl Drop for W { - fn drop(&mut self) { - unsafe { CHECK += 1; } - } -} - -static mut CHECK: u8 = 0; - -fn main() { - unsafe { - assert_eq!(CHECK, 0); - { - let u = U { a: 1 }; - } - assert_eq!(CHECK, 1); // 1, dtor of U is called - { - let w = W { a: S }; - } - assert_eq!(CHECK, 2); // 2, dtor of W is called - { - let y = Y { a: S }; - } - assert_eq!(CHECK, 2); // 2, Y has no dtor - { - let u2 = U { a: 1 }; - std::mem::forget(u2); - } - assert_eq!(CHECK, 2); // 2, dtor of U *not* called for u2 - } -} diff --git a/src/test/ui/union/union-empty.rs b/src/test/ui/union/union-empty.rs deleted file mode 100644 index 79b7e68ee..000000000 --- a/src/test/ui/union/union-empty.rs +++ /dev/null @@ -1,3 +0,0 @@ -union U {} //~ ERROR unions cannot have zero fields - -fn main() {} diff --git a/src/test/ui/union/union-empty.stderr b/src/test/ui/union/union-empty.stderr deleted file mode 100644 index a80b27e6e..000000000 --- a/src/test/ui/union/union-empty.stderr +++ /dev/null @@ -1,8 +0,0 @@ -error: unions cannot have zero fields - --> $DIR/union-empty.rs:1:1 - | -LL | union U {} - | ^^^^^^^^^^ - -error: aborting due to previous error - diff --git a/src/test/ui/union/union-fields-1.mirunsafeck.stderr b/src/test/ui/union/union-fields-1.mirunsafeck.stderr deleted file mode 100644 index 0c9981c69..000000000 --- a/src/test/ui/union/union-fields-1.mirunsafeck.stderr +++ /dev/null @@ -1,42 +0,0 @@ -error: field `c` is never read - --> $DIR/union-fields-1.rs:9:5 - | -LL | union U1 { - | -- field in this union -... -LL | c: u8, - | ^ - | -note: the lint level is defined here - --> $DIR/union-fields-1.rs:4:9 - | -LL | #![deny(dead_code)] - | ^^^^^^^^^ - -error: field `a` is never read - --> $DIR/union-fields-1.rs:12:5 - | -LL | union U2 { - | -- field in this union -LL | a: u8, - | ^ - -error: field `a` is never read - --> $DIR/union-fields-1.rs:16:20 - | -LL | union NoDropLike { a: u8 } - | ---------- ^ - | | - | field in this union - -error: field `c` is never read - --> $DIR/union-fields-1.rs:21:5 - | -LL | union U { - | - field in this union -... -LL | c: u8, - | ^ - -error: aborting due to 4 previous errors - diff --git a/src/test/ui/union/union-fields-1.rs b/src/test/ui/union/union-fields-1.rs deleted file mode 100644 index cf2ef4c03..000000000 --- a/src/test/ui/union/union-fields-1.rs +++ /dev/null @@ -1,35 +0,0 @@ -// revisions: mirunsafeck thirunsafeck -// [thirunsafeck]compile-flags: -Z thir-unsafeck - -#![deny(dead_code)] - -union U1 { - a: u8, // should not be reported - b: u8, // should not be reported - c: u8, //~ ERROR field `c` is never read -} -union U2 { - a: u8, //~ ERROR field `a` is never read - b: u8, // should not be reported - c: u8, // should not be reported -} -union NoDropLike { a: u8 } //~ ERROR field `a` is never read - -union U { - a: u8, // should not be reported - b: u8, // should not be reported - c: u8, //~ ERROR field `c` is never read -} -type A = U; - -fn main() { - let u = U1 { a: 0 }; - let _a = unsafe { u.b }; - - let u = U2 { c: 0 }; - let _b = unsafe { u.b }; - - let _u = NoDropLike { a: 10 }; - let u = A { a: 0 }; - let _b = unsafe { u.b }; -} diff --git a/src/test/ui/union/union-fields-1.thirunsafeck.stderr b/src/test/ui/union/union-fields-1.thirunsafeck.stderr deleted file mode 100644 index 0c9981c69..000000000 --- a/src/test/ui/union/union-fields-1.thirunsafeck.stderr +++ /dev/null @@ -1,42 +0,0 @@ -error: field `c` is never read - --> $DIR/union-fields-1.rs:9:5 - | -LL | union U1 { - | -- field in this union -... -LL | c: u8, - | ^ - | -note: the lint level is defined here - --> $DIR/union-fields-1.rs:4:9 - | -LL | #![deny(dead_code)] - | ^^^^^^^^^ - -error: field `a` is never read - --> $DIR/union-fields-1.rs:12:5 - | -LL | union U2 { - | -- field in this union -LL | a: u8, - | ^ - -error: field `a` is never read - --> $DIR/union-fields-1.rs:16:20 - | -LL | union NoDropLike { a: u8 } - | ---------- ^ - | | - | field in this union - -error: field `c` is never read - --> $DIR/union-fields-1.rs:21:5 - | -LL | union U { - | - field in this union -... -LL | c: u8, - | ^ - -error: aborting due to 4 previous errors - diff --git a/src/test/ui/union/union-fields-2.mirunsafeck.stderr b/src/test/ui/union/union-fields-2.mirunsafeck.stderr deleted file mode 100644 index 90ad16402..000000000 --- a/src/test/ui/union/union-fields-2.mirunsafeck.stderr +++ /dev/null @@ -1,84 +0,0 @@ -error[E0784]: union expressions should have exactly one field - --> $DIR/union-fields-2.rs:10:13 - | -LL | let u = U {}; - | ^ - -error[E0784]: union expressions should have exactly one field - --> $DIR/union-fields-2.rs:12:13 - | -LL | let u = U { a: 0, b: 1 }; - | ^ - -error[E0560]: union `U` has no field named `c` - --> $DIR/union-fields-2.rs:13:29 - | -LL | let u = U { a: 0, b: 1, c: 2 }; - | ^ `U` does not have this field - | - = note: available fields are: `a`, `b` - -error[E0784]: union expressions should have exactly one field - --> $DIR/union-fields-2.rs:13:13 - | -LL | let u = U { a: 0, b: 1, c: 2 }; - | ^ - -error[E0784]: union expressions should have exactly one field - --> $DIR/union-fields-2.rs:15:13 - | -LL | let u = U { ..u }; - | ^ - -error[E0436]: functional record update syntax requires a struct - --> $DIR/union-fields-2.rs:15:19 - | -LL | let u = U { ..u }; - | ^ - -error: union patterns should have exactly one field - --> $DIR/union-fields-2.rs:18:9 - | -LL | let U {} = u; - | ^^^^ - -error: union patterns should have exactly one field - --> $DIR/union-fields-2.rs:20:9 - | -LL | let U { a, b } = u; - | ^^^^^^^^^^ - -error: union patterns should have exactly one field - --> $DIR/union-fields-2.rs:21:9 - | -LL | let U { a, b, c } = u; - | ^^^^^^^^^^^^^ - -error[E0026]: union `U` does not have a field named `c` - --> $DIR/union-fields-2.rs:21:19 - | -LL | let U { a, b, c } = u; - | ^ union `U` does not have this field - -error: union patterns should have exactly one field - --> $DIR/union-fields-2.rs:23:9 - | -LL | let U { .. } = u; - | ^^^^^^^^ - -error: `..` cannot be used in union patterns - --> $DIR/union-fields-2.rs:23:9 - | -LL | let U { .. } = u; - | ^^^^^^^^ - -error: `..` cannot be used in union patterns - --> $DIR/union-fields-2.rs:25:9 - | -LL | let U { a, .. } = u; - | ^^^^^^^^^^^ - -error: aborting due to 13 previous errors - -Some errors have detailed explanations: E0026, E0436, E0560, E0784. -For more information about an error, try `rustc --explain E0026`. diff --git a/src/test/ui/union/union-fields-2.rs b/src/test/ui/union/union-fields-2.rs deleted file mode 100644 index e738b1847..000000000 --- a/src/test/ui/union/union-fields-2.rs +++ /dev/null @@ -1,26 +0,0 @@ -// revisions: mirunsafeck thirunsafeck -// [thirunsafeck]compile-flags: -Z thir-unsafeck - -union U { - a: u8, - b: u16, -} - -fn main() { - let u = U {}; //~ ERROR union expressions should have exactly one field - let u = U { a: 0 }; // OK - let u = U { a: 0, b: 1 }; //~ ERROR union expressions should have exactly one field - let u = U { a: 0, b: 1, c: 2 }; //~ ERROR union expressions should have exactly one field - //~^ ERROR union `U` has no field named `c` - let u = U { ..u }; //~ ERROR union expressions should have exactly one field - //~^ ERROR functional record update syntax requires a struct - - let U {} = u; //~ ERROR union patterns should have exactly one field - let U { a } = u; // OK - let U { a, b } = u; //~ ERROR union patterns should have exactly one field - let U { a, b, c } = u; //~ ERROR union patterns should have exactly one field - //~^ ERROR union `U` does not have a field named `c` - let U { .. } = u; //~ ERROR union patterns should have exactly one field - //~^ ERROR `..` cannot be used in union patterns - let U { a, .. } = u; //~ ERROR `..` cannot be used in union patterns -} diff --git a/src/test/ui/union/union-fields-2.thirunsafeck.stderr b/src/test/ui/union/union-fields-2.thirunsafeck.stderr deleted file mode 100644 index 90ad16402..000000000 --- a/src/test/ui/union/union-fields-2.thirunsafeck.stderr +++ /dev/null @@ -1,84 +0,0 @@ -error[E0784]: union expressions should have exactly one field - --> $DIR/union-fields-2.rs:10:13 - | -LL | let u = U {}; - | ^ - -error[E0784]: union expressions should have exactly one field - --> $DIR/union-fields-2.rs:12:13 - | -LL | let u = U { a: 0, b: 1 }; - | ^ - -error[E0560]: union `U` has no field named `c` - --> $DIR/union-fields-2.rs:13:29 - | -LL | let u = U { a: 0, b: 1, c: 2 }; - | ^ `U` does not have this field - | - = note: available fields are: `a`, `b` - -error[E0784]: union expressions should have exactly one field - --> $DIR/union-fields-2.rs:13:13 - | -LL | let u = U { a: 0, b: 1, c: 2 }; - | ^ - -error[E0784]: union expressions should have exactly one field - --> $DIR/union-fields-2.rs:15:13 - | -LL | let u = U { ..u }; - | ^ - -error[E0436]: functional record update syntax requires a struct - --> $DIR/union-fields-2.rs:15:19 - | -LL | let u = U { ..u }; - | ^ - -error: union patterns should have exactly one field - --> $DIR/union-fields-2.rs:18:9 - | -LL | let U {} = u; - | ^^^^ - -error: union patterns should have exactly one field - --> $DIR/union-fields-2.rs:20:9 - | -LL | let U { a, b } = u; - | ^^^^^^^^^^ - -error: union patterns should have exactly one field - --> $DIR/union-fields-2.rs:21:9 - | -LL | let U { a, b, c } = u; - | ^^^^^^^^^^^^^ - -error[E0026]: union `U` does not have a field named `c` - --> $DIR/union-fields-2.rs:21:19 - | -LL | let U { a, b, c } = u; - | ^ union `U` does not have this field - -error: union patterns should have exactly one field - --> $DIR/union-fields-2.rs:23:9 - | -LL | let U { .. } = u; - | ^^^^^^^^ - -error: `..` cannot be used in union patterns - --> $DIR/union-fields-2.rs:23:9 - | -LL | let U { .. } = u; - | ^^^^^^^^ - -error: `..` cannot be used in union patterns - --> $DIR/union-fields-2.rs:25:9 - | -LL | let U { a, .. } = u; - | ^^^^^^^^^^^ - -error: aborting due to 13 previous errors - -Some errors have detailed explanations: E0026, E0436, E0560, E0784. -For more information about an error, try `rustc --explain E0026`. diff --git a/src/test/ui/union/union-generic-rpass.rs b/src/test/ui/union/union-generic-rpass.rs deleted file mode 100644 index 25f1f5050..000000000 --- a/src/test/ui/union/union-generic-rpass.rs +++ /dev/null @@ -1,34 +0,0 @@ -// run-pass -// revisions: mirunsafeck thirunsafeck -// [thirunsafeck]compile-flags: -Z thir-unsafeck - -#![allow(dead_code)] - -use std::mem::ManuallyDrop; - -union MaybeItem { - elem: ManuallyDrop, - none: (), -} - -union U where A: Copy, B: Copy { - a: A, - b: B, -} - -unsafe fn union_transmute(a: A) -> B where A: Copy, B: Copy { - U { a }.b -} - -fn main() { - unsafe { - let b = union_transmute::<(u8, u8), u16>((1, 1)); - assert_eq!(b, (1 << 8) + 1); - - let v: Vec = vec![1, 2, 3]; - let mut i = v.iter(); - i.next(); - let mi = MaybeItem::> { elem: ManuallyDrop::new(i.next().unwrap()) }; - assert_eq!(**mi.elem, 2); - } -} diff --git a/src/test/ui/union/union-generic.mirunsafeck.stderr b/src/test/ui/union/union-generic.mirunsafeck.stderr deleted file mode 100644 index 037022a91..000000000 --- a/src/test/ui/union/union-generic.mirunsafeck.stderr +++ /dev/null @@ -1,27 +0,0 @@ -error[E0277]: the trait bound `Rc: Copy` is not satisfied - --> $DIR/union-generic.rs:11:13 - | -LL | let u = U { a: Rc::new(0u32) }; - | ^ the trait `Copy` is not implemented for `Rc` - | -note: required by a bound in `U` - --> $DIR/union-generic.rs:6:12 - | -LL | union U { - | ^^^^ required by this bound in `U` - -error[E0277]: the trait bound `Rc: Copy` is not satisfied - --> $DIR/union-generic.rs:13:17 - | -LL | let u = U::> { a: Default::default() }; - | ^^^^^^^ the trait `Copy` is not implemented for `Rc` - | -note: required by a bound in `U` - --> $DIR/union-generic.rs:6:12 - | -LL | union U { - | ^^^^ required by this bound in `U` - -error: aborting due to 2 previous errors - -For more information about this error, try `rustc --explain E0277`. diff --git a/src/test/ui/union/union-generic.rs b/src/test/ui/union/union-generic.rs deleted file mode 100644 index 3d68ecb87..000000000 --- a/src/test/ui/union/union-generic.rs +++ /dev/null @@ -1,15 +0,0 @@ -// revisions: mirunsafeck thirunsafeck -// [thirunsafeck]compile-flags: -Z thir-unsafeck - -use std::rc::Rc; - -union U { - a: T -} - -fn main() { - let u = U { a: Rc::new(0u32) }; - //~^ ERROR the trait bound `Rc: Copy` is not satisfied - let u = U::> { a: Default::default() }; - //~^ ERROR the trait bound `Rc: Copy` is not satisfied -} diff --git a/src/test/ui/union/union-generic.thirunsafeck.stderr b/src/test/ui/union/union-generic.thirunsafeck.stderr deleted file mode 100644 index 037022a91..000000000 --- a/src/test/ui/union/union-generic.thirunsafeck.stderr +++ /dev/null @@ -1,27 +0,0 @@ -error[E0277]: the trait bound `Rc: Copy` is not satisfied - --> $DIR/union-generic.rs:11:13 - | -LL | let u = U { a: Rc::new(0u32) }; - | ^ the trait `Copy` is not implemented for `Rc` - | -note: required by a bound in `U` - --> $DIR/union-generic.rs:6:12 - | -LL | union U { - | ^^^^ required by this bound in `U` - -error[E0277]: the trait bound `Rc: Copy` is not satisfied - --> $DIR/union-generic.rs:13:17 - | -LL | let u = U::> { a: Default::default() }; - | ^^^^^^^ the trait `Copy` is not implemented for `Rc` - | -note: required by a bound in `U` - --> $DIR/union-generic.rs:6:12 - | -LL | union U { - | ^^^^ required by this bound in `U` - -error: aborting due to 2 previous errors - -For more information about this error, try `rustc --explain E0277`. diff --git a/src/test/ui/union/union-inherent-method.rs b/src/test/ui/union/union-inherent-method.rs deleted file mode 100644 index b0fd22da7..000000000 --- a/src/test/ui/union/union-inherent-method.rs +++ /dev/null @@ -1,16 +0,0 @@ -// run-pass -// revisions: mirunsafeck thirunsafeck -// [thirunsafeck]compile-flags: -Z thir-unsafeck - -union U { - a: u8, -} - -impl U { - fn method(&self) -> u8 { unsafe { self.a } } -} - -fn main() { - let u = U { a: 10 }; - assert_eq!(u.method(), 10); -} diff --git a/src/test/ui/union/union-lint-dead-code.mirunsafeck.stderr b/src/test/ui/union/union-lint-dead-code.mirunsafeck.stderr deleted file mode 100644 index 6e21584c3..000000000 --- a/src/test/ui/union/union-lint-dead-code.mirunsafeck.stderr +++ /dev/null @@ -1,17 +0,0 @@ -error: field `b` is never read - --> $DIR/union-lint-dead-code.rs:8:5 - | -LL | union Foo { - | --- field in this union -LL | x: usize, -LL | b: bool, - | ^ - | -note: the lint level is defined here - --> $DIR/union-lint-dead-code.rs:4:9 - | -LL | #![deny(dead_code)] - | ^^^^^^^^^ - -error: aborting due to previous error - diff --git a/src/test/ui/union/union-lint-dead-code.rs b/src/test/ui/union/union-lint-dead-code.rs deleted file mode 100644 index 65aaf0a1d..000000000 --- a/src/test/ui/union/union-lint-dead-code.rs +++ /dev/null @@ -1,18 +0,0 @@ -// revisions: mirunsafeck thirunsafeck -// [thirunsafeck]compile-flags: -Z thir-unsafeck - -#![deny(dead_code)] - -union Foo { - x: usize, - b: bool, //~ ERROR: field `b` is never read - _unused: u16, -} - -fn field_read(f: Foo) -> usize { - unsafe { f.x } -} - -fn main() { - let _ = field_read(Foo { x: 2 }); -} diff --git a/src/test/ui/union/union-lint-dead-code.thirunsafeck.stderr b/src/test/ui/union/union-lint-dead-code.thirunsafeck.stderr deleted file mode 100644 index 6e21584c3..000000000 --- a/src/test/ui/union/union-lint-dead-code.thirunsafeck.stderr +++ /dev/null @@ -1,17 +0,0 @@ -error: field `b` is never read - --> $DIR/union-lint-dead-code.rs:8:5 - | -LL | union Foo { - | --- field in this union -LL | x: usize, -LL | b: bool, - | ^ - | -note: the lint level is defined here - --> $DIR/union-lint-dead-code.rs:4:9 - | -LL | #![deny(dead_code)] - | ^^^^^^^^^ - -error: aborting due to previous error - diff --git a/src/test/ui/union/union-macro.rs b/src/test/ui/union/union-macro.rs deleted file mode 100644 index 7fd9d8221..000000000 --- a/src/test/ui/union/union-macro.rs +++ /dev/null @@ -1,27 +0,0 @@ -// run-pass -// revisions: mirunsafeck thirunsafeck -// [thirunsafeck]compile-flags: -Z thir-unsafeck - -#![allow(unused_variables)] - -macro_rules! duplicate { - ($i: item) => { - mod m1 { - $i - } - mod m2 { - $i - } - } -} - -duplicate! { - pub union U { - pub a: u8 - } -} - -fn main() { - let u1 = m1::U { a: 0 }; - let u2 = m2::U { a: 0 }; -} diff --git a/src/test/ui/union/union-manuallydrop-rpass.rs b/src/test/ui/union/union-manuallydrop-rpass.rs deleted file mode 100644 index 826bdf07c..000000000 --- a/src/test/ui/union/union-manuallydrop-rpass.rs +++ /dev/null @@ -1,44 +0,0 @@ -// run-pass -// revisions: mirunsafeck thirunsafeck -// [thirunsafeck]compile-flags: -Z thir-unsafeck - -#![allow(dead_code)] - -use std::mem::needs_drop; -use std::mem::ManuallyDrop; - -struct NeedDrop; - -impl Drop for NeedDrop { - fn drop(&mut self) {} -} - -union UnionOk1 { - empty: (), - value: ManuallyDrop, -} - -union UnionOk2 { - value: ManuallyDrop, -} - -#[allow(dead_code)] -union UnionOk3 { - empty: (), - value: T, -} - -trait Foo { } - -trait ImpliesCopy : Copy { } - -#[allow(dead_code)] -union UnionOk4 { - value: T, -} - -fn main() { - // NeedDrop should not make needs_drop true - assert!(!needs_drop::>()); - assert!(!needs_drop::>()); -} diff --git a/src/test/ui/union/union-move.mirunsafeck.stderr b/src/test/ui/union/union-move.mirunsafeck.stderr deleted file mode 100644 index 6381ae874..000000000 --- a/src/test/ui/union/union-move.mirunsafeck.stderr +++ /dev/null @@ -1,51 +0,0 @@ -error[E0382]: use of moved value: `x` - --> $DIR/union-move.rs:29:18 - | -LL | fn test1(x: U1) { - | - move occurs because `x` has type `U1`, which does not implement the `Copy` trait -... -LL | move_out(x.f1_nocopy); - | ----------- value moved here -LL | move_out(x.f2_nocopy); - | ^^^^^^^^^^^ value used here after move - | -note: consider changing this parameter type in function `move_out` to borrow instead if owning the value isn't necessary - --> $DIR/union-move.rs:10:19 - | -LL | fn move_out(x: T) {} - | -------- ^ this parameter takes ownership of the value - | | - | in this function - -error[E0382]: use of moved value: `x` - --> $DIR/union-move.rs:45:18 - | -LL | fn test3(x: U1) { - | - move occurs because `x` has type `U1`, which does not implement the `Copy` trait -... -LL | move_out(x.f2_nocopy); - | ----------- value moved here -LL | move_out(x.f3_copy); - | ^^^^^^^^^ value used here after move - | -note: consider changing this parameter type in function `move_out` to borrow instead if owning the value isn't necessary - --> $DIR/union-move.rs:10:19 - | -LL | fn move_out(x: T) {} - | -------- ^ this parameter takes ownership of the value - | | - | in this function - -error[E0509]: cannot move out of type `U2`, which implements the `Drop` trait - --> $DIR/union-move.rs:52:18 - | -LL | move_out(x.f1_nocopy); - | ^^^^^^^^^^^ - | | - | cannot move out of here - | move occurs because `x.f1_nocopy` has type `ManuallyDrop>`, which does not implement the `Copy` trait - -error: aborting due to 3 previous errors - -Some errors have detailed explanations: E0382, E0509. -For more information about an error, try `rustc --explain E0382`. diff --git a/src/test/ui/union/union-move.rs b/src/test/ui/union/union-move.rs deleted file mode 100644 index b8b1ac804..000000000 --- a/src/test/ui/union/union-move.rs +++ /dev/null @@ -1,56 +0,0 @@ -// revisions: mirunsafeck thirunsafeck -// [thirunsafeck]compile-flags: -Z thir-unsafeck - -//! Test the behavior of moving out of non-`Copy` union fields. -//! Avoid types that `Drop`, we want to focus on moving. - -use std::cell::RefCell; -use std::mem::ManuallyDrop; - -fn move_out(x: T) {} - -union U1 { - f1_nocopy: ManuallyDrop>, - f2_nocopy: ManuallyDrop>, - f3_copy: i32, -} - -union U2 { - f1_nocopy: ManuallyDrop>, -} -impl Drop for U2 { - fn drop(&mut self) {} -} - -fn test1(x: U1) { - // Moving out of a nocopy field prevents accessing other nocopy field. - unsafe { - move_out(x.f1_nocopy); - move_out(x.f2_nocopy); //~ ERROR use of moved value: `x` - } -} - -fn test2(x: U1) { - // "Moving" out of copy field doesn't prevent later field accesses. - unsafe { - move_out(x.f3_copy); - move_out(x.f2_nocopy); // no error - } -} - -fn test3(x: U1) { - // Moving out of a nocopy field prevents accessing other copy field. - unsafe { - move_out(x.f2_nocopy); - move_out(x.f3_copy); //~ ERROR use of moved value: `x` - } -} - -fn test4(x: U2) { - // Cannot move out of union that implements `Drop`. - unsafe { - move_out(x.f1_nocopy); //~ ERROR cannot move out of type `U2`, which implements the `Drop` - } -} - -fn main() {} diff --git a/src/test/ui/union/union-move.thirunsafeck.stderr b/src/test/ui/union/union-move.thirunsafeck.stderr deleted file mode 100644 index 6381ae874..000000000 --- a/src/test/ui/union/union-move.thirunsafeck.stderr +++ /dev/null @@ -1,51 +0,0 @@ -error[E0382]: use of moved value: `x` - --> $DIR/union-move.rs:29:18 - | -LL | fn test1(x: U1) { - | - move occurs because `x` has type `U1`, which does not implement the `Copy` trait -... -LL | move_out(x.f1_nocopy); - | ----------- value moved here -LL | move_out(x.f2_nocopy); - | ^^^^^^^^^^^ value used here after move - | -note: consider changing this parameter type in function `move_out` to borrow instead if owning the value isn't necessary - --> $DIR/union-move.rs:10:19 - | -LL | fn move_out(x: T) {} - | -------- ^ this parameter takes ownership of the value - | | - | in this function - -error[E0382]: use of moved value: `x` - --> $DIR/union-move.rs:45:18 - | -LL | fn test3(x: U1) { - | - move occurs because `x` has type `U1`, which does not implement the `Copy` trait -... -LL | move_out(x.f2_nocopy); - | ----------- value moved here -LL | move_out(x.f3_copy); - | ^^^^^^^^^ value used here after move - | -note: consider changing this parameter type in function `move_out` to borrow instead if owning the value isn't necessary - --> $DIR/union-move.rs:10:19 - | -LL | fn move_out(x: T) {} - | -------- ^ this parameter takes ownership of the value - | | - | in this function - -error[E0509]: cannot move out of type `U2`, which implements the `Drop` trait - --> $DIR/union-move.rs:52:18 - | -LL | move_out(x.f1_nocopy); - | ^^^^^^^^^^^ - | | - | cannot move out of here - | move occurs because `x.f1_nocopy` has type `ManuallyDrop>`, which does not implement the `Copy` trait - -error: aborting due to 3 previous errors - -Some errors have detailed explanations: E0382, E0509. -For more information about an error, try `rustc --explain E0382`. diff --git a/src/test/ui/union/union-nodrop.rs b/src/test/ui/union/union-nodrop.rs deleted file mode 100644 index 6e6b105a7..000000000 --- a/src/test/ui/union/union-nodrop.rs +++ /dev/null @@ -1,62 +0,0 @@ -// run-pass -// revisions: mirunsafeck thirunsafeck -// [thirunsafeck]compile-flags: -Z thir-unsafeck - -#![allow(dead_code)] - -use std::mem::needs_drop; -use std::mem::ManuallyDrop; - -struct NeedDrop; - -impl Drop for NeedDrop { - fn drop(&mut self) {} -} - -// Constant expressios allow `NoDrop` to go out of scope, -// unlike a value of the interior type implementing `Drop`. -static X: () = (NoDrop { inner: ManuallyDrop::new(NeedDrop) }, ()).1; - -const Y: () = (NoDrop { inner: ManuallyDrop::new(NeedDrop) }, ()).1; - -const fn _f() { (NoDrop { inner: ManuallyDrop::new(NeedDrop) }, ()).1 } - -// A union that scrubs the drop glue from its inner type -union NoDrop { inner: ManuallyDrop } - -// Copy currently can't be implemented on drop-containing unions, -// this may change later -// https://github.com/rust-lang/rust/pull/38934#issuecomment-271219289 - -// // We should be able to implement Copy for NoDrop -// impl Copy for NoDrop {} -// impl Clone for NoDrop {fn clone(&self) -> Self { *self }} - -// // We should be able to implement Copy for things using NoDrop -// #[derive(Copy, Clone)] -struct Foo { - x: NoDrop> -} - -struct Baz { - x: NoDrop>, - y: Box, -} - -union ActuallyDrop { inner: ManuallyDrop } - -impl Drop for ActuallyDrop { - fn drop(&mut self) {} -} - -fn main() { - // NoDrop should not make needs_drop true - assert!(!needs_drop::()); - assert!(!needs_drop::>()); - assert!(!needs_drop::>>()); - // presence of other drop types should still work - assert!(needs_drop::()); - // drop impl on union itself should work - assert!(needs_drop::>()); - assert!(needs_drop::>>()); -} diff --git a/src/test/ui/union/union-nonrepresentable.rs b/src/test/ui/union/union-nonrepresentable.rs deleted file mode 100644 index 4bdf7c687..000000000 --- a/src/test/ui/union/union-nonrepresentable.rs +++ /dev/null @@ -1,6 +0,0 @@ -union U { //~ ERROR recursive type `U` has infinite size - a: u8, - b: std::mem::ManuallyDrop, -} - -fn main() {} diff --git a/src/test/ui/union/union-nonrepresentable.stderr b/src/test/ui/union/union-nonrepresentable.stderr deleted file mode 100644 index c266d2e9e..000000000 --- a/src/test/ui/union/union-nonrepresentable.stderr +++ /dev/null @@ -1,17 +0,0 @@ -error[E0072]: recursive type `U` has infinite size - --> $DIR/union-nonrepresentable.rs:1:1 - | -LL | union U { - | ^^^^^^^ -LL | a: u8, -LL | b: std::mem::ManuallyDrop, - | - recursive without indirection - | -help: insert some indirection (e.g., a `Box`, `Rc`, or `&`) to break the cycle - | -LL | b: std::mem::ManuallyDrop>, - | ++++ + - -error: aborting due to previous error - -For more information about this error, try `rustc --explain E0072`. diff --git a/src/test/ui/union/union-nonzero.rs b/src/test/ui/union/union-nonzero.rs deleted file mode 100644 index 3f4f7ea1c..000000000 --- a/src/test/ui/union/union-nonzero.rs +++ /dev/null @@ -1,54 +0,0 @@ -// run-pass -// revisions: mirunsafeck thirunsafeck -// [thirunsafeck]compile-flags: -Z thir-unsafeck - -#![allow(dead_code)] - -// Tests that unions aren't subject to unsafe non-zero/niche-filling optimizations. -// -// For example, if a union `U` can contain both a `&T` and a `*const T`, there's definitely no -// bit-value that an `Option` could reuse as `None`; this test makes sure that isn't done. -// -// Secondly, this tests the status quo (not a guarantee; subject to change!) to not apply such -// optimizations to types containing unions even if they're theoretically possible. (discussion: -// https://github.com/rust-lang/rust/issues/36394) -// -// Notably this nails down part of the behavior that `MaybeUninit` assumes: that an -// `Option>` does not take advantage of non-zero optimization, and thus is a safe -// construct. - -use std::mem::{size_of, transmute}; - -union U1 { - a: A, -} - -union U2 { - a: A, - b: B, -} - -// Option uses a value other than 0 and 1 as None -#[derive(Clone,Copy)] -enum E { - A = 0, - B = 1, -} - -fn main() { - // Unions do not participate in niche-filling/non-zero optimization... - assert!(size_of::>>() > size_of::>()); - assert!(size_of::>>() > size_of::>()); - assert!(size_of::>>() > size_of::>()); - - // ...even when theoretically possible: - assert!(size_of::>>() > size_of::>()); - assert!(size_of::>>() > size_of::>()); - - // The unused bits of the () variant can have any value. - let zeroed: U2<&u8, ()> = unsafe { transmute(std::ptr::null::()) }; - - if let None = Some(zeroed) { - panic!() - } -} diff --git a/src/test/ui/union/union-overwrite.rs b/src/test/ui/union/union-overwrite.rs deleted file mode 100644 index 0eea14d9d..000000000 --- a/src/test/ui/union/union-overwrite.rs +++ /dev/null @@ -1,80 +0,0 @@ -// run-pass -// revisions: mirunsafeck thirunsafeck -// [thirunsafeck]compile-flags: -Z thir-unsafeck - -#[repr(C)] -#[derive(Copy, Clone)] -struct Pair(T, U); -#[repr(C)] -#[derive(Copy, Clone)] -struct Triple(T, T, T); - -#[repr(C)] -union U -where - A: Copy, B: Copy -{ - a: Pair, - b: B, -} - -#[repr(C)] -union W -where - A: Copy, B: Copy -{ - a: A, - b: B, -} - -#[cfg(target_endian = "little")] -unsafe fn check() { - let mut u = U:: { b: 0xDE_DE }; - u.a.0 = 0xBE; - assert_eq!(u.b, 0xDE_BE); - - let mut u = U:: { b: 0xDEAD_DEAD }; - u.a.0 = 0xBEEF; - assert_eq!(u.b, 0xDEAD_BEEF); - - let mut u = U:: { b: 0xDEADBEEF_DEADBEEF }; - u.a.0 = 0xBAADF00D; - assert_eq!(u.b, 0xDEADBEEF_BAADF00D); - - let mut w = W::, u8>, u32> { b: 0xDEAD_DEAD }; - w.a.0 = Triple(0, 0, 0); - assert_eq!(w.b, 0xDE00_0000); - - let mut w = W::>, u32> { b: 0xDEAD_DEAD }; - w.a.1 = Triple(0, 0, 0); - assert_eq!(w.b, 0x0000_00AD); -} - -#[cfg(target_endian = "big")] -unsafe fn check() { - let mut u = U:: { b: 0xDE_DE }; - u.a.0 = 0xBE; - assert_eq!(u.b, 0xBE_DE); - - let mut u = U:: { b: 0xDEAD_DEAD }; - u.a.0 = 0xBEEF; - assert_eq!(u.b, 0xBEEF_DEAD); - - let mut u = U:: { b: 0xDEADBEEF_DEADBEEF }; - u.a.0 = 0xBAADF00D; - assert_eq!(u.b, 0xBAADF00D_DEADBEEF); - - let mut w = W::, u8>, u32> { b: 0xDEAD_DEAD }; - w.a.0 = Triple(0, 0, 0); - assert_eq!(w.b, 0x0000_00AD); - - let mut w = W::>, u32> { b: 0xDEAD_DEAD }; - w.a.1 = Triple(0, 0, 0); - assert_eq!(w.b, 0xDE00_0000); -} - -fn main() { - unsafe { - check(); - } -} diff --git a/src/test/ui/union/union-packed.rs b/src/test/ui/union/union-packed.rs deleted file mode 100644 index 9c6398bf5..000000000 --- a/src/test/ui/union/union-packed.rs +++ /dev/null @@ -1,173 +0,0 @@ -// run-pass -// revisions: mirunsafeck thirunsafeck -// [thirunsafeck]compile-flags: -Z thir-unsafeck - -#![allow(dead_code)] -#![allow(non_snake_case)] - -use std::mem::{size_of, size_of_val, align_of, align_of_val}; - -struct S { - a: u16, - b: [u8; 3], -} - -#[repr(packed)] -struct Sp1 { - a: u16, - b: [u8; 3], -} - -#[repr(packed(2))] -struct Sp2 { - a: u16, - b: [u8; 3], -} - -union U { - a: u16, - b: [u8; 3], -} - -#[repr(packed)] -union Up1 { - a: u16, - b: [u8; 3], -} - -#[repr(packed(2))] -union Up2 { - a: u16, - b: [u8; 3], -} - -#[repr(C, packed(4))] -union Up4c { - a: u16, - b: [u8; 3], -} - -const CS: S = S { a: 0, b: [0, 0, 0] }; -const CSP1: Sp1 = Sp1 { a: 0, b: [0, 0, 0] }; -const CSP2: Sp2 = Sp2 { a: 0, b: [0, 0, 0] }; -const CU: U = U { b: [0, 0, 0] }; -const CUP1: Up1 = Up1 { b: [0, 0, 0] }; -const CUP2: Up2 = Up2 { b: [0, 0, 0] }; -const CUP4C: Up4c = Up4c { b: [0, 0, 0] }; - -fn main() { - let s = S { a: 0, b: [0, 0, 0] }; - assert_eq!(size_of::(), 6); - assert_eq!(size_of_val(&s), 6); - assert_eq!(size_of_val(&CS), 6); - assert_eq!(align_of::(), 2); - assert_eq!(align_of_val(&s), 2); - assert_eq!(align_of_val(&CS), 2); - - let sp1 = Sp1 { a: 0, b: [0, 0, 0] }; - assert_eq!(size_of::(), 5); - assert_eq!(size_of_val(&sp1), 5); - assert_eq!(size_of_val(&CSP1), 5); - assert_eq!(align_of::(), 1); - assert_eq!(align_of_val(&sp1), 1); - assert_eq!(align_of_val(&CSP1), 1); - - let sp2 = Sp2 { a: 0, b: [0, 0, 0] }; - assert_eq!(size_of::(), 6); - assert_eq!(size_of_val(&sp2), 6); - assert_eq!(size_of_val(&CSP2), 6); - assert_eq!(align_of::(), 2); - assert_eq!(align_of_val(&sp2), 2); - assert_eq!(align_of_val(&CSP2), 2); - - let u = U { b: [0, 0, 0] }; - assert_eq!(size_of::(), 4); - assert_eq!(size_of_val(&u), 4); - assert_eq!(size_of_val(&CU), 4); - assert_eq!(align_of::(), 2); - assert_eq!(align_of_val(&u), 2); - assert_eq!(align_of_val(&CU), 2); - - let Up1 = Up1 { b: [0, 0, 0] }; - assert_eq!(size_of::(), 3); - assert_eq!(size_of_val(&Up1), 3); - assert_eq!(size_of_val(&CUP1), 3); - assert_eq!(align_of::(), 1); - assert_eq!(align_of_val(&Up1), 1); - assert_eq!(align_of_val(&CUP1), 1); - - let up2 = Up2 { b: [0, 0, 0] }; - assert_eq!(size_of::(), 4); - assert_eq!(size_of_val(&up2), 4); - assert_eq!(size_of_val(&CUP2), 4); - assert_eq!(align_of::(), 2); - assert_eq!(align_of_val(&up2), 2); - assert_eq!(align_of_val(&CUP2), 2); - - let up4c = Up4c { b: [0, 0, 0] }; - assert_eq!(size_of::(), 4); - assert_eq!(size_of_val(&up4c), 4); - assert_eq!(size_of_val(&CUP4C), 4); - assert_eq!(align_of::(), 2); - assert_eq!(align_of_val(&up4c), 2); - assert_eq!(align_of_val(&CUP4C), 2); - - hybrid::check_hybrid(); -} - -mod hybrid { - use std::mem::{size_of, align_of}; - - #[repr(packed)] - #[derive(Copy, Clone)] - struct S1 { - a: u16, - b: u8, - } - - #[repr(packed)] - union U { - s: S1, - c: u16, - } - - #[repr(packed)] - struct S2 { - d: u8, - u: U, - } - - #[repr(C, packed(2))] - struct S1C { - a: u16, - b: u8, - } - - #[repr(C, packed(2))] - union UC { - s: S1, - c: u16, - } - - #[repr(C, packed(2))] - struct S2C { - d: u8, - u: UC, - } - - pub fn check_hybrid() { - assert_eq!(align_of::(), 1); - assert_eq!(size_of::(), 3); - assert_eq!(align_of::(), 1); - assert_eq!(size_of::(), 3); - assert_eq!(align_of::(), 1); - assert_eq!(size_of::(), 4); - - assert_eq!(align_of::(), 2); - assert_eq!(size_of::(), 4); - assert_eq!(align_of::(), 2); - assert_eq!(size_of::(), 4); - assert_eq!(align_of::(), 2); - assert_eq!(size_of::(), 6); - } -} diff --git a/src/test/ui/union/union-pat-refutability.rs b/src/test/ui/union/union-pat-refutability.rs deleted file mode 100644 index d628a200a..000000000 --- a/src/test/ui/union/union-pat-refutability.rs +++ /dev/null @@ -1,57 +0,0 @@ -// run-pass -// revisions: mirunsafeck thirunsafeck -// [thirunsafeck]compile-flags: -Z thir-unsafeck - -#![allow(dead_code)] -#![allow(illegal_floating_point_literal_pattern)] - -#[repr(u32)] -enum Tag { I, F } - -#[repr(C)] -union U { - i: i32, - f: f32, -} - -#[repr(C)] -struct Value { - tag: Tag, - u: U, -} - -fn is_zero(v: Value) -> bool { - unsafe { - match v { - Value { tag: Tag::I, u: U { i: 0 } } => true, - Value { tag: Tag::F, u: U { f: 0.0 } } => true, - _ => false, - } - } -} - -union W { - a: u8, - b: u8, -} - -fn refut(w: W) { - unsafe { - match w { - W { a: 10 } => { - panic!(); - } - W { b } => { - assert_eq!(b, 11); - } - } - } -} - -fn main() { - let v = Value { tag: Tag::I, u: U { i: 1 } }; - assert_eq!(is_zero(v), false); - - let w = W { a: 11 }; - refut(w); -} diff --git a/src/test/ui/union/union-repr-c.rs b/src/test/ui/union/union-repr-c.rs deleted file mode 100644 index 1367835e6..000000000 --- a/src/test/ui/union/union-repr-c.rs +++ /dev/null @@ -1,18 +0,0 @@ -#![allow(unused)] -#![deny(improper_ctypes)] - -#[repr(C)] -union U { - a: u8, -} - -union W { - a: u8, -} - -extern "C" { - static FOREIGN1: U; // OK - static FOREIGN2: W; //~ ERROR `extern` block uses type `W` -} - -fn main() {} diff --git a/src/test/ui/union/union-repr-c.stderr b/src/test/ui/union/union-repr-c.stderr deleted file mode 100644 index 49124eee5..000000000 --- a/src/test/ui/union/union-repr-c.stderr +++ /dev/null @@ -1,21 +0,0 @@ -error: `extern` block uses type `W`, which is not FFI-safe - --> $DIR/union-repr-c.rs:15:22 - | -LL | static FOREIGN2: W; - | ^ not FFI-safe - | - = help: consider adding a `#[repr(C)]` or `#[repr(transparent)]` attribute to this union - = note: this union has unspecified layout -note: the type is defined here - --> $DIR/union-repr-c.rs:9:1 - | -LL | union W { - | ^^^^^^^ -note: the lint level is defined here - --> $DIR/union-repr-c.rs:2:9 - | -LL | #![deny(improper_ctypes)] - | ^^^^^^^^^^^^^^^ - -error: aborting due to previous error - diff --git a/src/test/ui/union/union-sized-field.rs b/src/test/ui/union/union-sized-field.rs deleted file mode 100644 index cb852eff0..000000000 --- a/src/test/ui/union/union-sized-field.rs +++ /dev/null @@ -1,19 +0,0 @@ -use std::mem::ManuallyDrop; - -union Foo { - value: ManuallyDrop, - //~^ ERROR the size for values of type -} - -struct Foo2 { - value: ManuallyDrop, - //~^ ERROR the size for values of type - t: u32, -} - -enum Foo3 { - Value(ManuallyDrop), - //~^ ERROR the size for values of type -} - -fn main() {} diff --git a/src/test/ui/union/union-sized-field.stderr b/src/test/ui/union/union-sized-field.stderr deleted file mode 100644 index 771e8f261..000000000 --- a/src/test/ui/union/union-sized-field.stderr +++ /dev/null @@ -1,78 +0,0 @@ -error[E0277]: the size for values of type `T` cannot be known at compilation time - --> $DIR/union-sized-field.rs:4:12 - | -LL | union Foo { - | - this type parameter needs to be `std::marker::Sized` -LL | value: ManuallyDrop, - | ^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = note: required because it appears within the type `ManuallyDrop` - = note: no field of a union may have a dynamically sized type - = help: change the field's type to have a statically known size -help: consider removing the `?Sized` bound to make the type parameter `Sized` - | -LL - union Foo { -LL + union Foo { - | -help: borrowed types always have a statically known size - | -LL | value: &ManuallyDrop, - | + -help: the `Box` type always has a statically known size and allocates its contents in the heap - | -LL | value: Box>, - | ++++ + - -error[E0277]: the size for values of type `T` cannot be known at compilation time - --> $DIR/union-sized-field.rs:9:12 - | -LL | struct Foo2 { - | - this type parameter needs to be `std::marker::Sized` -LL | value: ManuallyDrop, - | ^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = note: required because it appears within the type `ManuallyDrop` - = note: only the last field of a struct may have a dynamically sized type - = help: change the field's type to have a statically known size -help: consider removing the `?Sized` bound to make the type parameter `Sized` - | -LL - struct Foo2 { -LL + struct Foo2 { - | -help: borrowed types always have a statically known size - | -LL | value: &ManuallyDrop, - | + -help: the `Box` type always has a statically known size and allocates its contents in the heap - | -LL | value: Box>, - | ++++ + - -error[E0277]: the size for values of type `T` cannot be known at compilation time - --> $DIR/union-sized-field.rs:15:11 - | -LL | enum Foo3 { - | - this type parameter needs to be `std::marker::Sized` -LL | Value(ManuallyDrop), - | ^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = note: required because it appears within the type `ManuallyDrop` - = note: no field of an enum variant may have a dynamically sized type - = help: change the field's type to have a statically known size -help: consider removing the `?Sized` bound to make the type parameter `Sized` - | -LL - enum Foo3 { -LL + enum Foo3 { - | -help: borrowed types always have a statically known size - | -LL | Value(&ManuallyDrop), - | + -help: the `Box` type always has a statically known size and allocates its contents in the heap - | -LL | Value(Box>), - | ++++ + - -error: aborting due to 3 previous errors - -For more information about this error, try `rustc --explain E0277`. diff --git a/src/test/ui/union/union-suggest-field.mirunsafeck.stderr b/src/test/ui/union/union-suggest-field.mirunsafeck.stderr deleted file mode 100644 index 58b1f5cb0..000000000 --- a/src/test/ui/union/union-suggest-field.mirunsafeck.stderr +++ /dev/null @@ -1,27 +0,0 @@ -error[E0560]: union `U` has no field named `principle` - --> $DIR/union-suggest-field.rs:13:17 - | -LL | let u = U { principle: 0 }; - | ^^^^^^^^^ help: a field with a similar name exists: `principal` - -error[E0609]: no field `principial` on type `U` - --> $DIR/union-suggest-field.rs:17:15 - | -LL | let w = u.principial; - | ^^^^^^^^^^ help: a field with a similar name exists: `principal` - -error[E0615]: attempted to take value of method `calculate` on type `U` - --> $DIR/union-suggest-field.rs:21:15 - | -LL | let y = u.calculate; - | ^^^^^^^^^ method, not a field - | -help: use parentheses to call the method - | -LL | let y = u.calculate(); - | ++ - -error: aborting due to 3 previous errors - -Some errors have detailed explanations: E0560, E0609, E0615. -For more information about an error, try `rustc --explain E0560`. diff --git a/src/test/ui/union/union-suggest-field.rs b/src/test/ui/union/union-suggest-field.rs deleted file mode 100644 index 601a22a06..000000000 --- a/src/test/ui/union/union-suggest-field.rs +++ /dev/null @@ -1,24 +0,0 @@ -// revisions: mirunsafeck thirunsafeck -// [thirunsafeck]compile-flags: -Z thir-unsafeck - -union U { - principal: u8, -} - -impl U { - fn calculate(&self) {} -} - -fn main() { - let u = U { principle: 0 }; - //~^ ERROR union `U` has no field named `principle` - //~| HELP a field with a similar name exists - //~| SUGGESTION principal - let w = u.principial; //~ ERROR no field `principial` on type `U` - //~| HELP a field with a similar name exists - //~| SUGGESTION principal - - let y = u.calculate; //~ ERROR attempted to take value of method `calculate` on type `U` - //~| HELP use parentheses to call the method - //~| SUGGESTION () -} diff --git a/src/test/ui/union/union-suggest-field.thirunsafeck.stderr b/src/test/ui/union/union-suggest-field.thirunsafeck.stderr deleted file mode 100644 index 58b1f5cb0..000000000 --- a/src/test/ui/union/union-suggest-field.thirunsafeck.stderr +++ /dev/null @@ -1,27 +0,0 @@ -error[E0560]: union `U` has no field named `principle` - --> $DIR/union-suggest-field.rs:13:17 - | -LL | let u = U { principle: 0 }; - | ^^^^^^^^^ help: a field with a similar name exists: `principal` - -error[E0609]: no field `principial` on type `U` - --> $DIR/union-suggest-field.rs:17:15 - | -LL | let w = u.principial; - | ^^^^^^^^^^ help: a field with a similar name exists: `principal` - -error[E0615]: attempted to take value of method `calculate` on type `U` - --> $DIR/union-suggest-field.rs:21:15 - | -LL | let y = u.calculate; - | ^^^^^^^^^ method, not a field - | -help: use parentheses to call the method - | -LL | let y = u.calculate(); - | ++ - -error: aborting due to 3 previous errors - -Some errors have detailed explanations: E0560, E0609, E0615. -For more information about an error, try `rustc --explain E0560`. diff --git a/src/test/ui/union/union-trait-impl.rs b/src/test/ui/union/union-trait-impl.rs deleted file mode 100644 index 6134e91f3..000000000 --- a/src/test/ui/union/union-trait-impl.rs +++ /dev/null @@ -1,19 +0,0 @@ -// run-pass -// revisions: mirunsafeck thirunsafeck -// [thirunsafeck]compile-flags: -Z thir-unsafeck - -use std::fmt; - -union U { - a: u8 -} - -impl fmt::Display for U { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - unsafe { write!(f, "Oh hai {}", self.a) } - } -} - -fn main() { - assert_eq!(U { a: 2 }.to_string(), "Oh hai 2"); -} diff --git a/src/test/ui/union/union-transmute.rs b/src/test/ui/union/union-transmute.rs deleted file mode 100644 index 1a3b32d55..000000000 --- a/src/test/ui/union/union-transmute.rs +++ /dev/null @@ -1,27 +0,0 @@ -// run-pass -// revisions: mirunsafeck thirunsafeck -// [thirunsafeck]compile-flags: -Z thir-unsafeck - -union U { - a: (u8, u8), - b: u16, -} - -union W { - a: u32, - b: f32, -} - -fn main() { - unsafe { - let mut u = U { a: (1, 1) }; - assert_eq!(u.b, (1 << 8) + 1); - u.b = (2 << 8) + 2; - assert_eq!(u.a, (2, 2)); - - let mut w = W { a: 0b0_11111111_00000000000000000000000 }; - assert_eq!(w.b, f32::INFINITY); - w.b = f32::NEG_INFINITY; - assert_eq!(w.a, 0b1_11111111_00000000000000000000000); - } -} diff --git a/src/test/ui/union/union-unsafe.mir.stderr b/src/test/ui/union/union-unsafe.mir.stderr deleted file mode 100644 index 544213dbc..000000000 --- a/src/test/ui/union/union-unsafe.mir.stderr +++ /dev/null @@ -1,75 +0,0 @@ -error[E0133]: access to union field is unsafe and requires unsafe function or block - --> $DIR/union-unsafe.rs:33:5 - | -LL | *(u.p) = 13; - | ^^^^^^^^^^^ access to union field - | - = note: the field may not be properly initialized: using uninitialized data will cause undefined behavior - -error[E0133]: access to union field is unsafe and requires unsafe function or block - --> $DIR/union-unsafe.rs:46:6 - | -LL | *u3.a = T::default(); - | ^^^^ access to union field - | - = note: the field may not be properly initialized: using uninitialized data will cause undefined behavior - -error[E0133]: access to union field is unsafe and requires unsafe function or block - --> $DIR/union-unsafe.rs:52:6 - | -LL | *u3.a = T::default(); - | ^^^^ access to union field - | - = note: the field may not be properly initialized: using uninitialized data will cause undefined behavior - -error[E0133]: access to union field is unsafe and requires unsafe function or block - --> $DIR/union-unsafe.rs:60:13 - | -LL | let a = u1.a; - | ^^^^ access to union field - | - = note: the field may not be properly initialized: using uninitialized data will cause undefined behavior - -error[E0133]: access to union field is unsafe and requires unsafe function or block - --> $DIR/union-unsafe.rs:63:14 - | -LL | let U1 { a } = u1; - | ^ access to union field - | - = note: the field may not be properly initialized: using uninitialized data will cause undefined behavior - -error[E0133]: access to union field is unsafe and requires unsafe function or block - --> $DIR/union-unsafe.rs:64:12 - | -LL | if let U1 { a: 12 } = u1 {} - | ^^^^^^^^^^^^ access to union field - | - = note: the field may not be properly initialized: using uninitialized data will cause undefined behavior - -error[E0133]: access to union field is unsafe and requires unsafe function or block - --> $DIR/union-unsafe.rs:69:6 - | -LL | *u2.a = String::from("new"); - | ^^^^ access to union field - | - = note: the field may not be properly initialized: using uninitialized data will cause undefined behavior - -error[E0133]: access to union field is unsafe and requires unsafe function or block - --> $DIR/union-unsafe.rs:73:6 - | -LL | *u3.a = 1; - | ^^^^ access to union field - | - = note: the field may not be properly initialized: using uninitialized data will cause undefined behavior - -error[E0133]: access to union field is unsafe and requires unsafe function or block - --> $DIR/union-unsafe.rs:77:6 - | -LL | *u3.a = String::from("new"); - | ^^^^ access to union field - | - = note: the field may not be properly initialized: using uninitialized data will cause undefined behavior - -error: aborting due to 9 previous errors - -For more information about this error, try `rustc --explain E0133`. diff --git a/src/test/ui/union/union-unsafe.rs b/src/test/ui/union/union-unsafe.rs deleted file mode 100644 index 5e1837a90..000000000 --- a/src/test/ui/union/union-unsafe.rs +++ /dev/null @@ -1,78 +0,0 @@ -// revisions: mir thir -// [thir]compile-flags: -Z thir-unsafeck - -use std::mem::ManuallyDrop; -use std::cell::RefCell; - -union U1 { - a: u8 -} - -union U2 { - a: ManuallyDrop -} - -union U3 { - a: ManuallyDrop -} - -union U4 { - a: T -} - -union URef { - p: &'static mut i32, -} - -union URefCell { // field that does not drop but is not `Copy`, either - a: (ManuallyDrop>, i32), -} - -fn deref_union_field(mut u: URef) { - // Not an assignment but an access to the union field! - *(u.p) = 13; //~ ERROR access to union field is unsafe -} - -fn assign_noncopy_union_field(mut u: URefCell) { - // FIXME(thir-unsafeck) - u.a = (ManuallyDrop::new(RefCell::new(0)), 1); // OK (assignment does not drop) - u.a.0 = ManuallyDrop::new(RefCell::new(0)); // OK (assignment does not drop) - u.a.1 = 1; // OK -} - -fn generic_noncopy() { - let mut u3 = U3 { a: ManuallyDrop::new(T::default()) }; - u3.a = ManuallyDrop::new(T::default()); // OK (assignment does not drop) - *u3.a = T::default(); //~ ERROR access to union field is unsafe -} - -fn generic_copy() { - let mut u3 = U3 { a: ManuallyDrop::new(T::default()) }; - u3.a = ManuallyDrop::new(T::default()); // OK - *u3.a = T::default(); //~ ERROR access to union field is unsafe - - let mut u4 = U4 { a: T::default() }; - u4.a = T::default(); // OK -} - -fn main() { - let mut u1 = U1 { a: 10 }; // OK - let a = u1.a; //~ ERROR access to union field is unsafe - u1.a = 11; // OK - - let U1 { a } = u1; //~ ERROR access to union field is unsafe - if let U1 { a: 12 } = u1 {} //~ ERROR access to union field is unsafe - // let U1 { .. } = u1; // OK - - let mut u2 = U2 { a: ManuallyDrop::new(String::from("old")) }; // OK - u2.a = ManuallyDrop::new(String::from("new")); // OK (assignment does not drop) - *u2.a = String::from("new"); //~ ERROR access to union field is unsafe - - let mut u3 = U3 { a: ManuallyDrop::new(0) }; // OK - u3.a = ManuallyDrop::new(1); // OK - *u3.a = 1; //~ ERROR access to union field is unsafe - - let mut u3 = U3 { a: ManuallyDrop::new(String::from("old")) }; // OK - u3.a = ManuallyDrop::new(String::from("new")); // OK (assignment does not drop) - *u3.a = String::from("new"); //~ ERROR access to union field is unsafe -} diff --git a/src/test/ui/union/union-unsafe.thir.stderr b/src/test/ui/union/union-unsafe.thir.stderr deleted file mode 100644 index f959fe5bd..000000000 --- a/src/test/ui/union/union-unsafe.thir.stderr +++ /dev/null @@ -1,75 +0,0 @@ -error[E0133]: access to union field is unsafe and requires unsafe function or block - --> $DIR/union-unsafe.rs:33:6 - | -LL | *(u.p) = 13; - | ^^^^^ access to union field - | - = note: the field may not be properly initialized: using uninitialized data will cause undefined behavior - -error[E0133]: access to union field is unsafe and requires unsafe function or block - --> $DIR/union-unsafe.rs:46:6 - | -LL | *u3.a = T::default(); - | ^^^^ access to union field - | - = note: the field may not be properly initialized: using uninitialized data will cause undefined behavior - -error[E0133]: access to union field is unsafe and requires unsafe function or block - --> $DIR/union-unsafe.rs:52:6 - | -LL | *u3.a = T::default(); - | ^^^^ access to union field - | - = note: the field may not be properly initialized: using uninitialized data will cause undefined behavior - -error[E0133]: access to union field is unsafe and requires unsafe function or block - --> $DIR/union-unsafe.rs:60:13 - | -LL | let a = u1.a; - | ^^^^ access to union field - | - = note: the field may not be properly initialized: using uninitialized data will cause undefined behavior - -error[E0133]: access to union field is unsafe and requires unsafe function or block - --> $DIR/union-unsafe.rs:63:14 - | -LL | let U1 { a } = u1; - | ^ access to union field - | - = note: the field may not be properly initialized: using uninitialized data will cause undefined behavior - -error[E0133]: access to union field is unsafe and requires unsafe function or block - --> $DIR/union-unsafe.rs:64:8 - | -LL | if let U1 { a: 12 } = u1 {} - | ^^^^^^^^^^^^^^^^^^^^^ access to union field - | - = note: the field may not be properly initialized: using uninitialized data will cause undefined behavior - -error[E0133]: access to union field is unsafe and requires unsafe function or block - --> $DIR/union-unsafe.rs:69:6 - | -LL | *u2.a = String::from("new"); - | ^^^^ access to union field - | - = note: the field may not be properly initialized: using uninitialized data will cause undefined behavior - -error[E0133]: access to union field is unsafe and requires unsafe function or block - --> $DIR/union-unsafe.rs:73:6 - | -LL | *u3.a = 1; - | ^^^^ access to union field - | - = note: the field may not be properly initialized: using uninitialized data will cause undefined behavior - -error[E0133]: access to union field is unsafe and requires unsafe function or block - --> $DIR/union-unsafe.rs:77:6 - | -LL | *u3.a = String::from("new"); - | ^^^^ access to union field - | - = note: the field may not be properly initialized: using uninitialized data will cause undefined behavior - -error: aborting due to 9 previous errors - -For more information about this error, try `rustc --explain E0133`. diff --git a/src/test/ui/union/union-unsized.mirunsafeck.stderr b/src/test/ui/union/union-unsized.mirunsafeck.stderr deleted file mode 100644 index 59ab835fb..000000000 --- a/src/test/ui/union/union-unsized.mirunsafeck.stderr +++ /dev/null @@ -1,39 +0,0 @@ -error[E0277]: the size for values of type `str` cannot be known at compilation time - --> $DIR/union-unsized.rs:5:8 - | -LL | a: str, - | ^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `str` - = note: no field of a union may have a dynamically sized type - = help: change the field's type to have a statically known size -help: borrowed types always have a statically known size - | -LL | a: &str, - | + -help: the `Box` type always has a statically known size and allocates its contents in the heap - | -LL | a: Box, - | ++++ + - -error[E0277]: the size for values of type `str` cannot be known at compilation time - --> $DIR/union-unsized.rs:13:8 - | -LL | b: str, - | ^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `str` - = note: no field of a union may have a dynamically sized type - = help: change the field's type to have a statically known size -help: borrowed types always have a statically known size - | -LL | b: &str, - | + -help: the `Box` type always has a statically known size and allocates its contents in the heap - | -LL | b: Box, - | ++++ + - -error: aborting due to 2 previous errors - -For more information about this error, try `rustc --explain E0277`. diff --git a/src/test/ui/union/union-unsized.rs b/src/test/ui/union/union-unsized.rs deleted file mode 100644 index 8e897d7d3..000000000 --- a/src/test/ui/union/union-unsized.rs +++ /dev/null @@ -1,17 +0,0 @@ -// revisions: mirunsafeck thirunsafeck -// [thirunsafeck]compile-flags: -Z thir-unsafeck - -union U { - a: str, - //~^ ERROR the size for values of type - - b: u8, -} - -union W { - a: u8, - b: str, - //~^ ERROR the size for values of type -} - -fn main() {} diff --git a/src/test/ui/union/union-unsized.thirunsafeck.stderr b/src/test/ui/union/union-unsized.thirunsafeck.stderr deleted file mode 100644 index 59ab835fb..000000000 --- a/src/test/ui/union/union-unsized.thirunsafeck.stderr +++ /dev/null @@ -1,39 +0,0 @@ -error[E0277]: the size for values of type `str` cannot be known at compilation time - --> $DIR/union-unsized.rs:5:8 - | -LL | a: str, - | ^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `str` - = note: no field of a union may have a dynamically sized type - = help: change the field's type to have a statically known size -help: borrowed types always have a statically known size - | -LL | a: &str, - | + -help: the `Box` type always has a statically known size and allocates its contents in the heap - | -LL | a: Box, - | ++++ + - -error[E0277]: the size for values of type `str` cannot be known at compilation time - --> $DIR/union-unsized.rs:13:8 - | -LL | b: str, - | ^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `str` - = note: no field of a union may have a dynamically sized type - = help: change the field's type to have a statically known size -help: borrowed types always have a statically known size - | -LL | b: &str, - | + -help: the `Box` type always has a statically known size and allocates its contents in the heap - | -LL | b: Box, - | ++++ + - -error: aborting due to 2 previous errors - -For more information about this error, try `rustc --explain E0277`. diff --git a/src/test/ui/union/union-with-drop-fields.mirunsafeck.stderr b/src/test/ui/union/union-with-drop-fields.mirunsafeck.stderr deleted file mode 100644 index 93fe996d2..000000000 --- a/src/test/ui/union/union-with-drop-fields.mirunsafeck.stderr +++ /dev/null @@ -1,39 +0,0 @@ -error[E0740]: unions cannot contain fields that may need dropping - --> $DIR/union-with-drop-fields.rs:11:5 - | -LL | a: String, - | ^^^^^^^^^ - | - = note: a type is guaranteed not to need dropping when it implements `Copy`, or when it is the special `ManuallyDrop<_>` type -help: when the type does not implement `Copy`, wrap it inside a `ManuallyDrop<_>` and ensure it is manually dropped - | -LL | a: std::mem::ManuallyDrop, - | +++++++++++++++++++++++ + - -error[E0740]: unions cannot contain fields that may need dropping - --> $DIR/union-with-drop-fields.rs:19:5 - | -LL | a: S, - | ^^^^ - | - = note: a type is guaranteed not to need dropping when it implements `Copy`, or when it is the special `ManuallyDrop<_>` type -help: when the type does not implement `Copy`, wrap it inside a `ManuallyDrop<_>` and ensure it is manually dropped - | -LL | a: std::mem::ManuallyDrop, - | +++++++++++++++++++++++ + - -error[E0740]: unions cannot contain fields that may need dropping - --> $DIR/union-with-drop-fields.rs:24:5 - | -LL | a: T, - | ^^^^ - | - = note: a type is guaranteed not to need dropping when it implements `Copy`, or when it is the special `ManuallyDrop<_>` type -help: when the type does not implement `Copy`, wrap it inside a `ManuallyDrop<_>` and ensure it is manually dropped - | -LL | a: std::mem::ManuallyDrop, - | +++++++++++++++++++++++ + - -error: aborting due to 3 previous errors - -For more information about this error, try `rustc --explain E0740`. diff --git a/src/test/ui/union/union-with-drop-fields.rs b/src/test/ui/union/union-with-drop-fields.rs deleted file mode 100644 index a7a8b69e7..000000000 --- a/src/test/ui/union/union-with-drop-fields.rs +++ /dev/null @@ -1,31 +0,0 @@ -// revisions: mirunsafeck thirunsafeck -// [thirunsafeck]compile-flags: -Z thir-unsafeck - -#![allow(dead_code)] - -union U { - a: u8, // OK -} - -union W { - a: String, //~ ERROR unions cannot contain fields that may need dropping - b: String, // OK, only one field is reported -} - -struct S(String); - -// `S` doesn't implement `Drop` trait, but still has non-trivial destructor -union Y { - a: S, //~ ERROR unions cannot contain fields that may need dropping -} - -// We don't know if `T` is trivially-destructable or not until trans -union J { - a: T, //~ ERROR unions cannot contain fields that may need dropping -} - -union H { - a: T, // OK, `T` is `Copy`, no destructor -} - -fn main() {} diff --git a/src/test/ui/union/union-with-drop-fields.thirunsafeck.stderr b/src/test/ui/union/union-with-drop-fields.thirunsafeck.stderr deleted file mode 100644 index 93fe996d2..000000000 --- a/src/test/ui/union/union-with-drop-fields.thirunsafeck.stderr +++ /dev/null @@ -1,39 +0,0 @@ -error[E0740]: unions cannot contain fields that may need dropping - --> $DIR/union-with-drop-fields.rs:11:5 - | -LL | a: String, - | ^^^^^^^^^ - | - = note: a type is guaranteed not to need dropping when it implements `Copy`, or when it is the special `ManuallyDrop<_>` type -help: when the type does not implement `Copy`, wrap it inside a `ManuallyDrop<_>` and ensure it is manually dropped - | -LL | a: std::mem::ManuallyDrop, - | +++++++++++++++++++++++ + - -error[E0740]: unions cannot contain fields that may need dropping - --> $DIR/union-with-drop-fields.rs:19:5 - | -LL | a: S, - | ^^^^ - | - = note: a type is guaranteed not to need dropping when it implements `Copy`, or when it is the special `ManuallyDrop<_>` type -help: when the type does not implement `Copy`, wrap it inside a `ManuallyDrop<_>` and ensure it is manually dropped - | -LL | a: std::mem::ManuallyDrop, - | +++++++++++++++++++++++ + - -error[E0740]: unions cannot contain fields that may need dropping - --> $DIR/union-with-drop-fields.rs:24:5 - | -LL | a: T, - | ^^^^ - | - = note: a type is guaranteed not to need dropping when it implements `Copy`, or when it is the special `ManuallyDrop<_>` type -help: when the type does not implement `Copy`, wrap it inside a `ManuallyDrop<_>` and ensure it is manually dropped - | -LL | a: std::mem::ManuallyDrop, - | +++++++++++++++++++++++ + - -error: aborting due to 3 previous errors - -For more information about this error, try `rustc --explain E0740`. -- cgit v1.2.3