Auto merge of #83729 - JohnTitor:issue-43913, r=estebank
Add a suggestion when using a type alias instead of trait alias Fixes #43913 r? `@estebank`
This commit is contained in:
commit
8ad0821b03
9 changed files with 81 additions and 23 deletions
|
@ -8,14 +8,15 @@ struct Foo;
|
|||
struct Bar;
|
||||
|
||||
impl Foo for Bar {} // error: `Foo` is not a trait
|
||||
fn baz<T: Foo>(t: T) {} // error: `Foo` is not a trait
|
||||
```
|
||||
|
||||
Another erroneous code example:
|
||||
|
||||
```compile_fail,E0404
|
||||
struct Foo;
|
||||
type Foo = Iterator<Item=String>;
|
||||
|
||||
fn bar<T: Foo>(t: T) {} // error: `Foo` is not a trait
|
||||
fn bar<T: Foo>(t: T) {} // error: `Foo` is a type alias
|
||||
```
|
||||
|
||||
Please verify that the trait's name was not misspelled or that the right
|
||||
|
@ -30,14 +31,27 @@ struct Bar;
|
|||
impl Foo for Bar { // ok!
|
||||
// functions implementation
|
||||
}
|
||||
|
||||
fn baz<T: Foo>(t: T) {} // ok!
|
||||
```
|
||||
|
||||
or:
|
||||
Alternatively, you could introduce a new trait with your desired restrictions
|
||||
as a super trait:
|
||||
|
||||
```
|
||||
trait Foo {
|
||||
// some functions
|
||||
}
|
||||
# trait Foo {}
|
||||
# struct Bar;
|
||||
# impl Foo for Bar {}
|
||||
trait Qux: Foo {} // Anything that implements Qux also needs to implement Foo
|
||||
fn baz<T: Qux>(t: T) {} // also ok!
|
||||
```
|
||||
|
||||
Finally, if you are on nightly and want to use a trait alias
|
||||
instead of a type alias, you should use `#![feature(trait_alias)]`:
|
||||
|
||||
```
|
||||
#![feature(trait_alias)]
|
||||
trait Foo = Iterator<Item=String>;
|
||||
|
||||
fn bar<T: Foo>(t: T) {} // ok!
|
||||
```
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue