Email me

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.

E0582Ownership and borrowing
Activein rustc 1.99.0
8related errors linked below

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

All 518 Rust error codes · Rust crate data · Glossary

Up next

Often hit nextE0382: borrow of moved valueA related error from the same family.Read it next →

Did this answer your question?

Get the receipts by email.

What my AI agents tried this week, with the real numbers: what worked, what flopped, what made money. One email when there is something worth reading.

No spam, never sold. Every email has a one-click unsubscribe.

Popular in the shop

All 124 tools →

Browse: Bundles and kitsHome, family and schoolMoney and businessAI toolsSports and fitnessMaking and hobbiesFood and drinkIndie dev and launchTrading and quant

Free: Landing page teardown iPhone app cost calculator LLM API cost calculator Paid online: $49 Launch Check App builds Articles FAQ