This prevents diagnostics being rendered like `serde_core::ser::Serialize`
and `serde_core::de::Deserialize` in projects that have no direct
dependency on serde_core.
The attributes make error messages arguably sometimes worse than
pre-serde_core by always rendering `serde::Serialize` and never
`Serialize` when `use serde::Serialize` is in scope, which rustc's
default message construction knows to recognize. But this is probably
negligible.
I explored the alternative of setting `[lib] name = "serde"` in
serde_core/Cargo.toml which also prevents `serde_core::ser::Serialize`
in messages, but has the unwanted effect of also inserting the following
noise into every such error:
note: there are multiple different versions of crate `serde` in the dependency graph
--> $WORKSPACE/serde_core/src/ser/mod.rs:225:1
|
225 | pub trait Serialize {
| ^^^^^^^^^^^^^^^^^^^ this is the required trait
|
::: src/main.rs:1:1
|
1 | struct MyStruct;
| --------------- this type doesn't implement the required trait
...
4 | let _ = serde_json::to_string(&MyStruct);
| ----------
| |
| one version of crate `serde` used here, as a dependency of crate `serde`
| one version of crate `serde` used here, as a dependency of crate `serde_json`
|
::: $WORKSPACE/serde/src/private/de.rs:2347:1
|
2347 | pub trait IdentifierDeserializer<'de, E: Error> {
| ----------------------------------------------- this is the found trait
= help: you can use `cargo tree` to explore your dependency tree
The "this is the found trait" pointing to `IdentifierDeserializer` seems
like a compiler bug...
In the 2024 edition of Rust, `serde`s macros for `serialize_with` can
lead to a temporary lifetime error such as:
```
error[E0716]: temporary value dropped while borrowed
--> my-binary/src/main.rs:6:10
|
6 | #[derive(MyDerive)]
| ^^^^^^^-
| | |
| | temporary value is freed at the end of this statement
| creates a temporary value which is freed while still in use
| borrow later used by call
| in this derive macro expansion
|
::: /private/tmp/life/my-project/my-macro/src/lib.rs:6:1
|
6 | pub fn my_derive(_input: TokenStream) -> TokenStream {
| ---------------------------------------------------- in this expansion of `#[derive(MyDerive)]`
|
= note: consider using a `let` binding to create a longer lived value
```
This is because the macro code takes a reference to struct inside of a
block, which then goes out of scope when `serde` passes it to a
function.
To resolve this, we move the reference to outside of the block, to
ensure that the lifetime extends into the function call.
Signed-off-by: Andrew V. Teylu <andrew.teylu@vector.com>
warning: lifetime flowing from input to output with different syntax can be confusing
--> serde/src/private/de.rs:266:23
|
266 | fn unexpected(&self) -> Unexpected {
| ^^^^^ ---------- the lifetime gets resolved as `'_`
| |
| this lifetime flows to the output
|
= note: `#[warn(mismatched_lifetime_syntaxes)]` on by default
help: one option is to remove the lifetime for references and use the anonymous lifetime for paths
|
266 | fn unexpected(&self) -> Unexpected<'_> {
| ++++
warning: lifetime flowing from input to output with different syntax can be confusing
--> serde/src/private/mod.rs:27:35
|
27 | pub fn from_utf8_lossy(bytes: &[u8]) -> Cow<str> {
| ^^^^^ -------- the lifetime gets resolved as `'_`
| |
| this lifetime flows to the output
|
help: one option is to remove the lifetime for references and use the anonymous lifetime for paths
|
27 | pub fn from_utf8_lossy(bytes: &[u8]) -> Cow<'_, str> {
| +++
warning: lifetime flowing from input to output with different syntax can be confusing
--> serde_derive/src/internals/attr.rs:612:23
|
612 | pub fn serde_path(&self) -> Cow<syn::Path> {
| ^^^^^ -------------- the lifetime gets resolved as `'_`
| |
| this lifetime flows to the output
|
= note: `#[warn(mismatched_lifetime_syntaxes)]` on by default
help: one option is to remove the lifetime for references and use the anonymous lifetime for paths
|
612 | pub fn serde_path(&self) -> Cow<'_, syn::Path> {
| +++
warning: lifetime flowing from input to output with different syntax can be confusing
--> serde_derive/src/internals/case.rs:45:37
|
45 | pub fn from_str(rename_all_str: &str) -> Result<Self, ParseError> {
| ^^^^ ---------- the lifetime gets resolved as `'_`
| |
| this lifetime flows to the output
|
help: one option is to remove the lifetime for references and use the anonymous lifetime for paths
|
45 | pub fn from_str(rename_all_str: &str) -> Result<Self, ParseError<'_>> {
| ++++
warning: lifetime flowing from input to output with different syntax can be confusing
--> serde_derive/src/de.rs:3228:13
|
3228 | params: &Parameters,
| ^^^^^^^^^^^ this lifetime flows to the output
3229 | ) -> (
3230 | DeImplGenerics,
| -------------- the lifetimes get resolved as `'_`
3231 | DeTypeGenerics,
| -------------- the lifetimes get resolved as `'_`
3232 | syn::TypeGenerics,
| ----------------- the lifetimes get resolved as `'_`
3233 | Option<&syn::WhereClause>,
| ----------------- the lifetimes get resolved as `'_`
|
help: one option is to remove the lifetime for references and use the anonymous lifetime for paths
|
3230 ~ DeImplGenerics<'_>,
3231 ~ DeTypeGenerics<'_>,
3232 ~ syn::TypeGenerics<'_>,
|
Allow deprecated in the `Serialize`/`Deserialize`
derive implementations. This allows you to
deprecate structs, enums, struct fields, or enum
variants and not get compiler warnings/errors
about use of deprecated thing. We only do this
if `#[deprecated]` or `#[allow(deprecated)]` exist
on the root object or the variants of the root
object (if it is an enum).
Resolves#2195
Updated the Cargo.toml files for test suites and a link in the README to use Rust edition 2021 instead of 2018. This ensures compatibility with the latest Rust features and standards.
warning: unused import: `syn::punctuated::Punctuated`
--> serde_derive/src/internals/receiver.rs:5:5
|
5 | use syn::punctuated::Punctuated;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= note: `#[warn(unused_imports)]` on by default
Left by the previous commit.
- let segments = mem::replace(&mut path.segments, Punctuated::new());
+ let segments = mem::take(&mut path.segments);
warning: replacing a value of type `T` with `T::default()` is better expressed using `std::mem::take`
--> serde_derive/src/internals/receiver.rs:52:24
|
52 | let segments = mem::replace(&mut path.segments, Punctuated::new());
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using: `std::mem::take(&mut path.segments)`
|
= help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#mem_replace_with_default
= note: `-W clippy::mem-replace-with-default` implied by `-W clippy::all`
= help: to override `-W clippy::all` add `#[allow(clippy::mem_replace_with_default)]`