I tried this code:
#![feature(specialization)]
pub enum Either<L,R> {
Left(L),
Right(R),
}
default impl<L,R> From<L> for Either<L,R> {
fn from(l: L) -> Self {
Either::Left(l)
}
}
impl<L,R> From<R> for Either<L,R> {
fn from(r: R) -> Self {
Either::Right(r)
}
}
To be completely honest, I wasn't sure this would really work. But I suppose it could be argued that the compiler shouldn't crash.
Instead, this happened:
Compiling playground v0.0.1 (/playground)
warning: the feature `specialization` is incomplete and may not be safe to use and/or cause compiler crashes
--> src/lib.rs:1:12
|
1 | #![feature(specialization)]
| ^^^^^^^^^^^^^^
|
= note: `#[warn(incomplete_features)]` on by default
= note: see issue #31844 <https://github.com/rust-lang/rust/issues/31844> for more information
error[E0275]: overflow evaluating the requirement `Either<!, _>: From<!>`
|
= help: consider adding a `#![recursion_limit="256"]` attribute to your crate (`playground`)
= note: required because of the requirements on the impl of `From<!>` for `Either<!, _>`
= note: required because of the requirements on the impl of `From<!>` for `Either<!, _>`
= note: required because of the requirements on the impl of `From<!>` for `Either<!, _>`
= note: required because of the requirements on the impl of `From<!>` for `Either<!, _>`
= note: required because of the requirements on the impl of `From<!>` for `Either<!, _>`
= note: required because of the requirements on the impl of `From<!>` for `Either<!, _>`
= note: required because of the requirements on the impl of `From<!>` for `Either<!, _>`
= note: required because of the requirements on the impl of `From<!>` for `Either<!, _>`
= note: required because of the requirements on the impl of `From<!>` for `Either<!, _>`
= note: required because of the requirements on the impl of `From<!>` for `Either<!, _>`
= note: required because of the requirements on the impl of `From<!>` for `Either<!, _>`
= note: required because of the requirements on the impl of `From<!>` for `Either<!, _>`
= note: required because of the requirements on the impl of `From<!>` for `Either<!, _>`
= note: required because of the requirements on the impl of `From<!>` for `Either<!, _>`
= note: required because of the requirements on the impl of `From<!>` for `Either<!, _>`
= note: required because of the requirements on the impl of `From<!>` for `Either<!, _>`
= note: required because of the requirements on the impl of `From<!>` for `Either<!, _>`
etc etc etc
This happened just now on 2020-09-21 at the Rust playground: https://play.rust-lang.org/?version=nightly&mode=debug&edition=2018&gist=005db744fc083053388b84c8b68d1751 .
I know specialization isn't stable, so there are no guarantees, and maybe this is a known issue. But if someone is currently working on stabilizing specialization, maybe they'd be interested in cleaning up the above error message.
Anyway, a great thank you to all the fantastic people who work on making Rust more awesome!
I tried this code:
To be completely honest, I wasn't sure this would really work. But I suppose it could be argued that the compiler shouldn't crash.
Instead, this happened:
etc etc etc
This happened just now on 2020-09-21 at the Rust playground: https://play.rust-lang.org/?version=nightly&mode=debug&edition=2018&gist=005db744fc083053388b84c8b68d1751 .
I know specialization isn't stable, so there are no guarantees, and maybe this is a known issue. But if someone is currently working on stabilizing specialization, maybe they'd be interested in cleaning up the above error message.
Anyway, a great thank you to all the fantastic people who work on making Rust more awesome!