]> git.lizzy.rs Git - rust.git/commitdiff
std: Stabilize APIs for the 1.12 release
authorAlex Crichton <alex@alexcrichton.com>
Thu, 11 Aug 2016 21:08:24 +0000 (14:08 -0700)
committerAlex Crichton <alex@alexcrichton.com>
Fri, 19 Aug 2016 18:59:56 +0000 (11:59 -0700)
Stabilized

* `Cell::as_ptr`
* `RefCell::as_ptr`
* `IpAddr::is_{unspecified,loopback,multicast}`
* `Ipv6Addr::octets`
* `LinkedList::contains`
* `VecDeque::contains`
* `ExitStatusExt::from_raw` - both on Unix and Windows
* `Receiver::recv_timeout`
* `RecvTimeoutError`
* `BinaryHeap::peek_mut`
* `PeekMut`
* `iter::Product`
* `iter::Sum`
* `OccupiedEntry::remove_entry`
* `VacantEntry::into_key`

Deprecated

* `Cell::as_unsafe_cell`
* `RefCell::as_unsafe_cell`
* `OccupiedEntry::remove_pair`

Closes #27708
cc #27709
Closes #32313
Closes #32630
Closes #32713
Closes #34029
Closes #34392
Closes #34285
Closes #34529

15 files changed:
src/libcollections/binary_heap.rs
src/libcollections/btree/map.rs
src/libcollections/linked_list.rs
src/libcollections/vec_deque.rs
src/libcollectionstest/lib.rs
src/libcore/cell.rs
src/libcore/iter/traits.rs
src/libcoretest/cell.rs
src/libcoretest/lib.rs
src/libstd/collections/hash/map.rs
src/libstd/net/ip.rs
src/libstd/sync/mpsc/mod.rs
src/libstd/sys/unix/ext/process.rs
src/libstd/sys/windows/ext/process.rs
src/libtest/lib.rs

index b9f5c6fcab9092a3d4565c5980a82f65888ff664..fe9b60c393f09af46bda32f2c1d1c18951b0add4 100644 (file)
@@ -223,19 +223,19 @@ pub struct BinaryHeap<T> {
 /// on `BinaryHeap`. See its documentation for details.
 ///
 /// [`peek_mut()`]: struct.BinaryHeap.html#method.peek_mut
-#[unstable(feature = "binary_heap_peek_mut", issue = "34392")]
+#[stable(feature = "binary_heap_peek_mut", since = "1.12.0")]
 pub struct PeekMut<'a, T: 'a + Ord> {
     heap: &'a mut BinaryHeap<T>
 }
 
-#[unstable(feature = "binary_heap_peek_mut", issue = "34392")]
+#[stable(feature = "binary_heap_peek_mut", since = "1.12.0")]
 impl<'a, T: Ord> Drop for PeekMut<'a, T> {
     fn drop(&mut self) {
         self.heap.sift_down(0);
     }
 }
 
-#[unstable(feature = "binary_heap_peek_mut", issue = "34392")]
+#[stable(feature = "binary_heap_peek_mut", since = "1.12.0")]
 impl<'a, T: Ord> Deref for PeekMut<'a, T> {
     type Target = T;
     fn deref(&self) -> &T {
@@ -243,7 +243,7 @@ fn deref(&self) -> &T {
     }
 }
 
-#[unstable(feature = "binary_heap_peek_mut", issue = "34392")]
+#[stable(feature = "binary_heap_peek_mut", since = "1.12.0")]
 impl<'a, T: Ord> DerefMut for PeekMut<'a, T> {
     fn deref_mut(&mut self) -> &mut T {
         &mut self.heap.data[0]
@@ -366,7 +366,6 @@ pub fn peek(&self) -> Option<&T> {
     /// Basic usage:
     ///
     /// ```
-    /// #![feature(binary_heap_peek_mut)]
     /// use std::collections::BinaryHeap;
     /// let mut heap = BinaryHeap::new();
     /// assert!(heap.peek_mut().is_none());
@@ -380,7 +379,7 @@ pub fn peek(&self) -> Option<&T> {
     /// }
     /// assert_eq!(heap.peek(), Some(&2));
     /// ```
-    #[unstable(feature = "binary_heap_peek_mut", issue = "34392")]
+    #[stable(feature = "binary_heap_peek_mut", since = "1.12.0")]
     pub fn peek_mut(&mut self) -> Option<PeekMut<T>> {
         if self.is_empty() {
             None
index c3a7d4023754aac97d45a0539a9cf0e4a8cfe490..a2e2ad37acb848e44fbd011379a8704891ae8550 100644 (file)
@@ -1981,8 +1981,6 @@ pub fn key(&self) -> &K {
     /// # Examples
     ///
     /// ```
-    /// #![feature(map_entry_recover_keys)]
-    ///
     /// use std::collections::BTreeMap;
     /// use std::collections::btree_map::Entry;
     ///
@@ -1992,7 +1990,7 @@ pub fn key(&self) -> &K {
     ///     v.into_key();
     /// }
     /// ```
-    #[unstable(feature = "map_entry_recover_keys", issue = "34285")]
+    #[stable(feature = "map_entry_recover_keys2", since = "1.12.0")]
     pub fn into_key(self) -> K {
         self.key
     }
@@ -2074,13 +2072,18 @@ pub fn key(&self) -> &K {
         self.handle.reborrow().into_kv().0
     }
 
+    /// Deprecated, renamed to `remove_entry`
+    #[unstable(feature = "map_entry_recover_keys", issue = "34285")]
+    #[rustc_deprecated(since = "1.12.0", reason = "renamed to `remove_entry`")]
+    pub fn remove_pair(self) -> (K, V) {
+        self.remove_entry()
+    }
+
     /// Take ownership of the key and value from the map.
     ///
     /// # Examples
     ///
     /// ```
-    /// #![feature(map_entry_recover_keys)]
-    ///
     /// use std::collections::BTreeMap;
     /// use std::collections::btree_map::Entry;
     ///
@@ -2089,14 +2092,14 @@ pub fn key(&self) -> &K {
     ///
     /// if let Entry::Occupied(o) = map.entry("poneyland") {
     ///     // We delete the entry from the map.
-    ///     o.remove_pair();
+    ///     o.remove_entry();
     /// }
     ///
     /// // If now try to get the value, it will panic:
     /// // println!("{}", map["poneyland"]);
     /// ```
-    #[unstable(feature = "map_entry_recover_keys", issue = "34285")]
-    pub fn remove_pair(self) -> (K, V) {
+    #[stable(feature = "map_entry_recover_keys2", since = "1.12.0")]
+    pub fn remove_entry(self) -> (K, V) {
         self.remove_kv()
     }
 
index 6842f02e0e19b1732d3ded4cc9a169f09c46b5c0..73aa67849fd2aaf0e976a34d5977cd55108a1f85 100644 (file)
@@ -379,8 +379,6 @@ pub fn clear(&mut self) {
     /// # Examples
     ///
     /// ```
-    /// #![feature(linked_list_contains)]
-    ///
     /// use std::collections::LinkedList;
     ///
     /// let mut list: LinkedList<u32> = LinkedList::new();
@@ -392,8 +390,7 @@ pub fn clear(&mut self) {
     /// assert_eq!(list.contains(&0), true);
     /// assert_eq!(list.contains(&10), false);
     /// ```
-    #[unstable(feature = "linked_list_contains", reason = "recently added",
-               issue = "32630")]
+    #[stable(feature = "linked_list_contains", since = "1.12.0")]
     pub fn contains(&self, x: &T) -> bool
         where T: PartialEq<T>
     {
index 812a67a7e78edd9107145e3dddbadc4670ee7ab3..ce5635714b5b898ca3b2c5f113692b00f0dca299 100644 (file)
@@ -939,8 +939,6 @@ pub fn clear(&mut self) {
     /// # Examples
     ///
     /// ```
-    /// #![feature(vec_deque_contains)]
-    ///
     /// use std::collections::VecDeque;
     ///
     /// let mut vector: VecDeque<u32> = VecDeque::new();
@@ -951,8 +949,7 @@ pub fn clear(&mut self) {
     /// assert_eq!(vector.contains(&1), true);
     /// assert_eq!(vector.contains(&10), false);
     /// ```
-    #[unstable(feature = "vec_deque_contains", reason = "recently added",
-               issue = "32630")]
+    #[stable(feature = "vec_deque_contains", since = "1.12.0")]
     pub fn contains(&self, x: &T) -> bool
         where T: PartialEq<T>
     {
index ab3231b2b9955e693540cd5f111a5961b934c632..f448fcf2dbf993862dd7df86b9def02e7a86b3e3 100644 (file)
@@ -11,7 +11,6 @@
 #![deny(warnings)]
 
 #![feature(binary_heap_extras)]
-#![feature(binary_heap_peek_mut)]
 #![feature(box_syntax)]
 #![feature(btree_range)]
 #![feature(collections)]
@@ -19,7 +18,6 @@
 #![feature(const_fn)]
 #![feature(fn_traits)]
 #![feature(enumset)]
-#![feature(linked_list_contains)]
 #![feature(pattern)]
 #![feature(rand)]
 #![feature(step_by)]
@@ -27,7 +25,6 @@
 #![feature(test)]
 #![feature(unboxed_closures)]
 #![feature(unicode)]
-#![feature(vec_deque_contains)]
 #![feature(vec_into_iter_as_slice)]
 
 extern crate collections;
index 17ec325e257b028f43ca709041f1769829309500..a388012e1daf2cd80e69ed5b5bf5576949230206 100644 (file)
@@ -233,10 +233,28 @@ pub fn set(&self, value: T) {
     /// ```
     #[inline]
     #[unstable(feature = "as_unsafe_cell", issue = "27708")]
+    #[rustc_deprecated(since = "1.12.0", reason = "renamed to as_ptr")]
     pub fn as_unsafe_cell(&self) -> &UnsafeCell<T> {
         &self.value
     }
 
+    /// Returns a raw pointer to the underlying data in this cell.
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// use std::cell::Cell;
+    ///
+    /// let c = Cell::new(5);
+    ///
+    /// let ptr = c.as_ptr();
+    /// ```
+    #[inline]
+    #[stable(feature = "cell_as_ptr", since = "1.12.0")]
+    pub fn as_ptr(&self) -> *mut T {
+        self.value.get()
+    }
+
     /// Returns a mutable reference to the underlying data.
     ///
     /// This call borrows `Cell` mutably (at compile-time) which guarantees
@@ -653,10 +671,28 @@ pub fn try_borrow_mut(&self) -> Result<RefMut<T>, BorrowMutError<T>> {
     /// ```
     #[inline]
     #[unstable(feature = "as_unsafe_cell", issue = "27708")]
+    #[rustc_deprecated(since = "1.12.0", reason = "renamed to as_ptr")]
     pub unsafe fn as_unsafe_cell(&self) -> &UnsafeCell<T> {
         &self.value
     }
 
+    /// Returns a raw pointer to the underlying data in this cell.
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// use std::cell::RefCell;
+    ///
+    /// let c = RefCell::new(5);
+    ///
+    /// let ptr = c.as_ptr();
+    /// ```
+    #[inline]
+    #[stable(feature = "cell_as_ptr", since = "1.12.0")]
+    pub fn as_ptr(&self) -> *mut T {
+        self.value.get()
+    }
+
     /// Returns a mutable reference to the underlying data.
     ///
     /// This call borrows `RefCell` mutably (at compile-time) so there is no
index 4cbabe3f5edafc1036216b05470c7cd7d5478169..cb509156e325eaf81f27690e957cd2784ed86b84 100644 (file)
@@ -563,10 +563,11 @@ impl<'a, I: ExactSizeIterator + ?Sized> ExactSizeIterator for &'a mut I {}
 /// implement the trait can be generated by the `sum` method. Like
 /// `FromIterator` this trait should rarely be called directly and instead
 /// interacted with through `Iterator::sum`.
-#[unstable(feature = "iter_arith_traits", issue = "34529")]
+#[stable(feature = "iter_arith_traits", since = "1.12.0")]
 pub trait Sum<A = Self>: Sized {
     /// Method which takes an iterator and generates `Self` from the elements by
     /// "summing up" the items.
+    #[stable(feature = "iter_arith_traits", since = "1.12.0")]
     fn sum<I: Iterator<Item=A>>(iter: I) -> Self;
 }
 
@@ -577,16 +578,17 @@ pub trait Sum<A = Self>: Sized {
 /// which implement the trait can be generated by the `product` method. Like
 /// `FromIterator` this trait should rarely be called directly and instead
 /// interacted with through `Iterator::product`.
-#[unstable(feature = "iter_arith_traits", issue = "34529")]
+#[stable(feature = "iter_arith_traits", since = "1.12.0")]
 pub trait Product<A = Self>: Sized {
     /// Method which takes an iterator and generates `Self` from the elements by
     /// multiplying the items.
+    #[stable(feature = "iter_arith_traits", since = "1.12.0")]
     fn product<I: Iterator<Item=A>>(iter: I) -> Self;
 }
 
 macro_rules! integer_sum_product {
     ($($a:ident)*) => ($(
-        #[unstable(feature = "iter_arith_traits", issue = "34529")]
+        #[stable(feature = "iter_arith_traits", since = "1.12.0")]
         impl Sum for $a {
             fn sum<I: Iterator<Item=$a>>(iter: I) -> $a {
                 iter.fold(0, |a, b| {
@@ -595,7 +597,7 @@ fn sum<I: Iterator<Item=$a>>(iter: I) -> $a {
             }
         }
 
-        #[unstable(feature = "iter_arith_traits", issue = "34529")]
+        #[stable(feature = "iter_arith_traits", since = "1.12.0")]
         impl Product for $a {
             fn product<I: Iterator<Item=$a>>(iter: I) -> $a {
                 iter.fold(1, |a, b| {
@@ -604,7 +606,7 @@ fn product<I: Iterator<Item=$a>>(iter: I) -> $a {
             }
         }
 
-        #[unstable(feature = "iter_arith_traits", issue = "34529")]
+        #[stable(feature = "iter_arith_traits", since = "1.12.0")]
         impl<'a> Sum<&'a $a> for $a {
             fn sum<I: Iterator<Item=&'a $a>>(iter: I) -> $a {
                 iter.fold(0, |a, b| {
@@ -613,7 +615,7 @@ fn sum<I: Iterator<Item=&'a $a>>(iter: I) -> $a {
             }
         }
 
-        #[unstable(feature = "iter_arith_traits", issue = "34529")]
+        #[stable(feature = "iter_arith_traits", since = "1.12.0")]
         impl<'a> Product<&'a $a> for $a {
             fn product<I: Iterator<Item=&'a $a>>(iter: I) -> $a {
                 iter.fold(1, |a, b| {
@@ -626,28 +628,28 @@ fn product<I: Iterator<Item=&'a $a>>(iter: I) -> $a {
 
 macro_rules! float_sum_product {
     ($($a:ident)*) => ($(
-        #[unstable(feature = "iter_arith_traits", issue = "34529")]
+        #[stable(feature = "iter_arith_traits", since = "1.12.0")]
         impl Sum for $a {
             fn sum<I: Iterator<Item=$a>>(iter: I) -> $a {
                 iter.fold(0.0, |a, b| a + b)
             }
         }
 
-        #[unstable(feature = "iter_arith_traits", issue = "34529")]
+        #[stable(feature = "iter_arith_traits", since = "1.12.0")]
         impl Product for $a {
             fn product<I: Iterator<Item=$a>>(iter: I) -> $a {
                 iter.fold(1.0, |a, b| a * b)
             }
         }
 
-        #[unstable(feature = "iter_arith_traits", issue = "34529")]
+        #[stable(feature = "iter_arith_traits", since = "1.12.0")]
         impl<'a> Sum<&'a $a> for $a {
             fn sum<I: Iterator<Item=&'a $a>>(iter: I) -> $a {
                 iter.fold(0.0, |a, b| a + *b)
             }
         }
 
-        #[unstable(feature = "iter_arith_traits", issue = "34529")]
+        #[stable(feature = "iter_arith_traits", since = "1.12.0")]
         impl<'a> Product<&'a $a> for $a {
             fn product<I: Iterator<Item=&'a $a>>(iter: I) -> $a {
                 iter.fold(1.0, |a, b| a * *b)
index a635620d12abd3618e3acda562b0c2ed49686153..a7c230ba979beacae2ba90a258ea37f69a44a492 100644 (file)
@@ -176,21 +176,21 @@ fn accessor(&self) -> RefMut<u32> {
 }
 
 #[test]
-fn as_unsafe_cell() {
+fn as_ptr() {
     let c1: Cell<usize> = Cell::new(0);
     c1.set(1);
-    assert_eq!(1, unsafe { *c1.as_unsafe_cell().get() });
+    assert_eq!(1, unsafe { *c1.as_ptr() });
 
     let c2: Cell<usize> = Cell::new(0);
-    unsafe { *c2.as_unsafe_cell().get() = 1; }
+    unsafe { *c2.as_ptr() = 1; }
     assert_eq!(1, c2.get());
 
     let r1: RefCell<usize> = RefCell::new(0);
     *r1.borrow_mut() = 1;
-    assert_eq!(1, unsafe { *r1.as_unsafe_cell().get() });
+    assert_eq!(1, unsafe { *r1.as_ptr() });
 
     let r2: RefCell<usize> = RefCell::new(0);
-    unsafe { *r2.as_unsafe_cell().get() = 1; }
+    unsafe { *r2.as_ptr() = 1; }
     assert_eq!(1, *r2.borrow());
 }
 
index 9428b4096bfeceaa74fdd5ea61d50f1f518bbd7e..9116344c579388d3263534e53fc7557a5772dc65 100644 (file)
@@ -10,7 +10,6 @@
 
 #![deny(warnings)]
 
-#![feature(as_unsafe_cell)]
 #![feature(borrow_state)]
 #![feature(box_syntax)]
 #![feature(cell_extras)]
index cf6f76f914a158f4cfca3f0f6c92b6c62c66e681..3d3e3941bac1f9748a79e62ce0532f9bd0a64435 100644 (file)
@@ -1640,13 +1640,18 @@ pub fn key(&self) -> &K {
         self.elem.read().0
     }
 
+    /// Deprecated, renamed to `remove_entry`
+    #[unstable(feature = "map_entry_recover_keys", issue = "34285")]
+    #[rustc_deprecated(since = "1.12.0", reason = "renamed to `remove_entry`")]
+    pub fn remove_pair(self) -> (K, V) {
+        self.remove_entry()
+    }
+
     /// Take the ownership of the key and value from the map.
     ///
     /// # Examples
     ///
     /// ```
-    /// #![feature(map_entry_recover_keys)]
-    ///
     /// use std::collections::HashMap;
     /// use std::collections::hash_map::Entry;
     ///
@@ -1655,13 +1660,13 @@ pub fn key(&self) -> &K {
     ///
     /// if let Entry::Occupied(o) = map.entry("poneyland") {
     ///     // We delete the entry from the map.
-    ///     o.remove_pair();
+    ///     o.remove_entry();
     /// }
     ///
     /// assert_eq!(map.contains_key("poneyland"), false);
     /// ```
-    #[unstable(feature = "map_entry_recover_keys", issue = "34285")]
-    pub fn remove_pair(self) -> (K, V) {
+    #[stable(feature = "map_entry_recover_keys2", since = "1.12.0")]
+    pub fn remove_entry(self) -> (K, V) {
         pop_internal(self.elem)
     }
 
@@ -1808,8 +1813,6 @@ pub fn key(&self) -> &K {
     /// # Examples
     ///
     /// ```
-    /// #![feature(map_entry_recover_keys)]
-    ///
     /// use std::collections::HashMap;
     /// use std::collections::hash_map::Entry;
     ///
@@ -1819,7 +1822,7 @@ pub fn key(&self) -> &K {
     ///     v.into_key();
     /// }
     /// ```
-    #[unstable(feature = "map_entry_recover_keys", issue = "34285")]
+    #[stable(feature = "map_entry_recover_keys2", since = "1.12.0")]
     pub fn into_key(self) -> K {
         self.key
     }
index 2a8bd0c88beb6f535d2a53d81b839d3eb9cab951..4c3b993497cf5b160bbe4171e8c5a8a388fa7a91 100644 (file)
@@ -63,8 +63,7 @@ impl IpAddr {
     /// Returns true for the special 'unspecified' address ([IPv4], [IPv6]).
     /// [IPv4]: ../../std/net/struct.Ipv4Addr.html#method.is_unspecified
     /// [IPv6]: ../../std/net/struct.Ipv6Addr.html#method.is_unspecified
-    #[unstable(feature="ip", issue="27709",
-               reason="recently added and depends on unstable Ipv4Addr.is_unspecified()")]
+    #[stable(feature = "ip_shared", since = "1.12.0")]
     pub fn is_unspecified(&self) -> bool {
         match *self {
             IpAddr::V4(ref a) => a.is_unspecified(),
@@ -75,7 +74,7 @@ pub fn is_unspecified(&self) -> bool {
     /// Returns true if this is a loopback address ([IPv4], [IPv6]).
     /// [IPv4]: ../../std/net/struct.Ipv4Addr.html#method.is_loopback
     /// [IPv6]: ../../std/net/struct.Ipv6Addr.html#method.is_loopback
-    #[unstable(feature="ip", reason="recently added", issue="27709")]
+    #[stable(feature = "ip_shared", since = "1.12.0")]
     pub fn is_loopback(&self) -> bool {
         match *self {
             IpAddr::V4(ref a) => a.is_loopback(),
@@ -86,8 +85,6 @@ pub fn is_loopback(&self) -> bool {
     /// Returns true if the address appears to be globally routable ([IPv4], [IPv6]).
     /// [IPv4]: ../../std/net/struct.Ipv4Addr.html#method.is_global
     /// [IPv6]: ../../std/net/struct.Ipv6Addr.html#method.is_global
-    #[unstable(feature="ip", issue="27709",
-               reason="recently added and depends on unstable Ip{v4,v6}Addr.is_global()")]
     pub fn is_global(&self) -> bool {
         match *self {
             IpAddr::V4(ref a) => a.is_global(),
@@ -98,7 +95,7 @@ pub fn is_global(&self) -> bool {
     /// Returns true if this is a multicast address ([IPv4], [IPv6]).
     /// [IPv4]: ../../std/net/struct.Ipv4Addr.html#method.is_multicast
     /// [IPv6]: ../../std/net/struct.Ipv6Addr.html#method.is_multicast
-    #[unstable(feature="ip", reason="recently added", issue="27709")]
+    #[stable(feature = "ip_shared", since = "1.12.0")]
     pub fn is_multicast(&self) -> bool {
         match *self {
             IpAddr::V4(ref a) => a.is_multicast(),
@@ -109,8 +106,6 @@ pub fn is_multicast(&self) -> bool {
     /// Returns true if this address is in a range designated for documentation ([IPv4], [IPv6]).
     /// [IPv4]: ../../std/net/struct.Ipv4Addr.html#method.is_documentation
     /// [IPv6]: ../../std/net/struct.Ipv6Addr.html#method.is_documentation
-    #[unstable(feature="ip", issue="27709",
-               reason="recently added and depends on unstable Ipv6Addr.is_documentation()")]
     pub fn is_documentation(&self) -> bool {
         match *self {
             IpAddr::V4(ref a) => a.is_documentation(),
@@ -147,6 +142,7 @@ pub fn new(a: u8, b: u8, c: u8, d: u8) -> Ipv4Addr {
     /// This property is defined in _UNIX Network Programming, Second Edition_,
     /// W. Richard Stevens, p. 891; see also [ip7]
     /// [ip7][http://man7.org/linux/man-pages/man7/ip.7.html]
+    #[stable(feature = "ip_shared", since = "1.12.0")]
     pub fn is_unspecified(&self) -> bool {
         self.inner.s_addr == 0
     }
@@ -515,8 +511,7 @@ pub fn to_ipv4(&self) -> Option<Ipv4Addr> {
     }
 
     /// Returns the sixteen eight-bit integers the IPv6 address consists of.
-    #[unstable(feature = "ipv6_to_octets", reason = "needs some testing",
-               issue = "32313")]
+    #[stable(feature = "ipv6_to_octets", since = "1.12.0")]
     pub fn octets(&self) -> [u8; 16] {
         self.inner.s6_addr
     }
index 11f785dffd16a6b1f67cc0f5e542c02aa23c937a..d8b8c6a77a26629510b33d4f5b58f5e772bc3e3b 100644 (file)
@@ -394,13 +394,15 @@ pub enum TryRecvError {
 /// This enumeration is the list of possible errors that `recv_timeout` could
 /// not return data when called.
 #[derive(PartialEq, Eq, Clone, Copy, Debug)]
-#[unstable(feature = "mpsc_recv_timeout", issue = "34029")]
+#[stable(feature = "mpsc_recv_timeout", since = "1.12.0")]
 pub enum RecvTimeoutError {
     /// This channel is currently empty, but the sender(s) have not yet
     /// disconnected, so data may yet become available.
+    #[stable(feature = "mpsc_recv_timeout", since = "1.12.0")]
     Timeout,
     /// This channel's sending half has become disconnected, and there will
     /// never be any more data received on this channel
+    #[stable(feature = "mpsc_recv_timeout", since = "1.12.0")]
     Disconnected,
 }
 
@@ -912,8 +914,6 @@ pub fn recv(&self) -> Result<T, RecvError> {
     /// # Examples
     ///
     /// ```no_run
-    /// #![feature(mpsc_recv_timeout)]
-    ///
     /// use std::sync::mpsc::{self, RecvTimeoutError};
     /// use std::time::Duration;
     ///
@@ -922,7 +922,7 @@ pub fn recv(&self) -> Result<T, RecvError> {
     /// let timeout = Duration::from_millis(100);
     /// assert_eq!(Err(RecvTimeoutError::Timeout), recv.recv_timeout(timeout));
     /// ```
-    #[unstable(feature = "mpsc_recv_timeout", issue = "34029")]
+    #[stable(feature = "mpsc_recv_timeout", since = "1.12.0")]
     pub fn recv_timeout(&self, timeout: Duration) -> Result<T, RecvTimeoutError> {
         // Do an optimistic try_recv to avoid the performance impact of
         // Instant::now() in the full-channel case.
index 430ec5f94a6f85da5a0444ddfa0e73b4f52d9f33..dd70ba2e490ad53e825660e12f5226d8354767e0 100644 (file)
@@ -114,7 +114,7 @@ fn exec(&mut self) -> io::Error {
 pub trait ExitStatusExt {
     /// Creates a new `ExitStatus` from the raw underlying `i32` return value of
     /// a process.
-    #[unstable(feature = "exit_status_from", issue = "32713")]
+    #[stable(feature = "exit_status_from", since = "1.12.0")]
     fn from_raw(raw: i32) -> Self;
 
     /// If the process was terminated by a signal, returns that signal.
index 56c6a73d4f82b768760c058e88ae44ebae40c7ea..98166bf8cda09d9bcf7d8ac38788bd09d5c37bb8 100644 (file)
@@ -83,10 +83,11 @@ fn into_raw_handle(self) -> RawHandle {
 }
 
 /// Windows-specific extensions to `std::process::ExitStatus`
-#[unstable(feature = "exit_status_from", issue = "32713")]
+#[stable(feature = "exit_status_from", since = "1.12.0")]
 pub trait ExitStatusExt {
     /// Creates a new `ExitStatus` from the raw underlying `u32` return value of
     /// a process.
+    #[stable(feature = "exit_status_from", since = "1.12.0")]
     fn from_raw(raw: u32) -> Self;
 }
 
index 850127d9f29505f72f0998f50e584346fd026dbd..2b4193306ddf5d08faa91a464431ef37b6887e01 100644 (file)
@@ -42,7 +42,6 @@
 #![feature(staged_api)]
 #![feature(question_mark)]
 #![feature(panic_unwind)]
-#![feature(mpsc_recv_timeout)]
 
 extern crate getopts;
 extern crate term;