From db9f9252fe18bcb777624bc643a47a40259efd11 Mon Sep 17 00:00:00 2001 From: daxpedda Date: Fri, 20 Jun 2025 13:05:58 +0200 Subject: [PATCH 1/2] Allow `#[serde(...)]` attributes without `De/Serialize` --- CHANGELOG.md | 7 ++++++- src/attr/item.rs | 12 ------------ src/error.rs | 6 ------ tests/ui/serde/serde.rs | 4 ---- tests/ui/serde/serde.stderr | 14 ++++---------- 5 files changed, 10 insertions(+), 33 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ac08ed9..9fe5a8f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,7 +5,12 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). - +## [Unreleased] + +### Changed +- `#[serde(...)]` attributes are now allowed even when not deriving + `De/Serialize` with `#[derive_where(...)]`. + ## [1.5.0] - 2025-06-08 ### Added diff --git a/src/attr/item.rs b/src/attr/item.rs index e304d50..adea6e5 100644 --- a/src/attr/item.rs +++ b/src/attr/item.rs @@ -96,18 +96,6 @@ impl ItemAttr { return Err(Error::none(span)); } - // Check for `#[serde(...)]` attributes without `De/Serialize`. - #[cfg(feature = "serde")] - if !self_.derive_wheres.iter().any(|derive_where| { - derive_where.contains(Trait::Deserialize) | derive_where.contains(Trait::Serialize) - }) { - for attr in attrs { - if attr.path().is_ident("serde") { - return Err(Error::serde_without_serde(attr.span())); - } - } - } - // Merge `DeriveWhere`s with the same bounds. self_ .derive_wheres diff --git a/src/error.rs b/src/error.rs index d531f0c..6c89095 100644 --- a/src/error.rs +++ b/src/error.rs @@ -301,12 +301,6 @@ impl Error { syn::Error::new(skip_clone, "Cannot skip `Clone` while deriving `Copy`") } - /// Unsupported `serde(...)` without deriving `De/Serialize`. - #[cfg(feature = "serde")] - pub fn serde_without_serde(serde: Span) -> syn::Error { - syn::Error::new(serde, "Found unused `#[serde(...)]`") - } - /// Conflicting `serde(bound ...)` when deriving `De/Serialize`. #[cfg(feature = "serde")] pub fn serde_bound(serde: Span) -> syn::Error { diff --git a/tests/ui/serde/serde.rs b/tests/ui/serde/serde.rs index 0548985..c2d89fd 100644 --- a/tests/ui/serde/serde.rs +++ b/tests/ui/serde/serde.rs @@ -2,10 +2,6 @@ use std::marker::PhantomData; use derive_where::derive_where; -#[derive_where(Clone)] -#[serde(crate = "serde_")] -struct InvalidSerde(PhantomData); - #[derive_where(Deserialize)] #[serde(bound = "")] struct ConflictingBound(PhantomData); diff --git a/tests/ui/serde/serde.stderr b/tests/ui/serde/serde.stderr index 70e8be4..5fdac33 100644 --- a/tests/ui/serde/serde.stderr +++ b/tests/ui/serde/serde.stderr @@ -1,11 +1,5 @@ -error: Found unused `#[serde(...)]` - --> tests/ui/serde/serde.rs:6:1 - | -6 | #[serde(crate = "serde_")] - | ^^^^^^^^^^^^^^^^^^^^^^^^^^ - error: Found conflicting `#[serde(bound ...)]` - --> tests/ui/serde/serde.rs:10:9 - | -10 | #[serde(bound = "")] - | ^^^^^^^^^^ + --> tests/ui/serde/serde.rs:6:9 + | +6 | #[serde(bound = "")] + | ^^^^^^^^^^ From 8808e7bddccb0a205818c92c5fb2f4b91e31af68 Mon Sep 17 00:00:00 2001 From: daxpedda Date: Fri, 20 Jun 2025 13:15:06 +0200 Subject: [PATCH 2/2] Add test --- tests/ui/serde/serde.rs | 4 ++++ tests/ui/serde/serde.stderr | 8 ++++---- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/tests/ui/serde/serde.rs b/tests/ui/serde/serde.rs index c2d89fd..ea719c6 100644 --- a/tests/ui/serde/serde.rs +++ b/tests/ui/serde/serde.rs @@ -2,6 +2,10 @@ use std::marker::PhantomData; use derive_where::derive_where; +#[derive_where(Clone)] +#[serde(crate = "serde_")] +struct ValidSerde(PhantomData); + #[derive_where(Deserialize)] #[serde(bound = "")] struct ConflictingBound(PhantomData); diff --git a/tests/ui/serde/serde.stderr b/tests/ui/serde/serde.stderr index 5fdac33..8e16051 100644 --- a/tests/ui/serde/serde.stderr +++ b/tests/ui/serde/serde.stderr @@ -1,5 +1,5 @@ error: Found conflicting `#[serde(bound ...)]` - --> tests/ui/serde/serde.rs:6:9 - | -6 | #[serde(bound = "")] - | ^^^^^^^^^^ + --> tests/ui/serde/serde.rs:10:9 + | +10 | #[serde(bound = "")] + | ^^^^^^^^^^