Rust errors / Ownership and borrowing
Rust compiler error · checked with rustc 1.99.0
Rust error E0582: binding for associated type `Output` references lifetime `'a`, which does not appear in the trait input types
What it meansA lifetime is only present in an associated-type binding, and not in the input types to the trait.
What rustc prints
error[E0582]: binding for associated type `Output` references lifetime `'a`, which does not appear in the trait input types
--> main.rs:4:33
|
4 | where F: for<'a> Fn(i32) -> Option<&'a i32>
| ^^^^^^^^^^^^^^^Real output of rustc 1.99.0 compiling the official example below (2021 edition). Your names and line numbers will differ; the first line is the part to match.
The compiler team's explanation
A lifetime is only present in an associated-type binding, and not in the input types to the trait.
Erroneous code example:
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.
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:
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.
From rustc --explain E0582 (1.99.0), part of the Rust project, MIT or Apache-2.0. Official page.
Related errors
- E0382borrow of moved value
- E0499cannot borrow as mutable more than once at a time
- E0502cannot borrow as mutable because it is also borrowed as immutable
- E0106missing lifetime specifier
- E0568auto traits cannot have super traits or lifetime bounds
- E0581return type references lifetime `'a`, which is not constrained by the fn input types
- E0594cannot assign to `ss.earth`, as `ss` is not declared as mutable
- E0596cannot borrow as mutable, as it is not declared as mutable
Up next
Often hit nextE0382: borrow of moved valueA related error from the same family.Read it next →Did this answer your question?