From 9689896e118cdac01334f933d57171b42ed24c75 Mon Sep 17 00:00:00 2001 From: alice Hartley Date: Tue, 15 Sep 2026 22:18:30 +0000 Subject: [PATCH 1/4] Ensure derive attrs are ordered before non-derive attrs. --- derive/src/lib.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/derive/src/lib.rs b/derive/src/lib.rs index cfcabe1..0dd2a96 100644 --- a/derive/src/lib.rs +++ b/derive/src/lib.rs @@ -172,6 +172,7 @@ fn open_enum_impl( // To make `match` seamless, derive(PartialEq, Eq) if they aren't already. let mut extra_derives = vec![quote!(::core::cmp::PartialEq), quote!(::core::cmp::Eq)]; + let mut extra_attrs: Vec = Vec::with_capacity(enum_.attrs.len()); let mut make_custom_debug_impl = false; for attr in &enum_.attrs { @@ -218,7 +219,7 @@ fn open_enum_impl( _ => {} } if include_in_struct { - struct_attrs.push(attr.to_token_stream()); + extra_attrs.push(attr.to_token_stream()); } } @@ -242,6 +243,7 @@ fn open_enum_impl( if !extra_derives.is_empty() { struct_attrs.push(quote!(#[derive(#(#extra_derives),*)])); } + struct_attrs.append(&mut extra_attrs); let alias_check = if allow_alias { TokenStream::default() From 22777e9386f61e2a73f164c3e0b9dfcf76de04f2 Mon Sep 17 00:00:00 2001 From: alice Hartley Date: Wed, 16 Sep 2026 23:28:47 +0000 Subject: [PATCH 2/4] Add test for attr ordering. --- Cargo.toml | 1 + tests/derives.rs | 7 +++++++ tests/test_derive_helper_attr/Cargo.toml | 9 +++++++++ tests/test_derive_helper_attr/src/lib.rs | 6 ++++++ 4 files changed, 23 insertions(+) create mode 100644 tests/test_derive_helper_attr/Cargo.toml create mode 100644 tests/test_derive_helper_attr/src/lib.rs diff --git a/Cargo.toml b/Cargo.toml index 449092a..b79629d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -28,6 +28,7 @@ libc = { version = "0.2", optional = true } [dev-dependencies] trybuild = "1" zerocopy = { version = "0.7.11", features = ["derive"] } +test_derive_helper_attr = {path = "tests/test_derive_helper_attr" } [workspace] members = ["derive"] diff --git a/tests/derives.rs b/tests/derives.rs index 93bf4f9..6ccb05f 100644 --- a/tests/derives.rs +++ b/tests/derives.rs @@ -4,6 +4,7 @@ extern crate open_enum; use open_enum::*; +use test_derive_helper_attr::WithTestAttr; #[open_enum] #[derive( @@ -88,3 +89,9 @@ fn extended_embedded_enum_struct_debug() { ); assert!(debug_str.contains("Red"), "{debug_str}"); } + +// Fails to build if test_attr is re-ordered above derive attrs. +#[open_enum] +#[derive(WithTestAttr)] +#[test_attr] +enum AttrOrder {} diff --git a/tests/test_derive_helper_attr/Cargo.toml b/tests/test_derive_helper_attr/Cargo.toml new file mode 100644 index 0000000..5114d0c --- /dev/null +++ b/tests/test_derive_helper_attr/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "test_derive_helper_attr" +edition = "2021" + +[lib] +proc-macro = true + +[dependencies] +proc-macro2 = "1.0.43" diff --git a/tests/test_derive_helper_attr/src/lib.rs b/tests/test_derive_helper_attr/src/lib.rs new file mode 100644 index 0000000..3a94ef3 --- /dev/null +++ b/tests/test_derive_helper_attr/src/lib.rs @@ -0,0 +1,6 @@ +use proc_macro::TokenStream; + +#[proc_macro_derive(WithTestAttr, attributes(test_attr))] +pub fn derive_with_test_attr(_item: TokenStream) -> TokenStream { + TokenStream::new() +} From b3cdcc3c7985761cae6aa233dd0e7c580170d47d Mon Sep 17 00:00:00 2001 From: alice Hartley Date: Mon, 28 Sep 2026 17:44:12 +0000 Subject: [PATCH 3/4] Use zerocopy derive attr for test. --- Cargo.toml | 1 - tests/derives.rs | 6 +++--- tests/test_derive_helper_attr/Cargo.toml | 9 --------- tests/test_derive_helper_attr/src/lib.rs | 6 ------ 4 files changed, 3 insertions(+), 19 deletions(-) delete mode 100644 tests/test_derive_helper_attr/Cargo.toml delete mode 100644 tests/test_derive_helper_attr/src/lib.rs diff --git a/Cargo.toml b/Cargo.toml index 2c5df77..876a8fb 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -27,7 +27,6 @@ libc = { version = "0.2", optional = true } [dev-dependencies] trybuild = "1" -test_derive_helper_attr = {path = "tests/test_derive_helper_attr" } zerocopy = { version = "0.8.24", features = ["derive"] } [workspace] diff --git a/tests/derives.rs b/tests/derives.rs index d79d521..e0ca5ef 100644 --- a/tests/derives.rs +++ b/tests/derives.rs @@ -4,7 +4,6 @@ extern crate open_enum; use open_enum::*; -use test_derive_helper_attr::WithTestAttr; #[open_enum] #[derive( @@ -91,7 +90,8 @@ fn extended_embedded_enum_struct_debug() { } // Fails to build if test_attr is re-ordered above derive attrs. +#[repr(u8)] #[open_enum] -#[derive(WithTestAttr)] -#[test_attr] +#[derive(zerocopy::IntoBytes)] +#[zerocopy(crate = "zerocopy")] enum AttrOrder {} diff --git a/tests/test_derive_helper_attr/Cargo.toml b/tests/test_derive_helper_attr/Cargo.toml deleted file mode 100644 index 5114d0c..0000000 --- a/tests/test_derive_helper_attr/Cargo.toml +++ /dev/null @@ -1,9 +0,0 @@ -[package] -name = "test_derive_helper_attr" -edition = "2021" - -[lib] -proc-macro = true - -[dependencies] -proc-macro2 = "1.0.43" diff --git a/tests/test_derive_helper_attr/src/lib.rs b/tests/test_derive_helper_attr/src/lib.rs deleted file mode 100644 index 3a94ef3..0000000 --- a/tests/test_derive_helper_attr/src/lib.rs +++ /dev/null @@ -1,6 +0,0 @@ -use proc_macro::TokenStream; - -#[proc_macro_derive(WithTestAttr, attributes(test_attr))] -pub fn derive_with_test_attr(_item: TokenStream) -> TokenStream { - TokenStream::new() -} From af5df103ae4093a95f11069f8cc20a401f06339f Mon Sep 17 00:00:00 2001 From: Alyssa Haroldsen Date: Mon, 28 Sep 2026 11:49:07 -0700 Subject: [PATCH 4/4] Correct tests/derives.rs comment --- tests/derives.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/derives.rs b/tests/derives.rs index e0ca5ef..ed01ab4 100644 --- a/tests/derives.rs +++ b/tests/derives.rs @@ -89,7 +89,7 @@ fn extended_embedded_enum_struct_debug() { assert!(debug_str.contains("Red"), "{debug_str}"); } -// Fails to build if test_attr is re-ordered above derive attrs. +// Fails to build if `#[zerocopy(...)]` is re-ordered above derive attrs. #[repr(u8)] #[open_enum] #[derive(zerocopy::IntoBytes)]