@@ -2,7 +2,7 @@ use crate::ast::{Enum, Field, Input, Struct};
22use crate :: attr:: Trait ;
33use crate :: generics:: InferredBounds ;
44use crate :: unraw:: MemberUnraw ;
5- use proc_macro2:: { Ident , TokenStream } ;
5+ use proc_macro2:: { Ident , Span , TokenStream } ;
66use quote:: { format_ident, quote, quote_spanned, ToTokens } ;
77use std:: collections:: BTreeSet as Set ;
88use syn:: { DeriveInput , GenericArgument , PathArguments , Result , Token , Type } ;
@@ -27,7 +27,7 @@ fn try_expand(input: &DeriveInput) -> Result<TokenStream> {
2727}
2828
2929fn fallback ( input : & DeriveInput , error : syn:: Error ) -> TokenStream {
30- let ty = & input. ident ;
30+ let ty = call_site_ident ( & input. ident ) ;
3131 let ( impl_generics, ty_generics, where_clause) = input. generics . split_for_impl ( ) ;
3232
3333 let error = error. to_compile_error ( ) ;
@@ -55,7 +55,7 @@ fn fallback(input: &DeriveInput, error: syn::Error) -> TokenStream {
5555}
5656
5757fn impl_struct ( input : Struct ) -> TokenStream {
58- let ty = & input. ident ;
58+ let ty = call_site_ident ( & input. ident ) ;
5959 let ( impl_generics, ty_generics, where_clause) = input. generics . split_for_impl ( ) ;
6060 let mut error_inferred_bounds = InferredBounds :: new ( ) ;
6161
@@ -228,7 +228,7 @@ fn impl_struct(input: Struct) -> TokenStream {
228228}
229229
230230fn impl_enum ( input : Enum ) -> TokenStream {
231- let ty = & input. ident ;
231+ let ty = call_site_ident ( & input. ident ) ;
232232 let ( impl_generics, ty_generics, where_clause) = input. generics . split_for_impl ( ) ;
233233 let mut error_inferred_bounds = InferredBounds :: new ( ) ;
234234
@@ -492,6 +492,14 @@ fn impl_enum(input: Enum) -> TokenStream {
492492 }
493493}
494494
495+ // Create an ident with which we can expand `impl Trait for #ident {}` on a
496+ // deprecated type without triggering deprecation warning on the generated impl.
497+ fn call_site_ident ( ident : & Ident ) -> Ident {
498+ let mut ident = ident. clone ( ) ;
499+ ident. set_span ( Span :: call_site ( ) ) ;
500+ ident
501+ }
502+
495503fn fields_pat ( fields : & [ Field ] ) -> TokenStream {
496504 let mut members = fields. iter ( ) . map ( |field| & field. member ) . peekable ( ) ;
497505 match members. peek ( ) {
0 commit comments