Add tests for stable unsafe features in const fn
This commit is contained in:
parent
4497ff3762
commit
37ef5e43af
12 changed files with 160 additions and 2 deletions
20
src/test/ui/unsafe/ranged_ints2_const.rs
Normal file
20
src/test/ui/unsafe/ranged_ints2_const.rs
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
#![feature(rustc_attrs, const_let, const_fn)]
|
||||
|
||||
#[rustc_layout_scalar_valid_range_start(1)]
|
||||
#[repr(transparent)]
|
||||
pub(crate) struct NonZero<T>(pub(crate) T);
|
||||
fn main() {
|
||||
}
|
||||
|
||||
const fn foo() -> NonZero<u32> {
|
||||
let mut x = unsafe { NonZero(1) };
|
||||
let y = &mut x.0; //~ ERROR references in constant functions may only refer to immutable
|
||||
//~^ ERROR mutation of layout constrained field is unsafe
|
||||
unsafe { NonZero(1) }
|
||||
}
|
||||
|
||||
const fn bar() -> NonZero<u32> {
|
||||
let mut x = unsafe { NonZero(1) };
|
||||
let y = unsafe { &mut x.0 }; //~ ERROR references in constant functions may only refer to immut
|
||||
unsafe { NonZero(1) }
|
||||
}
|
||||
24
src/test/ui/unsafe/ranged_ints2_const.stderr
Normal file
24
src/test/ui/unsafe/ranged_ints2_const.stderr
Normal file
|
|
@ -0,0 +1,24 @@
|
|||
error[E0017]: references in constant functions may only refer to immutable values
|
||||
--> $DIR/ranged_ints2_const.rs:11:13
|
||||
|
|
||||
LL | let y = &mut x.0; //~ ERROR references in constant functions may only refer to immutable
|
||||
| ^^^^^^^^ constant functions require immutable values
|
||||
|
||||
error[E0017]: references in constant functions may only refer to immutable values
|
||||
--> $DIR/ranged_ints2_const.rs:18:22
|
||||
|
|
||||
LL | let y = unsafe { &mut x.0 }; //~ ERROR references in constant functions may only refer to immut
|
||||
| ^^^^^^^^ constant functions require immutable values
|
||||
|
||||
error[E0133]: mutation of layout constrained field is unsafe and requires unsafe function or block
|
||||
--> $DIR/ranged_ints2_const.rs:11:13
|
||||
|
|
||||
LL | let y = &mut x.0; //~ ERROR references in constant functions may only refer to immutable
|
||||
| ^^^^^^^^ mutation of layout constrained field
|
||||
|
|
||||
= note: mutating layout constrained fields cannot statically be checked for valid values
|
||||
|
||||
error: aborting due to 3 previous errors
|
||||
|
||||
Some errors occurred: E0017, E0133.
|
||||
For more information about an error, try `rustc --explain E0017`.
|
||||
21
src/test/ui/unsafe/ranged_ints3_const.rs
Normal file
21
src/test/ui/unsafe/ranged_ints3_const.rs
Normal file
|
|
@ -0,0 +1,21 @@
|
|||
#![feature(rustc_attrs, const_let, const_fn)]
|
||||
|
||||
use std::cell::Cell;
|
||||
|
||||
#[rustc_layout_scalar_valid_range_start(1)]
|
||||
#[repr(transparent)]
|
||||
pub(crate) struct NonZero<T>(pub(crate) T);
|
||||
fn main() {}
|
||||
|
||||
const fn foo() -> NonZero<Cell<u32>> {
|
||||
let mut x = unsafe { NonZero(Cell::new(1)) };
|
||||
let y = &x.0; //~ ERROR cannot borrow a constant which may contain interior mutability
|
||||
//~^ ERROR borrow of layout constrained field with interior mutability
|
||||
unsafe { NonZero(Cell::new(1)) }
|
||||
}
|
||||
|
||||
const fn bar() -> NonZero<Cell<u32>> {
|
||||
let mut x = unsafe { NonZero(Cell::new(1)) };
|
||||
let y = unsafe { &x.0 }; //~ ERROR cannot borrow a constant which may contain interior mut
|
||||
unsafe { NonZero(Cell::new(1)) }
|
||||
}
|
||||
24
src/test/ui/unsafe/ranged_ints3_const.stderr
Normal file
24
src/test/ui/unsafe/ranged_ints3_const.stderr
Normal file
|
|
@ -0,0 +1,24 @@
|
|||
error[E0492]: cannot borrow a constant which may contain interior mutability, create a static instead
|
||||
--> $DIR/ranged_ints3_const.rs:12:13
|
||||
|
|
||||
LL | let y = &x.0; //~ ERROR cannot borrow a constant which may contain interior mutability
|
||||
| ^^^^
|
||||
|
||||
error[E0492]: cannot borrow a constant which may contain interior mutability, create a static instead
|
||||
--> $DIR/ranged_ints3_const.rs:19:22
|
||||
|
|
||||
LL | let y = unsafe { &x.0 }; //~ ERROR cannot borrow a constant which may contain interior mut
|
||||
| ^^^^
|
||||
|
||||
error[E0133]: borrow of layout constrained field with interior mutability is unsafe and requires unsafe function or block
|
||||
--> $DIR/ranged_ints3_const.rs:12:13
|
||||
|
|
||||
LL | let y = &x.0; //~ ERROR cannot borrow a constant which may contain interior mutability
|
||||
| ^^^^ borrow of layout constrained field with interior mutability
|
||||
|
|
||||
= note: references to fields of layout constrained fields lose the constraints. Coupled with interior mutability, the field can be changed to invalid values
|
||||
|
||||
error: aborting due to 3 previous errors
|
||||
|
||||
Some errors occurred: E0133, E0492.
|
||||
For more information about an error, try `rustc --explain E0133`.
|
||||
19
src/test/ui/unsafe/ranged_ints4_const.rs
Normal file
19
src/test/ui/unsafe/ranged_ints4_const.rs
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
#![feature(rustc_attrs, const_let, const_fn)]
|
||||
|
||||
#[rustc_layout_scalar_valid_range_start(1)]
|
||||
#[repr(transparent)]
|
||||
pub(crate) struct NonZero<T>(pub(crate) T);
|
||||
fn main() {}
|
||||
|
||||
const fn foo() -> NonZero<u32> {
|
||||
let mut x = unsafe { NonZero(1) };
|
||||
x.0 = 0; //~ ERROR statements in constant functions are unstable
|
||||
//~^ ERROR mutation of layout constrained field is unsafe
|
||||
x
|
||||
}
|
||||
|
||||
const fn bar() -> NonZero<u32> {
|
||||
let mut x = unsafe { NonZero(1) };
|
||||
unsafe { x.0 = 0 }; //~ ERROR statements in constant functions are unstable
|
||||
x
|
||||
}
|
||||
28
src/test/ui/unsafe/ranged_ints4_const.stderr
Normal file
28
src/test/ui/unsafe/ranged_ints4_const.stderr
Normal file
|
|
@ -0,0 +1,28 @@
|
|||
error[E0658]: statements in constant functions are unstable (see issue #48821)
|
||||
--> $DIR/ranged_ints4_const.rs:10:5
|
||||
|
|
||||
LL | x.0 = 0; //~ ERROR statements in constant functions are unstable
|
||||
| ^^^^^^^
|
||||
|
|
||||
= help: add #![feature(const_let)] to the crate attributes to enable
|
||||
|
||||
error[E0658]: statements in constant functions are unstable (see issue #48821)
|
||||
--> $DIR/ranged_ints4_const.rs:17:14
|
||||
|
|
||||
LL | unsafe { x.0 = 0 }; //~ ERROR statements in constant functions are unstable
|
||||
| ^^^^^^^
|
||||
|
|
||||
= help: add #![feature(const_let)] to the crate attributes to enable
|
||||
|
||||
error[E0133]: mutation of layout constrained field is unsafe and requires unsafe function or block
|
||||
--> $DIR/ranged_ints4_const.rs:10:5
|
||||
|
|
||||
LL | x.0 = 0; //~ ERROR statements in constant functions are unstable
|
||||
| ^^^^^^^ mutation of layout constrained field
|
||||
|
|
||||
= note: mutating layout constrained fields cannot statically be checked for valid values
|
||||
|
||||
error: aborting due to 3 previous errors
|
||||
|
||||
Some errors occurred: E0133, E0658.
|
||||
For more information about an error, try `rustc --explain E0133`.
|
||||
11
src/test/ui/unsafe/ranged_ints_const.rs
Normal file
11
src/test/ui/unsafe/ranged_ints_const.rs
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
#![feature(rustc_attrs)]
|
||||
|
||||
#[rustc_layout_scalar_valid_range_start(1)]
|
||||
#[repr(transparent)]
|
||||
pub(crate) struct NonZero<T>(pub(crate) T);
|
||||
fn main() {}
|
||||
|
||||
const fn foo() -> NonZero<u32> { NonZero(0) }
|
||||
//~^ ERROR initializing type with `rustc_layout_scalar_valid_range` attr is unsafe
|
||||
|
||||
const fn bar() -> NonZero<u32> { unsafe { NonZero(0) } }
|
||||
11
src/test/ui/unsafe/ranged_ints_const.stderr
Normal file
11
src/test/ui/unsafe/ranged_ints_const.stderr
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
error[E0133]: initializing type with `rustc_layout_scalar_valid_range` attr is unsafe and requires unsafe function or block
|
||||
--> $DIR/ranged_ints_const.rs:8:34
|
||||
|
|
||||
LL | const fn foo() -> NonZero<u32> { NonZero(0) }
|
||||
| ^^^^^^^^^^ initializing type with `rustc_layout_scalar_valid_range` attr
|
||||
|
|
||||
= note: initializing a layout restricted type's field with a value outside the valid range is undefined behavior
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0133`.
|
||||
Loading…
Add table
Add a link
Reference in a new issue