Rollup merge of #74712 - strom-und-spiele:E0271-cleanup, r=Mark-Simulacrum

Update E0271 explanation

When reading the explanation, I got confused by it. I hope the wording is clearer now.
This commit is contained in:
Yuki Okushi 2020-08-09 06:41:14 +09:00 committed by GitHub
commit 5bbdc73ebc
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -5,25 +5,6 @@ Erroneous code example:
```compile_fail,E0271
trait Trait { type AssociatedType; }
fn foo<T>(t: T) where T: Trait<AssociatedType=u32> {
println!("in foo");
}
impl Trait for i8 { type AssociatedType = &'static str; }
foo(3_i8);
```
This is because of a type mismatch between the associated type of some
trait (e.g., `T::Bar`, where `T` implements `trait Quux { type Bar; }`)
and another type `U` that is required to be equal to `T::Bar`, but is not.
Examples follow.
Here is that same example again, with some explanatory comments:
```compile_fail,E0271
trait Trait { type AssociatedType; }
fn foo<T>(t: T) where T: Trait<AssociatedType=u32> {
// ~~~~~~~~ ~~~~~~~~~~~~~~~~~~
// | |
@ -56,11 +37,9 @@ foo(3_i8);
// therefore the type-checker complains with this error code.
```
To avoid those issues, you have to make the types match correctly.
So we can fix the previous examples like this:
The issue can be resolved by changing the associated type:
1) in the `foo` implementation:
```
// Basic Example:
trait Trait { type AssociatedType; }
fn foo<T>(t: T) where T: Trait<AssociatedType = &'static str> {
@ -70,13 +49,17 @@ fn foo<T>(t: T) where T: Trait<AssociatedType = &'static str> {
impl Trait for i8 { type AssociatedType = &'static str; }
foo(3_i8);
// For-Loop Example:
let vs = vec![1, 2, 3, 4];
for v in &vs {
match v {
&1 => {}
_ => {}
}
}
```
2) in the `Trait` implementation for `i8`:
```
trait Trait { type AssociatedType; }
fn foo<T>(t: T) where T: Trait<AssociatedType = u32> {
println!("in foo");
}
impl Trait for i8 { type AssociatedType = u32; }
foo(3_i8);
```