Previously if someone wrote an enum containing:
- `A` (untagged)
- `B` (tagged)
- `C` (tagged)
- `D` (untagged)
- `E` (tagged)
- `F` (untagged)
serde_derive would produce errors referring to B and E only, saying
you're supposed to put untagged variants at the end. The choice of B and
E for this error doesn't make a lot of sense because in order to resolve
the issue, the user must either:
- move A and D down
or:
- move B, C, and E up.
This commit changes the error to appear on A and D instead.
This count should mean the number of fields expected in the serialized form,
so if some fields are skipped, they shouldn't be counted
Methods affected:
- Deserializer::deserialize_tuple
- Deserializer::deserialize_tuple_struct
- VariantAccess::tuple_variant
Without serde(bound = ""), serde_derive infers a bound of `T: Serialize`
for the generated Serialize impl and `T: Deserialize<'de> + Default` for
the Deserialize impl. `X` implements none of these so the generated code
would fail to compile.
error[E0277]: the trait bound `X: Serialize` is not satisfied
--> test_suite/tests/test_gen.rs:268:14
|
268 | assert::<PhantomDataWrapper<X>>();
| ^^^^^^^^^^^^^^^^^^^^^ the trait `Serialize` is not implemented for `X`
|
= help: the following other types implement trait `Serialize`:
&'a T
&'a mut T
()
(T0, T1)
(T0, T1, T2)
(T0, T1, T2, T3)
(T0, T1, T2, T3, T4)
(T0, T1, T2, T3, T4, T5)
and 248 others
note: required for `PhantomDataWrapper<X>` to implement `Serialize`
--> test_suite/tests/test_gen.rs:262:14
|
262 | #[derive(Serialize, Deserialize)]
| ^^^^^^^^^ unsatisfied trait bound introduced in this `derive` macro
263 | //#[serde(bound = "")]
264 | struct PhantomDataWrapper<T> {
| ^^^^^^^^^^^^^^^^^^^^^
note: required by a bound in `assert`
--> test_suite/tests/test_gen.rs:767:14
|
767 | fn assert<T: Serialize + DeserializeOwned>() {}
| ^^^^^^^^^ required by this bound in `assert`
= note: this error originates in the derive macro `Serialize` (in Nightly builds, run with -Z macro-backtrace for more info)
error[E0277]: the trait bound `X: Deserialize<'_>` is not satisfied
--> test_suite/tests/test_gen.rs:268:14
|
268 | assert::<PhantomDataWrapper<X>>();
| ^^^^^^^^^^^^^^^^^^^^^ the trait `Deserialize<'_>` is not implemented for `X`
|
= help: the following other types implement trait `Deserialize<'de>`:
<&'a Path as Deserialize<'de>>
<&'a [u8] as Deserialize<'de>>
<&'a str as Deserialize<'de>>
<() as Deserialize<'de>>
<(T0, T1) as Deserialize<'de>>
<(T0, T1, T2) as Deserialize<'de>>
<(T0, T1, T2, T3) as Deserialize<'de>>
<(T0, T1, T2, T3, T4) as Deserialize<'de>>
and 331 others
note: required for `PhantomDataWrapper<X>` to implement `for<'de> Deserialize<'de>`
--> test_suite/tests/test_gen.rs:262:25
|
262 | #[derive(Serialize, Deserialize)]
| ^^^^^^^^^^^ unsatisfied trait bound introduced in this `derive` macro
263 | //#[serde(bound = "")]
264 | struct PhantomDataWrapper<T> {
| ^^^^^^^^^^^^^^^^^^^^^
= note: required for `PhantomDataWrapper<X>` to implement `DeserializeOwned`
note: required by a bound in `assert`
--> test_suite/tests/test_gen.rs:767:26
|
767 | fn assert<T: Serialize + DeserializeOwned>() {}
| ^^^^^^^^^^^^^^^^ required by this bound in `assert`
= note: this error originates in the derive macro `Deserialize` (in Nightly builds, run with -Z macro-backtrace for more info)
error[E0277]: the trait bound `X: Default` is not satisfied
--> test_suite/tests/test_gen.rs:268:14
|
268 | assert::<PhantomDataWrapper<X>>();
| ^^^^^^^^^^^^^^^^^^^^^ the trait `Default` is not implemented for `X`
|
note: required for `PhantomDataWrapper<X>` to implement `for<'de> Deserialize<'de>`
--> test_suite/tests/test_gen.rs:262:25
|
262 | #[derive(Serialize, Deserialize)]
| ^^^^^^^^^^^ unsatisfied trait bound introduced in this `derive` macro
263 | //#[serde(bound = "")]
264 | struct PhantomDataWrapper<T> {
| ^^^^^^^^^^^^^^^^^^^^^
= note: required for `PhantomDataWrapper<X>` to implement `DeserializeOwned`
note: required by a bound in `assert`
--> test_suite/tests/test_gen.rs:767:26
|
767 | fn assert<T: Serialize + DeserializeOwned>() {}
| ^^^^^^^^^^^^^^^^ required by this bound in `assert`
= note: this error originates in the derive macro `Deserialize` (in Nightly builds, run with -Z macro-backtrace for more info)
help: consider annotating `X` with `#[derive(Default)]`
|
779 | #[derive(Default)]
|
warning: lint `unaligned_references` has been removed: converted into hard error, see issue #82523 <https://github.com/rust-lang/rust/issues/82523> for more information
--> test_suite/tests/test_macros.rs:1931:8
|
1931 | #[deny(unaligned_references)]
| ^^^^^^^^^^^^^^^^^^^^
|
= note: `#[warn(renamed_and_removed_lints)]` on by default
Clippy's suggested fix is not valid in 2018 edition. The
serde_test_suite crate can't be updated to 2021 edition yet because CI
of the serde crate on old toolchains needs to be able to parse all
manifests in the workspace, even if serde_test_suite is not being
compiled in those builds.
error: variables can be used directly in the `format!` string
--> test_suite/tests/test_de.rs:2260:23
|
2260 | Err(e) => panic!("tokens failed to deserialize: {}", e),
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#uninlined_format_args
= note: `-D clippy::uninlined-format-args` implied by `-D clippy::pedantic`
help: change this to
|
2260 - Err(e) => panic!("tokens failed to deserialize: {}", e),
2260 + Err(e) => panic!("tokens failed to deserialize: {e}"),
|
warning: unused variable: `e`
--> test_suite/tests/test_de.rs:2260:17
|
2260 | Err(e) => panic!("tokens failed to deserialize: {e}"),
| ^ help: if this is intentional, prefix it with an underscore: `_e`
|
= note: `#[warn(unused_variables)]` on by default
warning: panic message contains an unused formatting placeholder
--> test_suite/tests/test_de.rs:2260:61
|
2260 | Err(e) => panic!("tokens failed to deserialize: {e}"),
| ^^^
|
= note: this message is not used as a format string when given without arguments, but will be in Rust 2021
= note: `#[warn(non_fmt_panics)]` on by default
help: add the missing argument
|
2260 | Err(e) => panic!("tokens failed to deserialize: {e}", ...),
| +++++
help: or add a "{}" format string to use the message literally
|
2260 | Err(e) => panic!("{}", "tokens failed to deserialize: {e}"),
| +++++
error: variables can be used directly in the `format!` string
--> test_suite/tests/test_annotations.rs:1238:30
|
1238 | serializer.serialize_str(format!("{};{:?}", f1, f2).as_str())
| ^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#uninlined_format_args
= note: `-D clippy::uninlined-format-args` implied by `-D clippy::pedantic`
help: change this to
|
1238 - serializer.serialize_str(format!("{};{:?}", f1, f2).as_str())
1238 + serializer.serialize_str(format!("{f1};{f2:?}").as_str())
|