mirror of
https://github.com/rust-lang/rust.git
synced 2026-05-30 04:56:25 +03:00
Test dropping union fields more
This commit is contained in:
@@ -1,4 +1,7 @@
|
||||
// run-pass
|
||||
// revisions: mirunsafeck thirunsafeck
|
||||
// [thirunsafeck]compile-flags: -Z thir-unsafeck
|
||||
|
||||
#![allow(dead_code)]
|
||||
#![allow(unused_variables)]
|
||||
|
||||
|
||||
@@ -1,22 +0,0 @@
|
||||
warning: unnecessary `unsafe` block
|
||||
--> $DIR/union-drop.rs:27:9
|
||||
|
|
||||
LL | unsafe { CHECK += 1; }
|
||||
| ^^^^^^ unnecessary `unsafe` block
|
||||
|
|
||||
= note: `#[warn(unused_unsafe)]` on by default
|
||||
|
||||
warning: unnecessary `unsafe` block
|
||||
--> $DIR/union-drop.rs:33:9
|
||||
|
|
||||
LL | unsafe { CHECK += 1; }
|
||||
| ^^^^^^ unnecessary `unsafe` block
|
||||
|
||||
warning: unnecessary `unsafe` block
|
||||
--> $DIR/union-drop.rs:40:5
|
||||
|
|
||||
LL | unsafe {
|
||||
| ^^^^^^ unnecessary `unsafe` block
|
||||
|
||||
warning: 3 warnings emitted
|
||||
|
||||
@@ -0,0 +1,59 @@
|
||||
error[E0133]: access to union field is unsafe and requires unsafe function or block
|
||||
--> $DIR/union-assignop.rs:20:5
|
||||
|
|
||||
LL | foo.a += 5;
|
||||
| ^^^^^^^^^^ 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-assignop.rs:21:5
|
||||
|
|
||||
LL | foo.b += Dropping;
|
||||
| ^^^^^ access to union field
|
||||
|
|
||||
= note: the field may not be properly initialized: using uninitialized data will cause undefined behavior
|
||||
|
||||
error[E0133]: assignment to union field that might need dropping is unsafe and requires unsafe function or block
|
||||
--> $DIR/union-assignop.rs:22:5
|
||||
|
|
||||
LL | foo.b = Dropping;
|
||||
| ^^^^^^^^^^^^^^^^ assignment to union field that might need dropping
|
||||
|
|
||||
= note: the previous content of the field will be dropped, which causes undefined behavior if the field was not properly initialized
|
||||
|
||||
error[E0133]: access to union field is unsafe and requires unsafe function or block
|
||||
--> $DIR/union-assignop.rs:23:5
|
||||
|
|
||||
LL | foo.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-assignop.rs:25:5
|
||||
|
|
||||
LL | foo.b;
|
||||
| ^^^^^ 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-assignop.rs:27:13
|
||||
|
|
||||
LL | foo.b = foo.b;
|
||||
| ^^^^^ access to union field
|
||||
|
|
||||
= note: the field may not be properly initialized: using uninitialized data will cause undefined behavior
|
||||
|
||||
error[E0133]: assignment to union field that might need dropping is unsafe and requires unsafe function or block
|
||||
--> $DIR/union-assignop.rs:27:5
|
||||
|
|
||||
LL | foo.b = foo.b;
|
||||
| ^^^^^^^^^^^^^ assignment to union field that might need dropping
|
||||
|
|
||||
= note: the previous content of the field will be dropped, which causes undefined behavior if the field was not properly initialized
|
||||
|
||||
error: aborting due to 7 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0133`.
|
||||
@@ -0,0 +1,30 @@
|
||||
// revisions: mirunsafeck thirunsafeck
|
||||
// [thirunsafeck]compile-flags: -Z thir-unsafeck
|
||||
|
||||
#![feature(untagged_unions)]
|
||||
|
||||
use std::ops::AddAssign;
|
||||
|
||||
struct Dropping;
|
||||
impl AddAssign for Dropping {
|
||||
fn add_assign(&mut self, _: Self) {}
|
||||
}
|
||||
|
||||
union Foo {
|
||||
a: u8, // non-dropping
|
||||
b: Dropping, // treated as dropping
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let mut foo = Foo { a: 42 };
|
||||
foo.a += 5; //~ ERROR access to union field is unsafe
|
||||
foo.b += Dropping; //~ ERROR access to union field is unsafe
|
||||
foo.b = Dropping; //~ ERROR assignment to union field that might need dropping is unsafe
|
||||
foo.a; //~ ERROR access to union field is unsafe
|
||||
let foo = Foo { a: 42 };
|
||||
foo.b; //~ ERROR access to union field is unsafe
|
||||
let mut foo = Foo { a: 42 };
|
||||
foo.b = foo.b;
|
||||
//~^ ERROR access to union field is unsafe
|
||||
//~| ERROR assignment to union field that might need dropping
|
||||
}
|
||||
@@ -0,0 +1,59 @@
|
||||
error[E0133]: access to union field is unsafe and requires unsafe function or block
|
||||
--> $DIR/union-assignop.rs:20:5
|
||||
|
|
||||
LL | foo.a += 5;
|
||||
| ^^^^^ 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-assignop.rs:21:5
|
||||
|
|
||||
LL | foo.b += Dropping;
|
||||
| ^^^^^ access to union field
|
||||
|
|
||||
= note: the field may not be properly initialized: using uninitialized data will cause undefined behavior
|
||||
|
||||
error[E0133]: assignment to union field that might need dropping is unsafe and requires unsafe function or block
|
||||
--> $DIR/union-assignop.rs:22:5
|
||||
|
|
||||
LL | foo.b = Dropping;
|
||||
| ^^^^^^^^^^^^^^^^ assignment to union field that might need dropping
|
||||
|
|
||||
= note: the previous content of the field will be dropped, which causes undefined behavior if the field was not properly initialized
|
||||
|
||||
error[E0133]: access to union field is unsafe and requires unsafe function or block
|
||||
--> $DIR/union-assignop.rs:23:5
|
||||
|
|
||||
LL | foo.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-assignop.rs:25:5
|
||||
|
|
||||
LL | foo.b;
|
||||
| ^^^^^ access to union field
|
||||
|
|
||||
= note: the field may not be properly initialized: using uninitialized data will cause undefined behavior
|
||||
|
||||
error[E0133]: assignment to union field that might need dropping is unsafe and requires unsafe function or block
|
||||
--> $DIR/union-assignop.rs:27:5
|
||||
|
|
||||
LL | foo.b = foo.b;
|
||||
| ^^^^^^^^^^^^^ assignment to union field that might need dropping
|
||||
|
|
||||
= note: the previous content of the field will be dropped, which causes undefined behavior if the field was not properly initialized
|
||||
|
||||
error[E0133]: access to union field is unsafe and requires unsafe function or block
|
||||
--> $DIR/union-assignop.rs:27:13
|
||||
|
|
||||
LL | foo.b = foo.b;
|
||||
| ^^^^^ access to union field
|
||||
|
|
||||
= note: the field may not be properly initialized: using uninitialized data will cause undefined behavior
|
||||
|
||||
error: aborting due to 7 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0133`.
|
||||
Reference in New Issue
Block a user