From b2cf9a02b2bce6ed984b0c967e2daf0af7b13629 Mon Sep 17 00:00:00 2001 From: Simon Sapin Date: Wed, 13 Feb 2019 18:01:37 +0100 Subject: [PATCH] Add `impl From for Infallible` MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The reverse conversion unfortunately causes unexpected errors like: ``` error[E0277]: the trait bound `!: std::convert::From<()>` is not satisfied --> src/librustc_metadata/encoder.rs:105:9 | 105 | self.emit_usize(seq.len)?; | ^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `std::convert::From<()>` is not implemented for `!` | = help: the following implementations were found: > = note: the trait is implemented for `()`. Possibly this error has been caused by changes to Rust's type-inference algorithm (see: https://github.com/rust-lang/rust/issues/48950 for more info). Consider whether you meant to use the type `()` here instead. = note: required by `std::convert::From::from` ``` I don’t understand why this error happens. If I’m reading the code correctly the return types of `emit_usize` and of the method that contains line 105 are both `Result<(), !>`, so the expansion of the `?` operator should involve `!: From`, not `From<()>`. Is this a type inference bug? --- src/libcore/convert.rs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/libcore/convert.rs b/src/libcore/convert.rs index 65aa91e2dab09..c6c41fb99a466 100644 --- a/src/libcore/convert.rs +++ b/src/libcore/convert.rs @@ -596,3 +596,10 @@ impl PartialEq for Infallible { #[stable(feature = "convert_infallible", since = "1.34.0")] impl Eq for Infallible {} + +#[stable(feature = "convert_infallible", since = "1.34.0")] +impl From for Infallible { + fn from(x: !) -> Self { + x + } +}