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
|
||||
// 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
|
||||
|
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