diff --git a/compiler/rustc_macros/src/newtype.rs b/compiler/rustc_macros/src/newtype.rs index b59ec34ba7b2d40a5dd3b98ceb22f5ff5665a3e7..f284e5cdd5c1e1be7e773f4adbd288e5a3c5428b 100644 --- a/compiler/rustc_macros/src/newtype.rs +++ b/compiler/rustc_macros/src/newtype.rs @@ -37,7 +37,7 @@ fn parse(input: ParseStream<'_>) -> Result { braced!(body in input); // Any additional `#[derive]` macro paths to apply - let mut derive_paths: Option> = None; + let mut derive_paths: Vec = Vec::new(); let mut debug_format: Option = None; let mut max = None; let mut consts = Vec::new(); @@ -62,28 +62,23 @@ fn parse(input: ParseStream<'_>) -> Result { let derives: Punctuated = derives.parse_terminated(Path::parse)?; try_comma()?; - if let Some(old) = derive_paths.replace(derives.into_iter().collect()) { - panic!("Specified multiple derives: {:?}", old); - } + derive_paths.extend(derives); continue; } if body.lookahead1().peek(kw::DEBUG_FORMAT) { body.parse::()?; body.parse::()?; - if body.lookahead1().peek(kw::custom) { + let new_debug_format = if body.lookahead1().peek(kw::custom) { body.parse::()?; - if let Some(old) = debug_format.replace(DebugFormat::Custom) { - panic!("Specified multiple debug format options: {:?}", old); - } + DebugFormat::Custom } else { let format_str: LitStr = body.parse()?; - if let Some(old) = - debug_format.replace(DebugFormat::Format(format_str.value())) - { - panic!("Specified multiple debug format options: {:?}", old); - } - } + DebugFormat::Format(format_str.value()) + }; try_comma()?; + if let Some(old) = debug_format.replace(new_debug_format) { + panic!("Specified multiple debug format options: {:?}", old); + } continue; } if body.lookahead1().peek(kw::MAX) { @@ -121,7 +116,6 @@ fn parse(input: ParseStream<'_>) -> Result { } } - let derive_paths = derive_paths.unwrap_or_else(Vec::new); let debug_format = debug_format.unwrap_or(DebugFormat::Format("{}".to_string())); // shave off 256 indices at the end to allow space for packing these indices into enums let max = max.unwrap_or_else(|| Lit::Int(LitInt::new("0xFFFF_FF00", Span::call_site()))); @@ -158,7 +152,7 @@ fn fmt(&self, fmt: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { Ok(Self(quote! { #(#attrs)* - #[derive(Copy, PartialEq, Eq, Hash, PartialOrd, Ord, #(#derive_paths),*)] + #[derive(Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord, #(#derive_paths),*)] #[rustc_layout_scalar_valid_range_end(#max)] #vis struct #name { private: u32, @@ -166,13 +160,6 @@ fn fmt(&self, fmt: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { #(#consts)* - impl Clone for #name { - #[inline] - fn clone(&self) -> Self { - *self - } - } - impl #name { /// Maximum value the index can take, as a `u32`. #vis const MAX_AS_U32: u32 = #max; @@ -313,7 +300,6 @@ fn from(value: u32) -> Self { #encodable_impls #debug_impl - })) } }