diff -Nru rust-prost-derive-0.12.6/Cargo.toml rust-prost-derive-0.13.5/Cargo.toml --- rust-prost-derive-0.12.6/Cargo.toml 1970-01-01 00:00:01.000000000 +0000 +++ rust-prost-derive-0.13.5/Cargo.toml 1970-01-01 00:00:01.000000000 +0000 @@ -11,34 +11,39 @@ [package] edition = "2021" -rust-version = "1.70" +rust-version = "1.71.1" name = "prost-derive" -version = "0.12.6" +version = "0.13.5" authors = [ "Dan Burkert ", "Lucio Franco ", "Casper Meijn ", "Tokio Contributors ", ] +build = false +autolib = false +autobins = false +autoexamples = false +autotests = false +autobenches = false description = "Generate encoding and decoding implementations for Prost annotated types." -documentation = "https://docs.rs/prost-derive" readme = "README.md" license = "Apache-2.0" repository = "https://github.com/tokio-rs/prost" [lib] -proc_macro = true +name = "prost_derive" +path = "src/lib.rs" +proc-macro = true [dependencies.anyhow] version = "1.0.1" [dependencies.itertools] -version = ">=0.10, <=0.12" -features = ["use_alloc"] -default-features = false +version = ">=0.10.1, <=0.14" [dependencies.proc-macro2] -version = "1" +version = "1.0.60" [dependencies.quote] version = "1" diff -Nru rust-prost-derive-0.12.6/Cargo.toml.orig rust-prost-derive-0.13.5/Cargo.toml.orig --- rust-prost-derive-0.12.6/Cargo.toml.orig 2006-07-24 01:21:28.000000000 +0000 +++ rust-prost-derive-0.13.5/Cargo.toml.orig 2006-07-24 01:21:28.000000000 +0000 @@ -1,26 +1,20 @@ [package] name = "prost-derive" -version = "0.12.6" -authors = [ - "Dan Burkert ", - "Lucio Franco ", - "Casper Meijn ", - "Tokio Contributors ", -] -license = "Apache-2.0" -repository = "https://github.com/tokio-rs/prost" -documentation = "https://docs.rs/prost-derive" readme = "README.md" description = "Generate encoding and decoding implementations for Prost annotated types." -edition = "2021" -rust-version = "1.70" +version.workspace = true +authors.workspace = true +license.workspace = true +repository.workspace = true +edition.workspace = true +rust-version.workspace = true [lib] -proc_macro = true +proc-macro = true [dependencies] anyhow = "1.0.1" -itertools = { version = ">=0.10, <=0.12", default-features = false, features = ["use_alloc"] } -proc-macro2 = "1" +itertools = ">=0.10.1, <=0.14" +proc-macro2 = "1.0.60" quote = "1" syn = { version = "2", features = ["extra-traits"] } diff -Nru rust-prost-derive-0.12.6/.cargo_vcs_info.json rust-prost-derive-0.13.5/.cargo_vcs_info.json --- rust-prost-derive-0.12.6/.cargo_vcs_info.json 1970-01-01 00:00:01.000000000 +0000 +++ rust-prost-derive-0.13.5/.cargo_vcs_info.json 1970-01-01 00:00:01.000000000 +0000 @@ -1,6 +1,6 @@ { "git": { - "sha1": "d42c85e790263f78f6c626ceb0dac5fda0edcb41" + "sha1": "d505b184e933e1f9ff5679106ffc51b7e3c2755e" }, "path_in_vcs": "prost-derive" } \ No newline at end of file diff -Nru rust-prost-derive-0.12.6/debian/cargo-checksum.json rust-prost-derive-0.13.5/debian/cargo-checksum.json --- rust-prost-derive-0.12.6/debian/cargo-checksum.json 2024-07-05 12:45:24.000000000 +0000 +++ rust-prost-derive-0.13.5/debian/cargo-checksum.json 2025-04-10 11:18:42.000000000 +0000 @@ -1 +1 @@ -{"package":"Could not get crate checksum","files":{}} +{"package":"8a56d757972c98b346a9b766e3f02746cde6dd1cd1d1d563472929fdd74bec4d","files":{}} diff -Nru rust-prost-derive-0.12.6/debian/changelog rust-prost-derive-0.13.5/debian/changelog --- rust-prost-derive-0.12.6/debian/changelog 2024-07-05 12:45:24.000000000 +0000 +++ rust-prost-derive-0.13.5/debian/changelog 2025-04-10 11:18:42.000000000 +0000 @@ -1,3 +1,10 @@ +rust-prost-derive (0.13.5-1) UNRELEASED-FIXME-AUTOGENERATED-DEBCARGO; urgency=medium + + * Team upload. + * Package prost-derive 0.13.5 from crates.io using debcargo 2.7.8 + + -- Blair Noctis Thu, 10 Apr 2025 11:18:42 +0000 + rust-prost-derive (0.12.6-1) unstable; urgency=medium * Team upload. diff -Nru rust-prost-derive-0.12.6/debian/compat rust-prost-derive-0.13.5/debian/compat --- rust-prost-derive-0.12.6/debian/compat 2024-07-05 12:45:24.000000000 +0000 +++ rust-prost-derive-0.13.5/debian/compat 1970-01-01 00:00:00.000000000 +0000 @@ -1 +0,0 @@ -12 diff -Nru rust-prost-derive-0.12.6/debian/control rust-prost-derive-0.13.5/debian/control --- rust-prost-derive-0.12.6/debian/control 2024-07-05 12:45:24.000000000 +0000 +++ rust-prost-derive-0.13.5/debian/control 2025-04-10 11:18:42.000000000 +0000 @@ -1,23 +1,25 @@ Source: rust-prost-derive Section: rust Priority: optional -Build-Depends: debhelper (>= 12), - dh-cargo (>= 25), - cargo:native , - rustc:native (>= 1.70) , +Build-Depends: debhelper-compat (= 13), + dh-sequence-cargo +Build-Depends-Arch: cargo:native , + rustc:native (>= 1.71.1) , libstd-rust-dev , librust-anyhow-1+default-dev (>= 1.0.1-~~) , - librust-itertools+use-alloc-dev (>= 0.10-~~) , - librust-proc-macro2-1+default-dev , + librust-itertools+default-dev (<< 0.15-~~) , + librust-itertools+default-dev (>= 0.10.1-~~) , + librust-proc-macro2-1+default-dev (>= 1.0.60-~~) , librust-quote-1+default-dev , librust-syn-2+default-dev , librust-syn-2+extra-traits-dev Maintainer: Debian Rust Maintainers Uploaders: Emanuele Rocca -Standards-Version: 4.6.2 +Standards-Version: 4.7.0 Vcs-Git: https://salsa.debian.org/rust-team/debcargo-conf.git [src/prost-derive] Vcs-Browser: https://salsa.debian.org/rust-team/debcargo-conf/tree/master/src/prost-derive +Homepage: https://github.com/tokio-rs/prost X-Cargo-Crate: prost-derive Rules-Requires-Root: no @@ -27,8 +29,9 @@ Depends: ${misc:Depends}, librust-anyhow-1+default-dev (>= 1.0.1-~~), - librust-itertools+use-alloc-dev (>= 0.10-~~), - librust-proc-macro2-1+default-dev, + librust-itertools+default-dev (<< 0.15-~~), + librust-itertools+default-dev (>= 0.10.1-~~), + librust-proc-macro2-1+default-dev (>= 1.0.60-~~), librust-quote-1+default-dev, librust-syn-2+default-dev, librust-syn-2+extra-traits-dev @@ -36,9 +39,9 @@ librust-prost-derive+default-dev (= ${binary:Version}), librust-prost-derive-0-dev (= ${binary:Version}), librust-prost-derive-0+default-dev (= ${binary:Version}), - librust-prost-derive-0.12-dev (= ${binary:Version}), - librust-prost-derive-0.12+default-dev (= ${binary:Version}), - librust-prost-derive-0.12.6-dev (= ${binary:Version}), - librust-prost-derive-0.12.6+default-dev (= ${binary:Version}) + librust-prost-derive-0.13-dev (= ${binary:Version}), + librust-prost-derive-0.13+default-dev (= ${binary:Version}), + librust-prost-derive-0.13.5-dev (= ${binary:Version}), + librust-prost-derive-0.13.5+default-dev (= ${binary:Version}) Description: Generate encoding and decoding implementations for Prost annotated types - Rust source code Source code for Debianized Rust crate "prost-derive" diff -Nru rust-prost-derive-0.12.6/debian/copyright.debcargo.hint rust-prost-derive-0.13.5/debian/copyright.debcargo.hint --- rust-prost-derive-0.12.6/debian/copyright.debcargo.hint 2024-07-05 12:45:24.000000000 +0000 +++ rust-prost-derive-0.13.5/debian/copyright.debcargo.hint 2025-04-10 11:18:42.000000000 +0000 @@ -29,8 +29,8 @@ Files: debian/* Copyright: - 2023-2024 Debian Rust Maintainers - 2023-2024 Emanuele Rocca + 2023-2025 Debian Rust Maintainers + 2023-2025 Emanuele Rocca License: Apache-2.0 License: Apache-2.0 diff -Nru rust-prost-derive-0.12.6/debian/debcargo.toml rust-prost-derive-0.13.5/debian/debcargo.toml --- rust-prost-derive-0.12.6/debian/debcargo.toml 2024-07-05 12:45:24.000000000 +0000 +++ rust-prost-derive-0.13.5/debian/debcargo.toml 2025-04-10 11:18:42.000000000 +0000 @@ -1,2 +1,4 @@ overlay = "." uploaders = ["Emanuele Rocca "] + +collapse_features = true \ No newline at end of file diff -Nru rust-prost-derive-0.12.6/debian/patches/relax-depends.patch rust-prost-derive-0.13.5/debian/patches/relax-depends.patch --- rust-prost-derive-0.12.6/debian/patches/relax-depends.patch 2024-07-05 12:45:24.000000000 +0000 +++ rust-prost-derive-0.13.5/debian/patches/relax-depends.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,13 +0,0 @@ -Index: prost-derive/Cargo.toml -=================================================================== ---- prost-derive.orig/Cargo.toml -+++ prost-derive/Cargo.toml -@@ -33,7 +33,7 @@ proc_macro = true - version = "1.0.1" - - [dependencies.itertools] --version = ">=0.10, <=0.12" -+version = ">=0.10" - features = ["use_alloc"] - default-features = false - diff -Nru rust-prost-derive-0.12.6/debian/patches/series rust-prost-derive-0.13.5/debian/patches/series --- rust-prost-derive-0.12.6/debian/patches/series 2024-07-05 12:45:24.000000000 +0000 +++ rust-prost-derive-0.13.5/debian/patches/series 1970-01-01 00:00:00.000000000 +0000 @@ -1 +0,0 @@ -relax-depends.patch diff -Nru rust-prost-derive-0.12.6/debian/tests/control rust-prost-derive-0.13.5/debian/tests/control --- rust-prost-derive-0.12.6/debian/tests/control 2024-07-05 12:45:24.000000000 +0000 +++ rust-prost-derive-0.13.5/debian/tests/control 2025-04-10 11:18:42.000000000 +0000 @@ -1,14 +1,14 @@ -Test-Command: /usr/share/cargo/bin/cargo-auto-test prost-derive 0.12.6 --all-targets --all-features +Test-Command: /usr/share/cargo/bin/cargo-auto-test prost-derive 0.13.5 --all-targets --all-features Features: test-name=rust-prost-derive:@ -Depends: dh-cargo (>= 18), @ +Depends: dh-cargo (>= 31), rustc (>= 1.71.1), @ Restrictions: allow-stderr, skip-not-installable -Test-Command: /usr/share/cargo/bin/cargo-auto-test prost-derive 0.12.6 --all-targets +Test-Command: /usr/share/cargo/bin/cargo-auto-test prost-derive 0.13.5 --all-targets Features: test-name=librust-prost-derive-dev:default -Depends: dh-cargo (>= 18), @ +Depends: dh-cargo (>= 31), rustc (>= 1.71.1), @ Restrictions: allow-stderr, skip-not-installable -Test-Command: /usr/share/cargo/bin/cargo-auto-test prost-derive 0.12.6 --all-targets --no-default-features +Test-Command: /usr/share/cargo/bin/cargo-auto-test prost-derive 0.13.5 --all-targets --no-default-features Features: test-name=librust-prost-derive-dev: -Depends: dh-cargo (>= 18), @ +Depends: dh-cargo (>= 31), rustc (>= 1.71.1), @ Restrictions: allow-stderr, skip-not-installable diff -Nru rust-prost-derive-0.12.6/debian/watch rust-prost-derive-0.13.5/debian/watch --- rust-prost-derive-0.12.6/debian/watch 2024-07-05 12:45:24.000000000 +0000 +++ rust-prost-derive-0.13.5/debian/watch 2025-04-10 11:18:42.000000000 +0000 @@ -1,4 +1,4 @@ version=4 opts=filenamemangle=s/.*\/(.*)\/download/prost-derive-$1\.tar\.gz/g,\ -uversionmangle=s/(\d)[_\.\-\+]?((RC|rc|pre|dev|beta|alpha)\d*)$/$1~$2/ \ +uversionmangle=s/(\d)[_\.\-\+]?((RC|rc|pre|dev|beta|alpha)\.?\d*)$/$1~$2/ \ https://qa.debian.org/cgi-bin/fakeupstream.cgi?upstream=crates.io/prost-derive .*/crates/prost-derive/@ANY_VERSION@/download diff -Nru rust-prost-derive-0.12.6/src/field/group.rs rust-prost-derive-0.13.5/src/field/group.rs --- rust-prost-derive-0.12.6/src/field/group.rs 2006-07-24 01:21:28.000000000 +0000 +++ rust-prost-derive-0.13.5/src/field/group.rs 2006-07-24 01:21:28.000000000 +0000 @@ -38,10 +38,11 @@ return Ok(None); } - match unknown_attrs.len() { - 0 => (), - 1 => bail!("unknown attribute for group field: {:?}", unknown_attrs[0]), - _ => bail!("unknown attributes for group field: {:?}", unknown_attrs), + if !unknown_attrs.is_empty() { + bail!( + "unknown attribute(s) for group field: #[prost({})]", + quote!(#(#unknown_attrs),*) + ); } let tag = match tag.or(inferred_tag) { diff -Nru rust-prost-derive-0.12.6/src/field/message.rs rust-prost-derive-0.13.5/src/field/message.rs --- rust-prost-derive-0.12.6/src/field/message.rs 2006-07-24 01:21:28.000000000 +0000 +++ rust-prost-derive-0.13.5/src/field/message.rs 2006-07-24 01:21:28.000000000 +0000 @@ -38,13 +38,11 @@ return Ok(None); } - match unknown_attrs.len() { - 0 => (), - 1 => bail!( - "unknown attribute for message field: {:?}", - unknown_attrs[0] - ), - _ => bail!("unknown attributes for message field: {:?}", unknown_attrs), + if !unknown_attrs.is_empty() { + bail!( + "unknown attribute(s) for message field: #[prost({})]", + quote!(#(#unknown_attrs),*) + ); } let tag = match tag.or(inferred_tag) { diff -Nru rust-prost-derive-0.12.6/src/field/oneof.rs rust-prost-derive-0.13.5/src/field/oneof.rs --- rust-prost-derive-0.12.6/src/field/oneof.rs 2006-07-24 01:21:28.000000000 +0000 +++ rust-prost-derive-0.13.5/src/field/oneof.rs 2006-07-24 01:21:28.000000000 +0000 @@ -44,13 +44,11 @@ None => return Ok(None), }; - match unknown_attrs.len() { - 0 => (), - 1 => bail!( - "unknown attribute for message field: {:?}", - unknown_attrs[0] - ), - _ => bail!("unknown attributes for message field: {:?}", unknown_attrs), + if !unknown_attrs.is_empty() { + bail!( + "unknown attribute(s) for message field: #[prost({})]", + quote!(#(#unknown_attrs),*) + ); } let tags = match tags { diff -Nru rust-prost-derive-0.12.6/src/field/scalar.rs rust-prost-derive-0.13.5/src/field/scalar.rs --- rust-prost-derive-0.12.6/src/field/scalar.rs 2006-07-24 01:21:28.000000000 +0000 +++ rust-prost-derive-0.13.5/src/field/scalar.rs 2006-07-24 01:21:28.000000000 +0000 @@ -46,10 +46,11 @@ None => return Ok(None), }; - match unknown_attrs.len() { - 0 => (), - 1 => bail!("unknown attribute: {:?}", unknown_attrs[0]), - _ => bail!("unknown attributes: {:?}", unknown_attrs), + if !unknown_attrs.is_empty() { + bail!( + "unknown attribute(s): #[prost({})]", + quote!(#(#unknown_attrs),*) + ); } let tag = match tag.or(inferred_tag) { diff -Nru rust-prost-derive-0.12.6/src/lib.rs rust-prost-derive-0.13.5/src/lib.rs --- rust-prost-derive-0.12.6/src/lib.rs 2006-07-24 01:21:28.000000000 +0000 +++ rust-prost-derive-0.13.5/src/lib.rs 2006-07-24 01:21:28.000000000 +0000 @@ -1,4 +1,4 @@ -#![doc(html_root_url = "https://docs.rs/prost-derive/0.12.6")] +#![doc(html_root_url = "https://docs.rs/prost-derive/0.13.5")] // The `quote!` macro requires deep recursion. #![recursion_limit = "4096"] @@ -7,8 +7,7 @@ use anyhow::{bail, Error}; use itertools::Itertools; -use proc_macro::TokenStream; -use proc_macro2::Span; +use proc_macro2::{Span, TokenStream}; use quote::quote; use syn::{ punctuated::Punctuated, Data, DataEnum, DataStruct, DeriveInput, Expr, Fields, FieldsNamed, @@ -19,7 +18,7 @@ use crate::field::Field; fn try_message(input: TokenStream) -> Result { - let input: DeriveInput = syn::parse(input)?; + let input: DeriveInput = syn::parse2(input)?; let ident = input.ident; @@ -91,16 +90,18 @@ fields.sort_by_key(|(_, field)| field.tags().into_iter().min().unwrap()); let fields = fields; - let mut tags = fields + if let Some(duplicate_tag) = fields .iter() .flat_map(|(_, field)| field.tags()) - .collect::>(); - let num_tags = tags.len(); - tags.sort_unstable(); - tags.dedup(); - if tags.len() != num_tags { - bail!("message {} has fields with duplicate tags", ident); - } + .duplicates() + .next() + { + bail!( + "message {} has multiple fields with tag {}", + ident, + duplicate_tag + ) + }; let encoded_len = fields .iter() @@ -174,19 +175,19 @@ let expanded = quote! { impl #impl_generics ::prost::Message for #ident #ty_generics #where_clause { #[allow(unused_variables)] - fn encode_raw(&self, buf: &mut B) where B: ::prost::bytes::BufMut { + fn encode_raw(&self, buf: &mut impl ::prost::bytes::BufMut) { #(#encode)* } #[allow(unused_variables)] - fn merge_field( + fn merge_field( &mut self, tag: u32, - wire_type: ::prost::encoding::WireType, - buf: &mut B, + wire_type: ::prost::encoding::wire_type::WireType, + buf: &mut impl ::prost::bytes::Buf, ctx: ::prost::encoding::DecodeContext, ) -> ::core::result::Result<(), ::prost::DecodeError> - where B: ::prost::bytes::Buf { + { #struct_name match tag { #(#merge)* @@ -251,16 +252,16 @@ #methods }; - Ok(expanded.into()) + Ok(expanded) } #[proc_macro_derive(Message, attributes(prost))] -pub fn message(input: TokenStream) -> TokenStream { - try_message(input).unwrap() +pub fn message(input: proc_macro::TokenStream) -> proc_macro::TokenStream { + try_message(input.into()).unwrap().into() } fn try_enumeration(input: TokenStream) -> Result { - let input: DeriveInput = syn::parse(input)?; + let input: DeriveInput = syn::parse2(input)?; let ident = input.ident; let generics = &input.generics; @@ -348,27 +349,27 @@ } impl #impl_generics ::core::convert::TryFrom:: for #ident #ty_generics #where_clause { - type Error = ::prost::DecodeError; + type Error = ::prost::UnknownEnumValue; - fn try_from(value: i32) -> ::core::result::Result<#ident, ::prost::DecodeError> { + fn try_from(value: i32) -> ::core::result::Result<#ident, ::prost::UnknownEnumValue> { match value { #(#try_from,)* - _ => ::core::result::Result::Err(::prost::DecodeError::new("invalid enumeration value")), + _ => ::core::result::Result::Err(::prost::UnknownEnumValue(value)), } } } }; - Ok(expanded.into()) + Ok(expanded) } #[proc_macro_derive(Enumeration, attributes(prost))] -pub fn enumeration(input: TokenStream) -> TokenStream { - try_enumeration(input).unwrap() +pub fn enumeration(input: proc_macro::TokenStream) -> proc_macro::TokenStream { + try_enumeration(input.into()).unwrap().into() } fn try_oneof(input: TokenStream) -> Result { - let input: DeriveInput = syn::parse(input)?; + let input: DeriveInput = syn::parse2(input)?; let ident = input.ident; @@ -412,23 +413,21 @@ } } - let mut tags = fields + // Oneof variants cannot be oneofs themselves, so it's impossible to have a field with multiple + // tags. + assert!(fields.iter().all(|(_, field)| field.tags().len() == 1)); + + if let Some(duplicate_tag) = fields .iter() - .flat_map(|(variant_ident, field)| -> Result { - if field.tags().len() > 1 { - bail!( - "invalid oneof variant {}::{}: oneof variants may only have a single tag", - ident, - variant_ident - ); - } - Ok(field.tags()[0]) - }) - .collect::>(); - tags.sort_unstable(); - tags.dedup(); - if tags.len() != fields.len() { - panic!("invalid oneof {}: variants have duplicate tags", ident); + .flat_map(|(_, field)| field.tags()) + .duplicates() + .next() + { + bail!( + "invalid oneof {}: multiple variants have tag {}", + ident, + duplicate_tag + ); } let encode = fields.iter().map(|(variant_ident, field)| { @@ -463,21 +462,21 @@ let expanded = quote! { impl #impl_generics #ident #ty_generics #where_clause { /// Encodes the message to a buffer. - pub fn encode(&self, buf: &mut B) where B: ::prost::bytes::BufMut { + pub fn encode(&self, buf: &mut impl ::prost::bytes::BufMut) { match *self { #(#encode,)* } } /// Decodes an instance of the message from a buffer, and merges it into self. - pub fn merge( + pub fn merge( field: &mut ::core::option::Option<#ident #ty_generics>, tag: u32, - wire_type: ::prost::encoding::WireType, - buf: &mut B, + wire_type: ::prost::encoding::wire_type::WireType, + buf: &mut impl ::prost::bytes::Buf, ctx: ::prost::encoding::DecodeContext, ) -> ::core::result::Result<(), ::prost::DecodeError> - where B: ::prost::bytes::Buf { + { match tag { #(#merge,)* _ => unreachable!(concat!("invalid ", stringify!(#ident), " tag: {}"), tag), @@ -519,10 +518,99 @@ } }; - Ok(expanded.into()) + Ok(expanded) } #[proc_macro_derive(Oneof, attributes(prost))] -pub fn oneof(input: TokenStream) -> TokenStream { - try_oneof(input).unwrap() +pub fn oneof(input: proc_macro::TokenStream) -> proc_macro::TokenStream { + try_oneof(input.into()).unwrap().into() +} + +#[cfg(test)] +mod test { + use crate::{try_message, try_oneof}; + use quote::quote; + + #[test] + fn test_rejects_colliding_message_fields() { + let output = try_message(quote!( + struct Invalid { + #[prost(bool, tag = "1")] + a: bool, + #[prost(oneof = "super::Whatever", tags = "4, 5, 1")] + b: Option, + } + )); + assert_eq!( + output + .expect_err("did not reject colliding message fields") + .to_string(), + "message Invalid has multiple fields with tag 1" + ); + } + + #[test] + fn test_rejects_colliding_oneof_variants() { + let output = try_oneof(quote!( + pub enum Invalid { + #[prost(bool, tag = "1")] + A(bool), + #[prost(bool, tag = "3")] + B(bool), + #[prost(bool, tag = "1")] + C(bool), + } + )); + assert_eq!( + output + .expect_err("did not reject colliding oneof variants") + .to_string(), + "invalid oneof Invalid: multiple variants have tag 1" + ); + } + + #[test] + fn test_rejects_multiple_tags_oneof_variant() { + let output = try_oneof(quote!( + enum What { + #[prost(bool, tag = "1", tag = "2")] + A(bool), + } + )); + assert_eq!( + output + .expect_err("did not reject multiple tags on oneof variant") + .to_string(), + "duplicate tag attributes: 1 and 2" + ); + + let output = try_oneof(quote!( + enum What { + #[prost(bool, tag = "3")] + #[prost(tag = "4")] + A(bool), + } + )); + assert!(output.is_err()); + assert_eq!( + output + .expect_err("did not reject multiple tags on oneof variant") + .to_string(), + "duplicate tag attributes: 3 and 4" + ); + + let output = try_oneof(quote!( + enum What { + #[prost(bool, tags = "5,6")] + A(bool), + } + )); + assert!(output.is_err()); + assert_eq!( + output + .expect_err("did not reject multiple tags on oneof variant") + .to_string(), + "unknown attribute(s): #[prost(tags = \"5,6\")]" + ); + } }