forked from rust-lang/rust
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add tests for stable unsafe features in const fn
- Loading branch information
Showing
12 changed files
with
160 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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) } | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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`. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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)) } | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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`. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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 | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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`. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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) } } |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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`. |