Redefine core::convert::Infallible
as !
.
This commit is contained in:
parent
6eb0627b49
commit
089229a193
@ -40,8 +40,6 @@
|
|||||||
|
|
||||||
#![stable(feature = "rust1", since = "1.0.0")]
|
#![stable(feature = "rust1", since = "1.0.0")]
|
||||||
|
|
||||||
use crate::fmt;
|
|
||||||
|
|
||||||
/// The identity function.
|
/// The identity function.
|
||||||
///
|
///
|
||||||
/// Two things are important to note about this function:
|
/// Two things are important to note about this function:
|
||||||
@ -426,9 +424,7 @@ pub trait TryInto<T>: Sized {
|
|||||||
/// - `TryFrom<T> for U` implies [`TryInto`]`<U> for T`
|
/// - `TryFrom<T> for U` implies [`TryInto`]`<U> for T`
|
||||||
/// - [`try_from`] is reflexive, which means that `TryFrom<T> for T`
|
/// - [`try_from`] is reflexive, which means that `TryFrom<T> for T`
|
||||||
/// is implemented and cannot fail -- the associated `Error` type for
|
/// is implemented and cannot fail -- the associated `Error` type for
|
||||||
/// calling `T::try_from()` on a value of type `T` is [`Infallible`].
|
/// calling `T::try_from()` on a value of type `T` is [`!`].
|
||||||
/// When the [`!`] type is stabilized [`Infallible`] and [`!`] will be
|
|
||||||
/// equivalent.
|
|
||||||
///
|
///
|
||||||
/// `TryFrom<T>` can be implemented as follows:
|
/// `TryFrom<T>` can be implemented as follows:
|
||||||
///
|
///
|
||||||
@ -477,7 +473,6 @@ pub trait TryInto<T>: Sized {
|
|||||||
/// [`TryInto`]: trait.TryInto.html
|
/// [`TryInto`]: trait.TryInto.html
|
||||||
/// [`i32::MAX`]: ../../std/i32/constant.MAX.html
|
/// [`i32::MAX`]: ../../std/i32/constant.MAX.html
|
||||||
/// [`!`]: ../../std/primitive.never.html
|
/// [`!`]: ../../std/primitive.never.html
|
||||||
/// [`Infallible`]: enum.Infallible.html
|
|
||||||
#[stable(feature = "try_from", since = "1.34.0")]
|
#[stable(feature = "try_from", since = "1.34.0")]
|
||||||
pub trait TryFrom<T>: Sized {
|
pub trait TryFrom<T>: Sized {
|
||||||
/// The type returned in the event of a conversion error.
|
/// The type returned in the event of a conversion error.
|
||||||
@ -615,9 +610,9 @@ impl AsRef<str> for str {
|
|||||||
// THE NO-ERROR ERROR TYPE
|
// THE NO-ERROR ERROR TYPE
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
/// The error type for errors that can never happen.
|
/// A type alias for [the `!` “never” type][never].
|
||||||
///
|
///
|
||||||
/// Since this enum has no variant, a value of this type can never actually exist.
|
/// `Infallible` represents types of errors that can never happen since `!` has no valid values.
|
||||||
/// This can be useful for generic APIs that use [`Result`] and parameterize the error type,
|
/// This can be useful for generic APIs that use [`Result`] and parameterize the error type,
|
||||||
/// to indicate that the result is always [`Ok`].
|
/// to indicate that the result is always [`Ok`].
|
||||||
///
|
///
|
||||||
@ -634,33 +629,10 @@ impl AsRef<str> for str {
|
|||||||
/// }
|
/// }
|
||||||
/// ```
|
/// ```
|
||||||
///
|
///
|
||||||
/// # Future compatibility
|
/// # Eventual deprecation
|
||||||
///
|
///
|
||||||
/// This enum has the same role as [the `!` “never” type][never],
|
/// Previously, `Infallible` was defined as `enum Infallible {}`.
|
||||||
/// which is unstable in this version of Rust.
|
/// Now that it is merely a type alias to `!`, we will eventually deprecate `Infallible`.
|
||||||
/// When `!` is stabilized, we plan to make `Infallible` a type alias to it:
|
|
||||||
///
|
|
||||||
/// ```ignore (illustrates future std change)
|
|
||||||
/// pub type Infallible = !;
|
|
||||||
/// ```
|
|
||||||
///
|
|
||||||
/// … and eventually deprecate `Infallible`.
|
|
||||||
///
|
|
||||||
///
|
|
||||||
/// However there is one case where `!` syntax can be used
|
|
||||||
/// before `!` is stabilized as a full-fleged type: in the position of a function’s return type.
|
|
||||||
/// Specifically, it is possible implementations for two different function pointer types:
|
|
||||||
///
|
|
||||||
/// ```
|
|
||||||
/// trait MyTrait {}
|
|
||||||
/// impl MyTrait for fn() -> ! {}
|
|
||||||
/// impl MyTrait for fn() -> std::convert::Infallible {}
|
|
||||||
/// ```
|
|
||||||
///
|
|
||||||
/// With `Infallible` being an enum, this code is valid.
|
|
||||||
/// However when `Infallible` becomes an alias for the never type,
|
|
||||||
/// the two `impl`s will start to overlap
|
|
||||||
/// and therefore will be disallowed by the language’s trait coherence rules.
|
|
||||||
///
|
///
|
||||||
/// [`Ok`]: ../result/enum.Result.html#variant.Ok
|
/// [`Ok`]: ../result/enum.Result.html#variant.Ok
|
||||||
/// [`Result`]: ../result/enum.Result.html
|
/// [`Result`]: ../result/enum.Result.html
|
||||||
@ -668,57 +640,4 @@ impl AsRef<str> for str {
|
|||||||
/// [`Into`]: trait.Into.html
|
/// [`Into`]: trait.Into.html
|
||||||
/// [never]: ../../std/primitive.never.html
|
/// [never]: ../../std/primitive.never.html
|
||||||
#[stable(feature = "convert_infallible", since = "1.34.0")]
|
#[stable(feature = "convert_infallible", since = "1.34.0")]
|
||||||
#[derive(Copy)]
|
pub type Infallible = !;
|
||||||
pub enum Infallible {}
|
|
||||||
|
|
||||||
#[stable(feature = "convert_infallible", since = "1.34.0")]
|
|
||||||
impl Clone for Infallible {
|
|
||||||
fn clone(&self) -> Infallible {
|
|
||||||
match *self {}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[stable(feature = "convert_infallible", since = "1.34.0")]
|
|
||||||
impl fmt::Debug for Infallible {
|
|
||||||
fn fmt(&self, _: &mut fmt::Formatter<'_>) -> fmt::Result {
|
|
||||||
match *self {}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[stable(feature = "convert_infallible", since = "1.34.0")]
|
|
||||||
impl fmt::Display for Infallible {
|
|
||||||
fn fmt(&self, _: &mut fmt::Formatter<'_>) -> fmt::Result {
|
|
||||||
match *self {}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[stable(feature = "convert_infallible", since = "1.34.0")]
|
|
||||||
impl PartialEq for Infallible {
|
|
||||||
fn eq(&self, _: &Infallible) -> bool {
|
|
||||||
match *self {}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[stable(feature = "convert_infallible", since = "1.34.0")]
|
|
||||||
impl Eq for Infallible {}
|
|
||||||
|
|
||||||
#[stable(feature = "convert_infallible", since = "1.34.0")]
|
|
||||||
impl PartialOrd for Infallible {
|
|
||||||
fn partial_cmp(&self, _other: &Self) -> Option<crate::cmp::Ordering> {
|
|
||||||
match *self {}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[stable(feature = "convert_infallible", since = "1.34.0")]
|
|
||||||
impl Ord for Infallible {
|
|
||||||
fn cmp(&self, _other: &Self) -> crate::cmp::Ordering {
|
|
||||||
match *self {}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[stable(feature = "convert_infallible", since = "1.34.0")]
|
|
||||||
impl From<!> for Infallible {
|
|
||||||
fn from(x: !) -> Self {
|
|
||||||
x
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
#![stable(feature = "rust1", since = "1.0.0")]
|
#![stable(feature = "rust1", since = "1.0.0")]
|
||||||
|
|
||||||
use crate::convert::{TryFrom, Infallible};
|
use crate::convert::TryFrom;
|
||||||
use crate::fmt;
|
use crate::fmt;
|
||||||
use crate::intrinsics;
|
use crate::intrinsics;
|
||||||
use crate::mem;
|
use crate::mem;
|
||||||
@ -4722,18 +4722,8 @@ impl fmt::Display for TryFromIntError {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[stable(feature = "try_from", since = "1.34.0")]
|
#[stable(feature = "try_from", since = "1.34.0")]
|
||||||
impl From<Infallible> for TryFromIntError {
|
|
||||||
fn from(x: Infallible) -> TryFromIntError {
|
|
||||||
match x {}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[stable(feature = "never_type", since = "1.41.0")]
|
|
||||||
impl From<!> for TryFromIntError {
|
impl From<!> for TryFromIntError {
|
||||||
fn from(never: !) -> TryFromIntError {
|
fn from(never: !) -> TryFromIntError {
|
||||||
// Match rather than coerce to make sure that code like
|
|
||||||
// `From<Infallible> for TryFromIntError` above will keep working
|
|
||||||
// when `Infallible` becomes an alias to `!`.
|
|
||||||
match never {}
|
match never {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -551,13 +551,6 @@ impl Error for string::FromUtf16Error {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[stable(feature = "str_parse_error2", since = "1.8.0")]
|
|
||||||
impl Error for string::ParseError {
|
|
||||||
fn description(&self) -> &str {
|
|
||||||
match *self {}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[stable(feature = "decode_utf16", since = "1.9.0")]
|
#[stable(feature = "decode_utf16", since = "1.9.0")]
|
||||||
impl Error for char::DecodeUtf16Error {
|
impl Error for char::DecodeUtf16Error {
|
||||||
fn description(&self) -> &str {
|
fn description(&self) -> &str {
|
||||||
|
Loading…
Reference in New Issue
Block a user