Skip to content

Commit

Permalink
Auto merge of #74956 - ecstatic-morse:const-option-unwrap, r=oli-obk
Browse files Browse the repository at this point in the history
Make `Option::unwrap` unstably const

This is lumped into the `const_option` feature gate (#67441), which enables a potpourri of `Option` methods.

cc @rust-lang/wg-const-eval

r? @oli-obk
  • Loading branch information
bors committed Jul 31, 2020
2 parents ac91673 + 96c84ac commit 3a92b99
Show file tree
Hide file tree
Showing 4 changed files with 37 additions and 1 deletion.
1 change: 1 addition & 0 deletions library/core/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,7 @@
#![feature(const_fn_union)]
#![feature(const_generics)]
#![feature(const_option)]
#![feature(const_precise_live_drops)]
#![feature(const_ptr_offset)]
#![feature(const_ptr_offset_from)]
#![feature(const_raw_ptr_comparison)]
Expand Down
3 changes: 2 additions & 1 deletion library/core/src/option.rs
Original file line number Diff line number Diff line change
Expand Up @@ -380,7 +380,8 @@ impl<T> Option<T> {
#[inline]
#[track_caller]
#[stable(feature = "rust1", since = "1.0.0")]
pub fn unwrap(self) -> T {
#[rustc_const_unstable(feature = "const_option", issue = "67441")]
pub const fn unwrap(self) -> T {
match self {
Some(val) => val,
None => panic!("called `Option::unwrap()` on a `None` value"),
Expand Down
14 changes: 14 additions & 0 deletions src/test/ui/consts/const-unwrap.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
// check-fail

#![feature(const_option)]

const FOO: i32 = Some(42i32).unwrap();

// This causes an error, but it is attributed to the `panic` *inside* `Option::unwrap` (maybe due
// to `track_caller`?). A note points to the originating `const`.
const BAR: i32 = Option::<i32>::None.unwrap(); //~ NOTE

fn main() {
println!("{}", FOO);
println!("{}", BAR);
}
20 changes: 20 additions & 0 deletions src/test/ui/consts/const-unwrap.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
error: any use of this value will cause an error
--> $SRC_DIR/core/src/option.rs:LL:COL
|
LL | None => panic!("called `Option::unwrap()` on a `None` value"),
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
| |
| the evaluated program panicked at 'called `Option::unwrap()` on a `None` value', $DIR/const-unwrap.rs:9:38
| inside `std::option::Option::<i32>::unwrap` at $SRC_DIR/core/src/macros/mod.rs:LL:COL
| inside `BAR` at $DIR/const-unwrap.rs:9:18
|
::: $DIR/const-unwrap.rs:9:1
|
LL | const BAR: i32 = Option::<i32>::None.unwrap();
| ----------------------------------------------
|
= note: `#[deny(const_err)]` on by default
= note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info)

error: aborting due to previous error

0 comments on commit 3a92b99

Please sign in to comment.