Skip to content

Fix incorrect diagnostics for expected type in E0271 with an associated type - #65977

Merged
bors merged 1 commit into
rust-lang:masterfrom
ohadravid:fix-incorrect-diagnostics-with-an-associated-type
Nov 1, 2019
Merged

Fix incorrect diagnostics for expected type in E0271 with an associated type#65977
bors merged 1 commit into
rust-lang:masterfrom
ohadravid:fix-incorrect-diagnostics-with-an-associated-type

Conversation

@ohadravid

@ohadravidohadravid commented Oct 30, 2019

Copy link
Copy Markdown
Contributor

With code like the following code:

#[derive(Debug)]structData{}fndo_stuff<'a>(iterator:implIterator<Item = &'aData>){for item in iterator {println!("{:?}", item)}}fnmain(){let v = vec![Data{}];do_stuff(v.into_iter());}

the diagnostic (in nightly & stable) wrongly complains about the expected type:

error[E0271]: type mismatch resolving `<std::vec::IntoIter<Data> as std::iter::Iterator>::Item == &Data`
--> src/main.rs:15:5
|
5 | fn do_stuff<'a>(iterator: impl Iterator<Item = &'a Data>) {
| -------- --------------- required by this bound in `do_stuff`
...
15 | do_stuff(v.into_iter());
| ^^^^^^^^ expected struct `Data`, found &Data
|
= note: expected type `Data`
found type `&Data`

This PR fixes this issue by flipping the expected/actual values where appropriate, so it looks like this:

error[E0271]: type mismatch resolving `<std::vec::IntoIter<Data> as std::iter::Iterator>::Item == &Data`
--> main.rs:15:5
|
5 | fn do_stuff<'a>(iterator: impl Iterator<Item = &'a Data>) {
| -------- --------------- required by this bound in `do_stuff`
...
15 | do_stuff(v.into_iter());
| ^^^^^^^^ expected &Data, found struct `Data`
|
= note: expected type `&Data`
found type `Data`

This improves the output of a lot of existing tests (check out associated-types-binding-to-type-defined-in-supertrait!).

The only change which I wasn't too sure about is in the test associated-types-overridden-binding-2, but I think it's an improvement and the underlying problem is with handling of trait_alias.

Fix#57226, fix#64760, fix#58092.

@rust-highfiverust-highfive added the S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. label Oct 30, 2019
@estebank

Copy link
Copy Markdown
Contributor

It looks good but I am also slightly concerned with associated-types-overridden-binding-2, but it is a weird construct where we don't point at trait I32Iterator = Iterator<Item = i32>; and it is a leveraging a nightly feature for it. I think the error was already not great, so r=me once CI is green.

@ohadravid

Copy link
Copy Markdown
ContributorAuthor

@estebank CI is green 😄

Comment threadsrc/librustc/traits/error_reporting.rs Outdated
@estebank

Copy link
Copy Markdown
Contributor

@bors r+

@bors

bors commented Oct 30, 2019

Copy link
Copy Markdown
Collaborator

📌 Commit 7689aac618c61457d52b69b40c84fa7229c0e1d1 has been approved by estebank

@borsbors added S-waiting-on-bors Status: Waiting on bors to run and complete tests. Bors will change the label on completion. and removed S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. labels Oct 30, 2019
@ohadravid
ohadravidforce-pushed the fix-incorrect-diagnostics-with-an-associated-type branch from 7689aac to 8bb5450CompareOctober 31, 2019 08:30
@ohadravid

ohadravid commented Oct 31, 2019

Copy link
Copy Markdown
ContributorAuthor

@estebank updated the code according to your comment, CI is green again

@estebank

Copy link
Copy Markdown
Contributor

@bors r+ rollup

@bors

bors commented Oct 31, 2019

Copy link
Copy Markdown
Collaborator

📌 Commit 8bb5450 has been approved by estebank

tmandry added a commit to tmandry/rust that referenced this pull request Oct 31, 2019
…-with-an-associated-type, r=estebank
Fix incorrect diagnostics for expected type in E0271 with an associated type
With code like the following code:
```rust
#[derive(Debug)]
struct Data {}
fn do_stuff<'a>(iterator: impl Iterator<Item = &'a Data>) {
for item in iterator {
println!("{:?}", item)
}
}
fn main() {
let v = vec![Data {}];
do_stuff(v.into_iter());
}
```
the diagnostic (in nightly & stable) wrongly complains about the expected type:
```
error[E0271]: type mismatch resolving `<std::vec::IntoIter<Data> as std::iter::Iterator>::Item == &Data`
--> src/main.rs:15:5
|
5 | fn do_stuff<'a>(iterator: impl Iterator<Item = &'a Data>) {
| -------- --------------- required by this bound in `do_stuff`
...
15 | do_stuff(v.into_iter());
| ^^^^^^^^ expected struct `Data`, found &Data
|
= note: expected type `Data`
found type `&Data`
```
This PR fixes this issue by flipping the expected/actual values where appropriate, so it looks like this:
```
error[E0271]: type mismatch resolving `<std::vec::IntoIter<Data> as std::iter::Iterator>::Item == &Data`
--> main.rs:15:5
|
5 | fn do_stuff<'a>(iterator: impl Iterator<Item = &'a Data>) {
| -------- --------------- required by this bound in `do_stuff`
...
15 | do_stuff(v.into_iter());
| ^^^^^^^^ expected &Data, found struct `Data`
|
= note: expected type `&Data`
found type `Data`
```
This improves the output of a lot of existing tests (check out `associated-types-binding-to-type-defined-in-supertrait`!).
The only change which I wasn't too sure about is in the test `associated-types-overridden-binding-2`, but I think it's an improvement and the underlying problem is with handling of `trait_alias`.
Fixrust-lang#57226, fixrust-lang#64760, fixrust-lang#58092.
@tmandrytmandry mentioned this pull request Oct 31, 2019
bors added a commit that referenced this pull request Oct 31, 2019
Rollup of 14 pull requests
Successful merges:
- #65112 (Add lint and tests for unnecessary parens around types)
- #65459 (Fix `-Zunpretty=mir-cfg` to render multiple items)
- #65471 (Add long error explanation for E0578)
- #65857 (rustdoc: Resolve module-level doc references more locally)
- #65914 (Use structured suggestion for unnecessary bounds in type aliases)
- #65945 (Optimize long-linker-command-line test)
- #65946 (Make `promote_consts` emit the errors when required promotion fails)
- #65960 (doc: reword iter module example and mention other methods)
- #65963 (update submodules to rust-lang)
- #65972 (Fix libunwind build: Define __LITTLE_ENDIAN__ for LE targets)
- #65977 (Fix incorrect diagnostics for expected type in E0271 with an associated type)
- #65995 (Add error code E0743 for "C-variadic has been used on a non-foreign function")
- #65997 (Fix outdated rustdoc of Once::init_locking function)
- #66005 (vxWorks: remove code related unix socket)
Failed merges:
r? @ghost
tmandry added a commit to tmandry/rust that referenced this pull request Nov 1, 2019
…-with-an-associated-type, r=estebank
Fix incorrect diagnostics for expected type in E0271 with an associated type
With code like the following code:
```rust
#[derive(Debug)]
struct Data {}
fn do_stuff<'a>(iterator: impl Iterator<Item = &'a Data>) {
for item in iterator {
println!("{:?}", item)
}
}
fn main() {
let v = vec![Data {}];
do_stuff(v.into_iter());
}
```
the diagnostic (in nightly & stable) wrongly complains about the expected type:
```
error[E0271]: type mismatch resolving `<std::vec::IntoIter<Data> as std::iter::Iterator>::Item == &Data`
--> src/main.rs:15:5
|
5 | fn do_stuff<'a>(iterator: impl Iterator<Item = &'a Data>) {
| -------- --------------- required by this bound in `do_stuff`
...
15 | do_stuff(v.into_iter());
| ^^^^^^^^ expected struct `Data`, found &Data
|
= note: expected type `Data`
found type `&Data`
```
This PR fixes this issue by flipping the expected/actual values where appropriate, so it looks like this:
```
error[E0271]: type mismatch resolving `<std::vec::IntoIter<Data> as std::iter::Iterator>::Item == &Data`
--> main.rs:15:5
|
5 | fn do_stuff<'a>(iterator: impl Iterator<Item = &'a Data>) {
| -------- --------------- required by this bound in `do_stuff`
...
15 | do_stuff(v.into_iter());
| ^^^^^^^^ expected &Data, found struct `Data`
|
= note: expected type `&Data`
found type `Data`
```
This improves the output of a lot of existing tests (check out `associated-types-binding-to-type-defined-in-supertrait`!).
The only change which I wasn't too sure about is in the test `associated-types-overridden-binding-2`, but I think it's an improvement and the underlying problem is with handling of `trait_alias`.
Fixrust-lang#57226, fixrust-lang#64760, fixrust-lang#58092.
@tmandrytmandry mentioned this pull request Nov 1, 2019
bors added a commit that referenced this pull request Nov 1, 2019
Rollup of 16 pull requests
Successful merges:
- #65112 (Add lint and tests for unnecessary parens around types)
- #65470 (Don't hide ICEs from previous incremental compiles)
- #65471 (Add long error explanation for E0578)
- #65857 (rustdoc: Resolve module-level doc references more locally)
- #65902 (Make ItemContext available for better diagnositcs)
- #65914 (Use structured suggestion for unnecessary bounds in type aliases)
- #65946 (Make `promote_consts` emit the errors when required promotion fails)
- #65960 (doc: reword iter module example and mention other methods)
- #65963 (update submodules to rust-lang)
- #65972 (Fix libunwind build: Define __LITTLE_ENDIAN__ for LE targets)
- #65977 (Fix incorrect diagnostics for expected type in E0271 with an associated type)
- #65995 (Add error code E0743 for "C-variadic has been used on a non-foreign function")
- #65997 (Fix outdated rustdoc of Once::init_locking function)
- #66002 (Stabilize float_to_from_bytes feature)
- #66005 (vxWorks: remove code related unix socket)
- #66018 (Revert PR 64324: dylibs export generics again (for now))
Failed merges:
r? @ghost
@bors
bors merged commit 8bb5450 into rust-lang:masterNov 1, 2019
@gralpli

Copy link
Copy Markdown

Does this also fix #63211 ?

@ohadravid
ohadravid deleted the fix-incorrect-diagnostics-with-an-associated-type branch November 14, 2019 15:53
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

S-waiting-on-borsStatus: Waiting on bors to run and complete tests. Bors will change the label on completion.

Projects

None yet

5 participants

@ohadravid@estebank@bors@gralpli@rust-highfive