-
Notifications
You must be signed in to change notification settings - Fork 12.7k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Rollup merge of #90687 - jhpratt:const_panic, r=oli-obk
Permit const panics in stable const contexts in stdlib Without this change, it is not possible to use `panic!` and similar (including `assert!`) in stable const contexts inside of stdlib. See #89542 for a real-world case that currently fails for this reason. This does _not_ affect any user code. For example, this snippet currently fails to compile: ```rust #[stable(feature = "foo", since = "1.0.0")] #[rustc_const_stable(feature = "foo", since = "1.0.0")] const fn foo() { assert!(false); assert!(false, "foo"); } ``` With the addition of `#[rustc_const_unstable]` to `core::panicking::panic`, the error no longer occurs. This snippet has been added verbatim in this PR as a UI test. To avoid needing to add `#![feature(core_panic)]` to libcore, the two instances of direct calls to `core::panicking::panic` have been switched to use the `panic!` macro. I am requesting prioritization because this is holding up other stabilizations such as #89542 (which is otherwise ready to merge and succeeds with this change)
- Loading branch information
Showing
5 changed files
with
49 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
16 changes: 16 additions & 0 deletions
16
src/test/ui/consts/const-eval/const_panic_stability.e2018.stderr
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,16 @@ | ||
warning: panic message is not a string literal | ||
--> $DIR/const_panic_stability.rs:14:12 | ||
| | ||
LL | panic!({ "foo" }); | ||
| ^^^^^^^^^ | ||
| | ||
= note: `#[warn(non_fmt_panics)]` on by default | ||
= note: this usage of panic!() is deprecated; it will be a hard error in Rust 2021 | ||
= note: for more information, see <https://doc.rust-lang.org/nightly/edition-guide/rust-2021/panic-macro-consistency.html> | ||
help: add a "{}" format string to Display the message | ||
| | ||
LL | panic!("{}", { "foo" }); | ||
| +++++ | ||
|
||
warning: 1 warning emitted | ||
|
13 changes: 13 additions & 0 deletions
13
src/test/ui/consts/const-eval/const_panic_stability.e2021.stderr
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,13 @@ | ||
error: format argument must be a string literal | ||
--> $DIR/const_panic_stability.rs:14:12 | ||
| | ||
LL | panic!({ "foo" }); | ||
| ^^^^^^^^^ | ||
| | ||
help: you might be missing a string literal to format with | ||
| | ||
LL | panic!("{}", { "foo" }); | ||
| +++++ | ||
|
||
error: aborting due to previous error | ||
|
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,17 @@ | ||
// revisions: e2018 e2021 | ||
//[e2018] edition:2018 | ||
//[e2021] edition:2021 | ||
//[e2018] check-pass | ||
#![crate_type = "lib"] | ||
#![stable(feature = "foo", since = "1.0.0")] | ||
#![feature(staged_api)] | ||
|
||
#[stable(feature = "foo", since = "1.0.0")] | ||
#[rustc_const_stable(feature = "foo", since = "1.0.0")] | ||
const fn foo() { | ||
assert!(false); | ||
assert!(false, "foo"); | ||
panic!({ "foo" }); | ||
//[e2018]~^ WARNING panic message is not a string literal | ||
//[e2021]~^^ ERROR format argument must be a string literal | ||
} |