@@ -201,9 +201,8 @@ fn impl_enum(input: Enum) -> TokenStream {
201201 None
202202 } ;
203203
204- let backtrace_method =
205- if input. has_backtrace ( ) {
206- let arms = input. variants . iter ( ) . map ( |variant| {
204+ let backtrace_method = if input. has_backtrace ( ) {
205+ let arms = input. variants . iter ( ) . map ( |variant| {
207206 let ident = & variant. ident ;
208207 match ( variant. backtrace_field ( ) , variant. source_field ( ) ) {
209208 ( Some ( backtrace_field) , Some ( source_field) )
@@ -245,8 +244,14 @@ fn impl_enum(input: Enum) -> TokenStream {
245244 let backtrace = & backtrace_field. member ;
246245 if variant. source_field ( ) . map_or ( false , |f| f. member == * backtrace) {
247246 let varsource = quote ! ( source) ;
248- let source_backtrace = quote_spanned ! { backtrace. span( ) =>
249- #varsource. as_dyn_error( ) . backtrace( )
247+ let source_backtrace = if type_is_option ( backtrace_field. ty ) {
248+ quote_spanned ! { backtrace. span( ) =>
249+ #varsource. as_ref( ) . and_then( |source| source. as_dyn_error( ) . backtrace( ) )
250+ }
251+ } else {
252+ quote_spanned ! { backtrace. span( ) =>
253+ #varsource. as_dyn_error( ) . backtrace( )
254+ }
250255 } ;
251256 quote ! {
252257 #ty:: #ident { #backtrace: #varsource, ..} => {
@@ -270,17 +275,17 @@ fn impl_enum(input: Enum) -> TokenStream {
270275 } ,
271276 }
272277 } ) ;
273- Some ( quote ! {
274- fn backtrace( & self ) -> std:: option:: Option <& std:: backtrace:: Backtrace > {
275- #[ allow( deprecated) ]
276- match self {
277- #( #arms) *
278- }
278+ Some ( quote ! {
279+ fn backtrace( & self ) -> std:: option:: Option <& std:: backtrace:: Backtrace > {
280+ #[ allow( deprecated) ]
281+ match self {
282+ #( #arms) *
279283 }
280- } )
281- } else {
282- None
283- } ;
284+ }
285+ } )
286+ } else {
287+ None
288+ } ;
284289
285290 let display_impl = if input. has_display ( ) {
286291 let use_as_display = if input. variants . iter ( ) . any ( |v| {
0 commit comments