Test dropping union fields more
This commit is contained in:
parent
d5fd37f00f
commit
6953f17aec
5 changed files with 151 additions and 22 deletions
|
@ -1,4 +1,7 @@
|
||||||
// run-pass
|
// run-pass
|
||||||
|
// revisions: mirunsafeck thirunsafeck
|
||||||
|
// [thirunsafeck]compile-flags: -Z thir-unsafeck
|
||||||
|
|
||||||
#![allow(dead_code)]
|
#![allow(dead_code)]
|
||||||
#![allow(unused_variables)]
|
#![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
|
|
||||||
|
|
59
src/test/ui/unsafe/union-assignop.mirunsafeck.stderr
Normal file
59
src/test/ui/unsafe/union-assignop.mirunsafeck.stderr
Normal file
|
@ -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`.
|
30
src/test/ui/unsafe/union-assignop.rs
Normal file
30
src/test/ui/unsafe/union-assignop.rs
Normal file
|
@ -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
|
||||||
|
}
|
59
src/test/ui/unsafe/union-assignop.thirunsafeck.stderr
Normal file
59
src/test/ui/unsafe/union-assignop.thirunsafeck.stderr
Normal file
|
@ -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`.
|
Loading…
Reference in a new issue