mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-21 22:34:05 +00:00
Rollup merge of #124746 - OliverKillane:E0582-explain-assoc-types-improvement, r=pnkfelix
`rustc --explain E0582` additional example ## Context *From #124744* Expands the example for E0582, an error ensuring that lifetime in a function's return type is sufficiently constrained (e.g. actually tied to some input type), to show an additional example where one sees the lifetime occurring syntactically among the relevant function input types, but is nonetheless rejected by rustc because a syntactic occurrence is not always sufficient.
This commit is contained in:
commit
28deff4244
@ -27,6 +27,40 @@ fn bar<F, G>(t: F, u: G)
|
||||
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
|
||||
guarentee 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.
|
||||
|
Loading…
Reference in New Issue
Block a user