I have a fun one, where the compiler says I have an unused lifetime parameter, except it’s clearly used. It feels almost like a compiler error, though I’m probably overlooking something? Who can see the mistake?

main.rs

trait Context<'a> {
    fn name(&'a self) -> &'a str;
}

type Func<'a, C: Context<'a>> = dyn Fn(C);

pub struct BuiltInFunction<'a, C: Context<'a>> {
    pub(crate) func: Box<Func<'a, C>>,
}
error[E0392]: parameter `'a` is never used
 --> src/main.rs:7:28
  |
7 | pub struct BuiltInFunction<'a, C: Context<'a>> {
  |                            ^^ unused parameter
  |
  = help: consider removing `'a`, referring to it in a field, or using a marker such as `PhantomData`

For more information about this error, try `rustc --explain E0392`.
error: could not compile `lifetime-test` (bin "lifetime-test") due to 1 previous error
  • notriddle
    link
    fedilink
    arrow-up
    18
    ·
    9 months ago

    The warning is in the wrong place, but it’s real.

    The actual problem is on line 5, where you have a type alias that doesn’t use the lifetime parameter. The warning ought to be there, but rustc expands type aliases in place, so it doesn’t check there.

    The compiler should be able to fix it by not expanding type aliases directly in place. https://github.com/rust-lang/rust/issues/112792