Remove an outdated test
This... is a weird test. It has two impls: - `impl<T> From<Foo<T>> for Box<T>` (commented out, more on that later), and - `impl<T> Into<Vec<T>> for Foo<T>` The idea of that test is to show that the first impl doesn't compile, but the second does, thus `TryFrom` should be using `Into` and not `From` (because `Into` is more general, since the `From` impl doesn't compile). However: 1. The types are different -- `Box` vs `Vec`, which is significant b/c `Box` is fundamental 2. The commented out impl actually compiles! (which wasn't detected b/c it's commented out :\ ) Here is a table for compilation of the impls: | | `Vec` | `Box` | |--------|--------------|----------------| | `From` | since 1.41.0 | never | | `Into` | always | not since 1.28 | [godbolt used to test this](https://godbolt.org/z/T38E3jGKa) Order of events: 1. in `1.28` the `incoherent_fundamental_impls` lint becomes deny by default (this is *not* mentioned in the changelog yay) 2. `1.32` changed absolutely nothing, even though this version is credited in the test 3. the test was added (I'm not exactly sure when) (see https://github.com/rust-lang/rust/pull/56796) 4. in `1.41` coherence was relaxed to allow `From`+`Vec` to compile To conclude: since `1.41` this test does nothing (and before that it was written in a way which did not detect this change). It looks to me like today (since `1.41`) we *could* bound `TryFrom` impl with `From` (but now it'd be a useless breaking change of course). Am I missing anything? Is there a useful version of this test that could be written?
This commit is contained in:
parent
9b82a4fffe
commit
e645e51d97
1 changed files with 0 additions and 37 deletions
|
|
@ -1,37 +0,0 @@
|
|||
//@ run-pass
|
||||
// This test relies on `TryFrom` being blanket impl for all `T: Into`
|
||||
// and `TryInto` being blanket impl for all `U: TryFrom`
|
||||
|
||||
// This test was added to show the motivation for doing this
|
||||
// over `TryFrom` being blanket impl for all `T: From`
|
||||
|
||||
#![feature(never_type)]
|
||||
|
||||
use std::convert::{TryInto, Infallible};
|
||||
|
||||
struct Foo<T> {
|
||||
t: T,
|
||||
}
|
||||
|
||||
// This fails to compile due to coherence restrictions
|
||||
// as of Rust version 1.32.x, therefore it could not be used
|
||||
// instead of the `Into` version of the impl, and serves as
|
||||
// motivation for a blanket impl for all `T: Into`, instead
|
||||
// of a blanket impl for all `T: From`
|
||||
/*
|
||||
impl<T> From<Foo<T>> for Box<T> {
|
||||
fn from(foo: Foo<T>) -> Box<T> {
|
||||
Box::new(foo.t)
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
impl<T> Into<Vec<T>> for Foo<T> {
|
||||
fn into(self) -> Vec<T> {
|
||||
vec![self.t]
|
||||
}
|
||||
}
|
||||
|
||||
pub fn main() {
|
||||
let _: Result<Vec<i32>, Infallible> = Foo { t: 10 }.try_into();
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue