about summary refs log tree commit diff
diff options
context:
space:
mode:
authorYuki Okushi <huyuumi.dev@gmail.com>2021-03-07 10:41:09 +0900
committerGitHub <noreply@github.com>2021-03-07 10:41:09 +0900
commit0adc1965218bb24290c74f680d94c20799ff8f70 (patch)
tree6fc08a14292d837ed3145c579895c6f91fb36d7e
parentd1dc16623f9e143ec67b41e8392ae8906abb44e0 (diff)
parent79c2b75e88bdab5fccd7d63750ef11aff2f8eaba (diff)
Rollup merge of #82130 - jhpratt:const-option-result, r=RalfJung
Make some Option, Result methods unstably const

The following methods are now unstably const:

- Option::transpose
- Option::flatten
- Result::flatten

While some methods for could likely be made `const` in the future, nearly all of them require something to be dropped at compile-time, which isn't currently supported. The functions listed above should have a trivial path to stabilization.
-rw-r--r--library/core/src/option.rs13
-rw-r--r--library/core/src/result.rs3
2 files changed, 11 insertions, 5 deletions
diff --git a/library/core/src/option.rs b/library/core/src/option.rs
index bcd2b207c4f..e3c812a047c 100644
--- a/library/core/src/option.rs
+++ b/library/core/src/option.rs
@@ -150,7 +150,7 @@
 use crate::iter::{FromIterator, FusedIterator, TrustedLen};
 use crate::pin::Pin;
 use crate::{
-    convert, fmt, hint, mem,
+    fmt, hint, mem,
     ops::{self, Deref, DerefMut},
 };
 
@@ -1275,7 +1275,8 @@ impl<T, E> Option<Result<T, E>> {
     /// ```
     #[inline]
     #[stable(feature = "transpose_result", since = "1.33.0")]
-    pub fn transpose(self) -> Result<Option<T>, E> {
+    #[rustc_const_unstable(feature = "const_option", issue = "67441")]
+    pub const fn transpose(self) -> Result<Option<T>, E> {
         match self {
             Some(Ok(x)) => Ok(Some(x)),
             Some(Err(e)) => Err(e),
@@ -1750,7 +1751,11 @@ impl<T> Option<Option<T>> {
     /// ```
     #[inline]
     #[stable(feature = "option_flattening", since = "1.40.0")]
-    pub fn flatten(self) -> Option<T> {
-        self.and_then(convert::identity)
+    #[rustc_const_unstable(feature = "const_option", issue = "67441")]
+    pub const fn flatten(self) -> Option<T> {
+        match self {
+            Some(inner) => inner,
+            None => None,
+        }
     }
 }
diff --git a/library/core/src/result.rs b/library/core/src/result.rs
index 7c48b8e41c6..2ce8a703c12 100644
--- a/library/core/src/result.rs
+++ b/library/core/src/result.rs
@@ -1233,7 +1233,8 @@ impl<T, E> Result<Option<T>, E> {
     /// ```
     #[inline]
     #[stable(feature = "transpose_result", since = "1.33.0")]
-    pub fn transpose(self) -> Option<Result<T, E>> {
+    #[rustc_const_unstable(feature = "const_result", issue = "82814")]
+    pub const fn transpose(self) -> Option<Result<T, E>> {
         match self {
             Ok(Some(x)) => Some(Ok(x)),
             Ok(None) => None,