| A lifetime is only present in an associated-type binding, and not in the input |
| types to the trait. |
| |
| Erroneous code example: |
| |
| ```compile_fail,E0582 |
| fn bar<F>(t: F) |
| // No type can satisfy this requirement, since `'a` does not |
| // appear in any of the input types (here, `i32`): |
| where F: for<'a> Fn(i32) -> Option<&'a i32> |
| { |
| } |
| |
| fn main() { } |
| ``` |
| |
| To fix this issue, either use the lifetime in the inputs, or use |
| `'static`. Example: |
| |
| ``` |
| fn bar<F, G>(t: F, u: G) |
| where F: for<'a> Fn(&'a i32) -> Option<&'a i32>, |
| G: Fn(i32) -> Option<&'static i32>, |
| { |
| } |
| |
| fn main() { } |
| ``` |
| |
| This error also includes the use of associated types with lifetime parameters. |
| ```compile_fail,E0582 |
| trait Foo { |
| type Assoc<'a>; |
| } |
| |
| struct Bar<X, F> |
| where |
| X: Foo, |
| F: for<'a> Fn(X::Assoc<'a>) -> &'a i32 |
| { |
| x: X, |
| f: F |
| } |
| ``` |
| The latter scenario encounters this error because `Foo::Assoc<'a>` could be |
| implemented by a type that does not use the `'a` parameter, so there is no |
| guarantee that `X::Assoc<'a>` actually uses `'a`. |
| |
| To fix this we can pass a dummy parameter: |
| ``` |
| # trait Foo { |
| # type Assoc<'a>; |
| # } |
| struct Bar<X, F> |
| where |
| X: Foo, |
| F: for<'a> Fn(X::Assoc<'a>, /* dummy */ &'a ()) -> &'a i32 |
| { |
| x: X, |
| f: F |
| } |
| ``` |
| |
| Note: The examples above used to be (erroneously) accepted by the |
| compiler, but this was since corrected. See [issue #33685] for more |
| details. |
| |
| [issue #33685]: https://github.com/rust-lang/rust/issues/33685 |