From c25f25f7f18728eef288c45f77477232b9c5d203 Mon Sep 17 00:00:00 2001
From: Lzu Tao <taolzu@gmail.com>
Date: Thu, 30 Jul 2020 15:32:25 +0000
Subject: [PATCH] Stabilize as_deref and as_deref on Result

---
 library/core/src/result.rs                                 | 7 ++-----
 library/core/tests/lib.rs                                  | 1 -
 library/proc_macro/src/lib.rs                              | 1 -
 src/librustc_builtin_macros/lib.rs                         | 1 -
 .../issue-50264-inner-deref-trait/result-as_deref.rs       | 2 --
 .../issue-50264-inner-deref-trait/result-as_deref.stderr   | 2 +-
 .../issue-50264-inner-deref-trait/result-as_deref_mut.rs   | 2 --
 .../result-as_deref_mut.stderr                             | 4 ++--
 8 files changed, 5 insertions(+), 15 deletions(-)

diff --git a/library/core/src/result.rs b/library/core/src/result.rs
index c06b8965c75..e68dbf5215f 100644
--- a/library/core/src/result.rs
+++ b/library/core/src/result.rs
@@ -1145,7 +1145,6 @@ impl<T, E: Into<!>> Result<T, E> {
     }
 }
 
-#[unstable(feature = "inner_deref", issue = "50264")]
 impl<T: Deref, E> Result<T, E> {
     /// Converts from `Result<T, E>` (or `&Result<T, E>`) to `Result<&<T as Deref>::Target, &E>`.
     ///
@@ -1155,7 +1154,6 @@ impl<T: Deref, E> Result<T, E> {
     /// # Examples
     ///
     /// ```
-    /// #![feature(inner_deref)]
     /// let x: Result<String, u32> = Ok("hello".to_string());
     /// let y: Result<&str, &u32> = Ok("hello");
     /// assert_eq!(x.as_deref(), y);
@@ -1164,13 +1162,12 @@ impl<T: Deref, E> Result<T, E> {
     /// let y: Result<&str, &u32> = Err(&42);
     /// assert_eq!(x.as_deref(), y);
     /// ```
+    #[stable(feature = "inner_deref", since = "1.47.0")]
     pub fn as_deref(&self) -> Result<&T::Target, &E> {
         self.as_ref().map(|t| t.deref())
     }
 }
 
-
-#[unstable(feature = "inner_deref", issue = "50264")]
 impl<T: DerefMut, E> Result<T, E> {
     /// Converts from `Result<T, E>` (or `&mut Result<T, E>`) to `Result<&mut <T as DerefMut>::Target, &mut E>`.
     ///
@@ -1180,7 +1177,6 @@ impl<T: DerefMut, E> Result<T, E> {
     /// # Examples
     ///
     /// ```
-    /// #![feature(inner_deref)]
     /// let mut s = "HELLO".to_string();
     /// let mut x: Result<String, u32> = Ok("hello".to_string());
     /// let y: Result<&mut str, &mut u32> = Ok(&mut s);
@@ -1191,6 +1187,7 @@ impl<T: DerefMut, E> Result<T, E> {
     /// let y: Result<&mut str, &mut u32> = Err(&mut i);
     /// assert_eq!(x.as_deref_mut().map(|x| { x.make_ascii_uppercase(); x }), y);
     /// ```
+    #[stable(feature = "inner_deref", since = "1.47.0")]
     pub fn as_deref_mut(&mut self) -> Result<&mut T::Target, &mut E> {
         self.as_mut().map(|t| t.deref_mut())
     }
diff --git a/library/core/tests/lib.rs b/library/core/tests/lib.rs
index 47ed6db6c67..fbd25304103 100644
--- a/library/core/tests/lib.rs
+++ b/library/core/tests/lib.rs
@@ -26,7 +26,6 @@
 #![feature(test)]
 #![feature(trusted_len)]
 #![feature(try_trait)]
-#![feature(inner_deref)]
 #![feature(slice_internals)]
 #![feature(slice_partition_dedup)]
 #![feature(int_error_matching)]
diff --git a/library/proc_macro/src/lib.rs b/library/proc_macro/src/lib.rs
index c050a3c591c..42ba7f5c025 100644
--- a/library/proc_macro/src/lib.rs
+++ b/library/proc_macro/src/lib.rs
@@ -24,7 +24,6 @@
 #![feature(decl_macro)]
 #![feature(extern_types)]
 #![feature(in_band_lifetimes)]
-#![feature(inner_deref)]
 #![feature(negative_impls)]
 #![feature(optin_builtin_traits)]
 #![feature(restricted_std)]
diff --git a/src/librustc_builtin_macros/lib.rs b/src/librustc_builtin_macros/lib.rs
index 173a823dc7d..87be6d1743a 100644
--- a/src/librustc_builtin_macros/lib.rs
+++ b/src/librustc_builtin_macros/lib.rs
@@ -5,7 +5,6 @@
 #![feature(bool_to_option)]
 #![feature(crate_visibility_modifier)]
 #![feature(decl_macro)]
-#![feature(inner_deref)]
 #![feature(nll)]
 #![feature(or_patterns)]
 #![feature(proc_macro_internals)]
diff --git a/src/test/ui/issues/issue-50264-inner-deref-trait/result-as_deref.rs b/src/test/ui/issues/issue-50264-inner-deref-trait/result-as_deref.rs
index 1d5eabd6170..f713dee507f 100644
--- a/src/test/ui/issues/issue-50264-inner-deref-trait/result-as_deref.rs
+++ b/src/test/ui/issues/issue-50264-inner-deref-trait/result-as_deref.rs
@@ -1,5 +1,3 @@
-#![feature(inner_deref)]
-
 fn main() {
     let _result = &Ok(42).as_deref();
 //~^ ERROR no method named `as_deref` found
diff --git a/src/test/ui/issues/issue-50264-inner-deref-trait/result-as_deref.stderr b/src/test/ui/issues/issue-50264-inner-deref-trait/result-as_deref.stderr
index f33e9c7823e..96524c30959 100644
--- a/src/test/ui/issues/issue-50264-inner-deref-trait/result-as_deref.stderr
+++ b/src/test/ui/issues/issue-50264-inner-deref-trait/result-as_deref.stderr
@@ -1,5 +1,5 @@
 error[E0599]: no method named `as_deref` found for enum `std::result::Result<{integer}, _>` in the current scope
-  --> $DIR/result-as_deref.rs:4:27
+  --> $DIR/result-as_deref.rs:2:27
    |
 LL |     let _result = &Ok(42).as_deref();
    |                           ^^^^^^^^ help: there is an associated function with a similar name: `as_ref`
diff --git a/src/test/ui/issues/issue-50264-inner-deref-trait/result-as_deref_mut.rs b/src/test/ui/issues/issue-50264-inner-deref-trait/result-as_deref_mut.rs
index c897ab3531f..3af7033dd5d 100644
--- a/src/test/ui/issues/issue-50264-inner-deref-trait/result-as_deref_mut.rs
+++ b/src/test/ui/issues/issue-50264-inner-deref-trait/result-as_deref_mut.rs
@@ -1,5 +1,3 @@
-#![feature(inner_deref)]
-
 fn main() {
     let _result = &mut Ok(42).as_deref_mut();
 //~^ ERROR no method named `as_deref_mut` found
diff --git a/src/test/ui/issues/issue-50264-inner-deref-trait/result-as_deref_mut.stderr b/src/test/ui/issues/issue-50264-inner-deref-trait/result-as_deref_mut.stderr
index d2ba1049b76..73266bc7f68 100644
--- a/src/test/ui/issues/issue-50264-inner-deref-trait/result-as_deref_mut.stderr
+++ b/src/test/ui/issues/issue-50264-inner-deref-trait/result-as_deref_mut.stderr
@@ -1,8 +1,8 @@
 error[E0599]: no method named `as_deref_mut` found for enum `std::result::Result<{integer}, _>` in the current scope
-  --> $DIR/result-as_deref_mut.rs:4:31
+  --> $DIR/result-as_deref_mut.rs:2:31
    |
 LL |     let _result = &mut Ok(42).as_deref_mut();
-   |                               ^^^^^^^^^^^^ help: there is an associated function with a similar name: `as_deref_err`
+   |                               ^^^^^^^^^^^^ method not found in `std::result::Result<{integer}, _>`
    |
    = note: the method `as_deref_mut` exists but the following trait bounds were not satisfied:
            `{integer}: std::ops::DerefMut`