I tried to derive serde::Deserialize for a struct containing a reference to a Path. This yielded an error message which doesn't occur if you replace &'a Path with &'a str. What causes the different behaviours of #[derive(Deserialize)]?
#!/bin/cargo script //! ```cargo //! [dependencies] //! serde_derive="1.0" //! serde="1.0" //! ``` extern crate serde_derive; use serde_derive::*; #[derive(Deserialize)] struct A<'a> { a: &'a std::path::Path, //a: &'a str, } fn main() {} error[E0495]: cannot infer an appropriate lifetime for lifetime parameter `'de` due to conflicting requirements --> src/main.rs:7:5 | 7 | a: &'a std::path::Path, | ^ | note: first, the lifetime cannot outlive the lifetime 'de as defined on the impl at 5:10... --> src/main.rs:5:10 | 5 | #[derive(Deserialize)] | ^^^^^^^^^^^ = note: ...so that the types are compatible: expected _IMPL_DESERIALIZE_FOR_A::_serde::de::SeqAccess<'_> found _IMPL_DESERIALIZE_FOR_A::_serde::de::SeqAccess<'de> note: but, the lifetime must be valid for the lifetime 'a as defined on the impl at 6:10... --> src/main.rs:6:10 | 6 | struct A<'a> { | ^^ = note: ...so that the types are compatible: expected _IMPL_DESERIALIZE_FOR_A::_serde::Deserialize<'_> found _IMPL_DESERIALIZE_FOR_A::_serde::Deserialize<'_> error[E0495]: cannot infer an appropriate lifetime for lifetime parameter `'de` due to conflicting requirements --> src/main.rs:7:5 | 7 | a: &'a std::path::Path, | ^ | note: first, the lifetime cannot outlive the lifetime 'de as defined on the impl at 5:10... --> src/main.rs:5:10 | 5 | #[derive(Deserialize)] | ^^^^^^^^^^^ = note: ...so that the types are compatible: expected _IMPL_DESERIALIZE_FOR_A::_serde::de::MapAccess<'_> found _IMPL_DESERIALIZE_FOR_A::_serde::de::MapAccess<'de> note: but, the lifetime must be valid for the lifetime 'a as defined on the impl at 6:10... --> src/main.rs:6:10 | 6 | struct A<'a> { | ^^ = note: ...so that the types are compatible: expected _IMPL_DESERIALIZE_FOR_A::_serde::Deserialize<'_> found _IMPL_DESERIALIZE_FOR_A::_serde::Deserialize<'_> Strangely enough, the code compiles if the struct contains both fields _a: &'a Path and _b: &'a str... At this point I think this is a bug.
a: PathBufimpls ofDeserializefor&'a strand&'a Pathand everything looks the same for both cases except for a type conversion viaAsRef, but that's in the body ofPathVisitorand that should long be typechecked when this error occurs. It looks like it might even be a bug in the lifetime inference.