Conversation
|
r? @davidtwco rustbot has assigned @davidtwco. Use |
There was a problem hiding this comment.
I've looked through the tests, and I can't find one (not even doc test) that tests the fact that try_from has a blanket impl for T: Into, etc. So maybe having some library test for that would be nice? This test on its own seems indeed useless though, since 1.41 definitely.
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 rust-lang#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?
b9c620e to
e645e51
Compare
|
This PR was rebased onto a different main commit. Here's a range-diff highlighting what actually changed. Rebasing is a normal part of keeping PRs up to date, so no action is needed—this note is just to help reviewers. |
|
@rustbot review |
|
@bors r+ rollup |
Rollup of 5 pull requests Successful merges: - #148918 (Remove an outdated test) - #149244 (Fix std::mem::drop rustdoc misleading statement) - #149532 (Rename supertrait item shadowing lints) - #149541 (Various never type test improvements) - #149590 (linker: Remove special case for `rust-lld` in `detect_self_contained_mingw`) r? `@ghost` `@rustbot` modify labels: rollup
Rollup merge of #148918 - WaffleLapkin:tryfromwhattttt, r=jdonszelmann 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 #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... is a weird test.
It has two impls:
impl<T> From<Foo<T>> for Box<T>(commented out, more on that later), andimpl<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
TryFromshould be usingIntoand notFrom(becauseIntois more general, since theFromimpl doesn't compile).However:
BoxvsVec, which is significant b/cBoxis fundamentalHere is a table for compilation of the impls:
VecBoxFromIntogodbolt used to test this
Order of events:
1.28theincoherent_fundamental_implslint becomes deny by default (this is not mentioned in the changelog yay)1.32changed absolutely nothing, even though this version is credited in the testTryFromblanket impl to useIntoinstead ofFrom#56796)1.41coherence was relaxed to allowFrom+Vecto compileTo conclude: since
1.41this test does nothing (and before that it was written in a way which did not detect this change). It looks to me like today (since1.41) we could boundTryFromimpl withFrom(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?