How do I fix "lifetime parameter is never used" with a generic field?

Viewed 793

The following code generates an error:

struct IntParseVisitor<'de, V: Visitor<'de>> {
    inner_visitor: V,
}

pub trait Visitor<'de>: Sized {
    fn visit_str<E>(self, v: &'de str) {}
}
error[E0392]: parameter `'de` is never used
 --> src/lib.rs:1:24
  |
1 | struct IntParseVisitor<'de, V: Visitor<'de>> {
  |                        ^^^ unused parameter
  |
  = help: consider removing `'de`, referring to it in a field, or using a marker such as `std::marker::PhantomData`

I don't quite understand how it is unused. Is it not used for Visitor<'de>? What's the best way of fixing this? Note that I can't change the code for Visitor since it is in Serde.

2 Answers

Ah, thanks to @Shepmaster's hint I tried this, which compiles:

struct IntParseVisitor<V: for<'de> Visitor<'de>> {
    inner_visitor: V,
}

pub trait Visitor<'de>: Sized {
    fn visit_str<E>(self, v: &'de str)
    {
    }
}

I don't fully understand the lifetimes here so don't take my word for it.

You can follow the error suggestion:

help: consider removing 'de, referring to it in a field, or using a marker such as std::marker::PhantomData

struct IntParseVisitor<'de, V: Visitor<'de>> {
    inner_visitor: V,
    _phantom_data: std::marker::PhantomData<&'de ()>,
}
Related