Description
use serde::Deserialize;
// Expands to:
//
// const _IMPL_DESERIALIZE_FOR_S: () = {
// extern crate serde as _serde;
// impl<'de> _serde::Deserialize<'de> for S { /* ... */ }
// }
#[derive(Deserialize)]
struct S;
fn main() {
// Requires S: serde::Serialize.
serde_json::to_string(&S);
}
The message as of rustc 1.24.0-nightly (c284f88 2017-12-24):
error[E0277]: the trait bound `S: _IMPL_DESERIALIZE_FOR_S::_serde::Serialize` is not satisfied
--> src/main.rs:16:5
|
16 | serde_json::to_string(&S);
| ^^^^^^^^^^^^^^^^^^^^^ the trait `_IMPL_DESERIALIZE_FOR_S::_serde::Serialize` is not implemented for `S`
|
= note: required by `serde_json::to_string`
In this case it would be more desirable for the error message to refer to serde::Serialize
rather than _IMPL_DESERIALIZE_FOR_S::_serde::Serialize
. The extern crate means that the user's Cargo.toml includes the serde
crate under [dependencies]
, so showing serde::Serialize
as the path seems reasonable.
I understand that serde::Serialize
could be ambiguous if the user's crate includes mod serde
at the top level. For now we could ignore that case and show serde::Serialize
anyway, or treat it as a special case and not show serde::Serialize
if they have a mod serde
. The special case would go away with rust-lang/rfcs#2126 by showing crate::serde::Serialize
.
Fixing this would be valuable in allowing us to reinstate the lint against unused extern crate by addressing the usability issue reported in #44294.