Skip to content

Commit

Permalink
Auto merge of rust-lang#86853 - usbalbin:const_try, r=oli-obk
Browse files Browse the repository at this point in the history
Constify ?-operator for Result and Option

Try to make `?`-operator usable in `const fn` with `Result` and `Option`, see rust-lang#74935 . Note that the try-operator itself was constified in rust-lang#87237.

TODO
* [x] Add tests for const T -> T conversions
* [x] cleanup commits
* [x] Remove `#![allow(incomplete_features)]`
* [?] Await decision in rust-lang#86808 - I'm not sure
* [x] Await support for parsing `~const` in bootstrapping compiler
* [x] Tracking issue(s)? - rust-lang#88674
  • Loading branch information
bors committed Sep 30, 2021
2 parents 69c1c6a + 29029c0 commit c6007fd
Show file tree
Hide file tree
Showing 7 changed files with 58 additions and 8 deletions.
8 changes: 5 additions & 3 deletions library/core/src/convert/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -532,9 +532,10 @@ where

// From implies Into
#[stable(feature = "rust1", since = "1.0.0")]
impl<T, U> Into<U> for T
#[rustc_const_unstable(feature = "const_convert", issue = "88674")]
impl<T, U> const Into<U> for T
where
U: From<T>,
U: ~const From<T>,
{
fn into(self) -> U {
U::from(self)
Expand All @@ -543,7 +544,8 @@ where

// From (and thus Into) is reflexive
#[stable(feature = "rust1", since = "1.0.0")]
impl<T> From<T> for T {
#[rustc_const_unstable(feature = "const_convert", issue = "88674")]
impl<T> const From<T> for T {
fn from(t: T) -> T {
t
}
Expand Down
1 change: 1 addition & 0 deletions library/core/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,7 @@
#![feature(const_float_bits_conv)]
#![feature(const_float_classify)]
#![feature(const_heap)]
#![feature(const_convert)]
#![feature(const_inherent_unchecked_arith)]
#![feature(const_int_unchecked_arith)]
#![feature(const_intrinsic_copy)]
Expand Down
6 changes: 4 additions & 2 deletions library/core/src/option.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2019,7 +2019,8 @@ impl<A, V: FromIterator<A>> FromIterator<Option<A>> for Option<V> {
}

#[unstable(feature = "try_trait_v2", issue = "84277")]
impl<T> ops::Try for Option<T> {
#[rustc_const_unstable(feature = "const_convert", issue = "88674")]
impl<T> const ops::Try for Option<T> {
type Output = T;
type Residual = Option<convert::Infallible>;

Expand All @@ -2038,7 +2039,8 @@ impl<T> ops::Try for Option<T> {
}

#[unstable(feature = "try_trait_v2", issue = "84277")]
impl<T> ops::FromResidual for Option<T> {
#[rustc_const_unstable(feature = "const_convert", issue = "88674")]
impl<T> const ops::FromResidual for Option<T> {
#[inline]
fn from_residual(residual: Option<convert::Infallible>) -> Self {
match residual {
Expand Down
8 changes: 6 additions & 2 deletions library/core/src/result.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1889,7 +1889,8 @@ impl<A, E, V: FromIterator<A>> FromIterator<Result<A, E>> for Result<V, E> {
}

#[unstable(feature = "try_trait_v2", issue = "84277")]
impl<T, E> ops::Try for Result<T, E> {
#[rustc_const_unstable(feature = "const_convert", issue = "88674")]
impl<T, E> const ops::Try for Result<T, E> {
type Output = T;
type Residual = Result<convert::Infallible, E>;

Expand All @@ -1908,7 +1909,10 @@ impl<T, E> ops::Try for Result<T, E> {
}

#[unstable(feature = "try_trait_v2", issue = "84277")]
impl<T, E, F: From<E>> ops::FromResidual<Result<convert::Infallible, E>> for Result<T, F> {
#[rustc_const_unstable(feature = "const_convert", issue = "88674")]
impl<T, E, F: ~const From<E>> const ops::FromResidual<Result<convert::Infallible, E>>
for Result<T, F>
{
#[inline]
fn from_residual(residual: Result<convert::Infallible, E>) -> Self {
match residual {
Expand Down
16 changes: 16 additions & 0 deletions library/core/tests/convert.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
#[test]
fn convert() {
const fn from(x: i32) -> i32 {
i32::from(x)
}

const FOO: i32 = from(42);
assert_eq!(FOO, 42);

const fn into(x: Vec<String>) -> Vec<String> {
x.into()
}

const BAR: Vec<String> = into(Vec::new());
assert_eq!(BAR, Vec::<String>::new());
}
4 changes: 3 additions & 1 deletion library/core/tests/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,13 @@
#![feature(cfg_target_has_atomic)]
#![feature(const_assume)]
#![feature(const_cell_into_inner)]
#![feature(const_convert)]
#![feature(const_maybe_uninit_assume_init)]
#![feature(const_num_from_num)]
#![feature(const_ptr_read)]
#![feature(const_ptr_write)]
#![feature(const_ptr_offset)]
#![feature(const_trait_impl)]
#![feature(const_num_from_num)]
#![feature(core_intrinsics)]
#![feature(core_private_bignum)]
#![feature(core_private_diy_float)]
Expand Down Expand Up @@ -83,6 +84,7 @@ mod char;
mod clone;
mod cmp;
mod const_ptr;
mod convert;
mod fmt;
mod hash;
mod intrinsics;
Expand Down
23 changes: 23 additions & 0 deletions src/test/ui/consts/try-operator.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
// run-pass

#![feature(try_trait_v2)]
#![feature(const_trait_impl)]
#![feature(const_try)]
#![feature(const_convert)]

fn main() {
const fn result() -> Result<bool, ()> {
Err(())?;
Ok(true)
}

const FOO: Result<bool, ()> = result();
assert_eq!(Err(()), FOO);

const fn option() -> Option<()> {
None?;
Some(())
}
const BAR: Option<()> = option();
assert_eq!(None, BAR);
}

0 comments on commit c6007fd

Please sign in to comment.