| The `self` parameter in a method has an invalid generic "receiver type". |
| |
| Erroneous code example: |
| |
| ```compile_fail,E0801 |
| struct Foo; |
| |
| impl Foo { |
| fn foo<R: std::ops::Deref<Target=Self>>(self: R) {} |
| } |
| ``` |
| |
| or alternatively, |
| |
| ```compile_fail,E0801 |
| struct Foo; |
| |
| impl Foo { |
| fn foo(self: impl std::ops::Deref<Target=Self>) {} |
| } |
| ``` |
| |
| Methods take a special first parameter, termed `self`. It's normal to |
| use `self`, `&self` or `&mut self`, which are syntactic sugar for |
| `self: Self`, `self: &Self`, and `self: &mut Self` respectively. |
| But it's also possible to use more sophisticated types of `self` |
| parameter, for instance `std::rc::Rc<Self>`. The set of allowable |
| `Self` types is extensible using the nightly feature |
| [Arbitrary self types][AST]. |
| This will extend the valid set of `Self` types to anything which implements |
| `std::ops::Deref<Target=Self>`, for example `Rc<Self>`, `Box<Self>`, or |
| your own smart pointers that do the same. |
| |
| However, even with that feature, the `self` type must be concrete. |
| Generic `self` types are not permitted. Specifically, a `self` type will |
| be rejected if it is a type parameter defined on the method. |
| |
| These are OK: |
| |
| ``` |
| struct Foo; |
| |
| impl Foo { |
| fn foo(self) {} |
| fn foo2(self: std::rc::Rc<Self>) {} // or some other similar |
| // smart pointer if you enable arbitrary self types and |
| // the pointer implements Deref<Target=Self> |
| } |
| ``` |
| |
| [AST]: https://doc.rust-lang.org/unstable-book/language-features/arbitrary-self-types.html |