Enforce derive cannot be used against serde_core

Even for a simple data structure that would ordinarily expand to an impl
that only refers to the public Serde traits without serde::__private, we
still disallow a (renamed) serde_core dependency. This leaves the
liberty to new usage of private helpers in such impls over time. For
example, similar to the optimization of the standard library's
derive(Debug) that introduced debug_struct_field1_finish to improve
compile time of derived impls.
This commit is contained in:
David Tolnay
2025-09-13 09:39:58 -07:00
parent 3c747e4585
commit 8909fc0c60
3 changed files with 19 additions and 0 deletions
+6
View File
@@ -256,3 +256,9 @@ extern crate serde_derive;
#[cfg(feature = "serde_derive")]
#[cfg_attr(docsrs, doc(cfg(feature = "derive")))]
pub use serde_derive::{Deserialize, Serialize};
#[macro_export]
#[doc(hidden)]
macro_rules! __require_serde_not_serde_core {
() => {};
}
+10
View File
@@ -266,3 +266,13 @@ mod seed;
#[cfg(all(not(feature = "std"), no_core_error))]
mod std_error;
#[macro_export]
#[doc(hidden)]
macro_rules! __require_serde_not_serde_core {
() => {
::core::compile_error!(
"Serde derive requires a dependency on the serde crate, not serde_core"
);
};
}
+3
View File
@@ -22,6 +22,9 @@ pub fn wrap_in_const(serde_path: Option<&syn::Path>, code: TokenStream) -> Token
)]
const _: () = {
#use_serde
_serde::__require_serde_not_serde_core!();
#code
};
}