Error code E0311

This error occurs when there is an unsatisfied outlives bound involving an elided region and a generic type parameter or associated type.

Erroneous code example:

#![allow(unused)]
fn main() {
fn no_restriction<T>(x: &()) -> &() {
    with_restriction::<T>(x)
}

fn with_restriction<'a, T: 'a>(x: &'a ()) -> &'a () {
    x
}
}

Why doesn't this code compile? It helps to look at the lifetime bounds that are automatically added by the compiler. For more details see the documentation for lifetime elision.

The compiler elides the lifetime of x and the return type to some arbitrary lifetime 'anon in no_restriction(). The only information available to the compiler is that 'anon is valid for the duration of the function. When calling with_restriction(), the compiler requires the completely unrelated type parameter T to outlive 'anon because of the T: 'a bound in with_restriction(). This causes an error because T is not required to outlive 'anon in no_restriction().

If no_restriction() were to use &T instead of &() as an argument, the compiler would have added an implied bound, causing this to compile.

This error can be resolved by explicitly naming the elided lifetime for x and then explicily requiring that the generic parameter T outlives that lifetime:

#![allow(unused)]
fn main() {
fn no_restriction<'a, T: 'a>(x: &'a ()) -> &'a () {
    with_restriction::<T>(x)
}

fn with_restriction<'a, T: 'a>(x: &'a ()) -> &'a () {
    x
}
}