Skip to content

proc macro 1.1 error messages spew massive amounts of junk #38586

Closed
@brson

Description

@brson

This is an example of an error message I got with serde and serde_derive 0.8.20 on a recent nightly. As pasted here it doesn't look horrific, but it consists of massive lines of garbage and whitespace that wordwrap on the console to create a nonsense maelstrom.

Even if we accept that the error messages must be bad, I think we can do considerably better than this. This is scheduled to be stable with 1.15 in feb. Can we fix this up before?

cc @nrc @jonathandturner

$ cargo run -- create-local-job run-tc stable
   Compiling cargobomb v0.1.0 (file:///home/ec2-user/cargobomb)
error[E0432]: unresolved import `serde::Serealize`
  --> src/model.rs:17:13
   |
17 | use serde::{Serealize, Deserialize};
   |             ^^^^^^^^^ no `Serealize` in the root. Did you mean to use `Serialize`?

error[E0277]: the trait bound `docker::Container: serde::Serialize` is not satisfied
 --> <proc-macro source code>:1:506
  |
1 | # [ allow ( non_upper_case_globals , unused_attributes , unused_qualifications ) ] const _IMPL_SERIALIZE_FOR_DockerJob : ( ) = { extern crate serde as _serde ; # [ automatically_derived ] impl _serde :: ser :: Serialize for DockerJob { fn serialize < __S > ( & self , _serializer : & mut __S ) -> :: std :: result :: Result < ( ) , __S :: Error > where __S : _serde :: ser :: Serializer { let mut __serde_state = try ! ( _serializer . serialize_struct ( "DockerJob" , 0 + 1 + 1 ) ) ; try ! ( _serializer . serialize_struct_elt ( & mut __serde_state , "id" , & self . id ) ) ; try ! ( _serializer . serialize_struct_elt ( & mut __serde_state , "state" , & self . state ) ) ; _serializer . serialize_struct_end ( __serde_state ) } } } ;
  |                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          ^^^^^^^^^^^^^^^^^^^^^ the trait `serde::Serialize` is not implemented for `docker::Container`
  |
  = note: required because of the requirements on the impl of `serde::Serialize` for `&docker::Container`

error[E0277]: the trait bound `docker::Container: serde::Deserialize` is not satisfied
 --> <proc-macro source code>:1:1964
  |
1 | # [ allow ( non_upper_case_globals , unused_attributes , unused_qualifications ) ] const _IMPL_DESERIALIZE_FOR_DockerJob : ( ) = { extern crate serde as _serde ; # [ automatically_derived ] impl _serde :: de :: Deserialize for DockerJob { fn deserialize < __D > ( deserializer : & mut __D ) -> :: std :: result :: Result < DockerJob , __D :: Error > where __D : _serde :: de :: Deserializer { # [ allow ( non_camel_case_types ) ] enum __Field { __field0 , __field1 , __ignore , } impl _serde :: de :: Deserialize for __Field { # [ inline ] fn deserialize < __D > ( deserializer : & mut __D ) -> :: std :: result :: Result < __Field , __D :: Error > where __D : _serde :: de :: Deserializer , { struct __FieldVisitor ; impl _serde :: de :: Visitor for __FieldVisitor { type Value = __Field ; fn visit_usize < __E > ( & mut self , value : usize ) -> :: std :: result :: Result < __Field , __E > where __E : _serde :: de :: Error { match value { 0usize => { Ok ( __Field :: __field0 ) } 1usize => { Ok ( __Field :: __field1 ) } _ => Ok ( __Field :: __ignore ) } } fn visit_str < __E > ( & mut self , value : & str ) -> :: std :: result :: Result < __Field , __E > where __E : _serde :: de :: Error { match value { "id" => { Ok ( __Field :: __field0 ) } "state" => { Ok ( __Field :: __field1 ) } _ => Ok ( __Field :: __ignore ) } } fn visit_bytes < __E > ( & mut self , value : & [ u8 ] ) -> :: std :: result :: Result < __Field , __E > where __E : _serde :: de :: Error { match value { b"id" => { Ok ( __Field :: __field0 ) } b"state" => { Ok ( __Field :: __field1 ) } _ => Ok ( __Field :: __ignore ) } } } deserializer . deserialize_struct_field ( __FieldVisitor ) } } struct __Visitor ; impl _serde :: de :: Visitor for __Visitor { type Value = DockerJob ; # [ inline ] fn visit_seq < __V > ( & mut self , mut visitor : __V ) -> :: std :: result :: Result < DockerJob , __V :: Error > where __V : _serde :: de :: SeqVisitor { let __field0 = match try ! ( visitor . visit :: < Container > ( ) ) { Some ( value ) => { value } , None => { try ! ( visitor . end ( ) ) ; return Err ( _serde :: de :: Error :: invalid_length ( 0usize ) ) ; } } ; let __field1 = match try ! ( visitor . visit :: < JobState > ( ) ) { Some ( value ) => { value } , None => { try ! ( visitor . end ( ) ) ; return Err ( _serde :: de :: Error :: invalid_length ( 1usize ) ) ; } } ; try ! ( visitor . end ( ) ) ; Ok ( DockerJob { id : __field0 , state : __field1 } ) } # [ inline ] fn visit_map < __V > ( & mut self , mut visitor : __V ) -> :: std :: result :: Result < DockerJob , __V :: Error > where __V : _serde :: de :: MapVisitor { let mut __field0 : Option < Container > = None ; let mut __field1 : Option < JobState > = None ; while let Some ( key ) = try ! ( visitor . visit_key :: < __Field > ( ) ) { match key { __Field :: __field0 => { if __field0 . is_some ( ) { return Err ( < __V :: Error as _serde :: de :: Error > :: duplicate_field ( "id" ) ) ; } __field0 = Some ( try ! ( visitor . visit_value :: < Container > ( ) ) ) ; } __Field :: __field1 => { if __field1 . is_some ( ) { return Err ( < __V :: Error as _serde :: de :: Error > :: duplicate_field ( "state" ) ) ; } __field1 = Some ( try ! ( visitor . visit_value :: < JobState > ( ) ) ) ; } _ => { let _ = try ! ( visitor . visit_value :: < _serde :: de :: impls :: IgnoredAny > ( ) ) ; } } } try ! ( visitor . end ( ) ) ; let __field0 = match __field0 { Some ( __field0 ) => __field0 , None => try ! ( visitor . missing_field ( "id" ) ) } ; let __field1 = match __field1 { Some ( __field1 ) => __field1 , None => try ! ( visitor . missing_field ( "state" ) ) } ; Ok ( DockerJob { id : __field0 , state : __field1 } ) } } const FIELDS : & 'static [ & 'static str ] = & [ "id" , "state" ] ; deserializer . deserialize_struct ( "DockerJob" , FIELDS , __Visitor ) } } } ;
  |                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            ^^^^^^ the trait `serde::Deserialize` is not implemented for `docker::Container`

error[E0277]: the trait bound `docker::Container: serde::Deserialize` is not satisfied
 --> <proc-macro source code>:1:2970
  |
1 | # [ allow ( non_upper_case_globals , unused_attributes , unused_qualifications ) ] const _IMPL_DESERIALIZE_FOR_DockerJob : ( ) = { extern crate serde as _serde ; # [ automatically_derived ] impl _serde :: de :: Deserialize for DockerJob { fn deserialize < __D > ( deserializer : & mut __D ) -> :: std :: result :: Result < DockerJob , __D :: Error > where __D : _serde :: de :: Deserializer { # [ allow ( non_camel_case_types ) ] enum __Field { __field0 , __field1 , __ignore , } impl _serde :: de :: Deserialize for __Field { # [ inline ] fn deserialize < __D > ( deserializer : & mut __D ) -> :: std :: result :: Result < __Field , __D :: Error > where __D : _serde :: de :: Deserializer , { struct __FieldVisitor ; impl _serde :: de :: Visitor for __FieldVisitor { type Value = __Field ; fn visit_usize < __E > ( & mut self , value : usize ) -> :: std :: result :: Result < __Field , __E > where __E : _serde :: de :: Error { match value { 0usize => { Ok ( __Field :: __field0 ) } 1usize => { Ok ( __Field :: __field1 ) } _ => Ok ( __Field :: __ignore ) } } fn visit_str < __E > ( & mut self , value : & str ) -> :: std :: result :: Result < __Field , __E > where __E : _serde :: de :: Error { match value { "id" => { Ok ( __Field :: __field0 ) } "state" => { Ok ( __Field :: __field1 ) } _ => Ok ( __Field :: __ignore ) } } fn visit_bytes < __E > ( & mut self , value : & [ u8 ] ) -> :: std :: result :: Result < __Field , __E > where __E : _serde :: de :: Error { match value { b"id" => { Ok ( __Field :: __field0 ) } b"state" => { Ok ( __Field :: __field1 ) } _ => Ok ( __Field :: __ignore ) } } } deserializer . deserialize_struct_field ( __FieldVisitor ) } } struct __Visitor ; impl _serde :: de :: Visitor for __Visitor { type Value = DockerJob ; # [ inline ] fn visit_seq < __V > ( & mut self , mut visitor : __V ) -> :: std :: result :: Result < DockerJob , __V :: Error > where __V : _serde :: de :: SeqVisitor { let __field0 = match try ! ( visitor . visit :: < Container > ( ) ) { Some ( value ) => { value } , None => { try ! ( visitor . end ( ) ) ; return Err ( _serde :: de :: Error :: invalid_length ( 0usize ) ) ; } } ; let __field1 = match try ! ( visitor . visit :: < JobState > ( ) ) { Some ( value ) => { value } , None => { try ! ( visitor . end ( ) ) ; return Err ( _serde :: de :: Error :: invalid_length ( 1usize ) ) ; } } ; try ! ( visitor . end ( ) ) ; Ok ( DockerJob { id : __field0 , state : __field1 } ) } # [ inline ] fn visit_map < __V > ( & mut self , mut visitor : __V ) -> :: std :: result :: Result < DockerJob , __V :: Error > where __V : _serde :: de :: MapVisitor { let mut __field0 : Option < Container > = None ; let mut __field1 : Option < JobState > = None ; while let Some ( key ) = try ! ( visitor . visit_key :: < __Field > ( ) ) { match key { __Field :: __field0 => { if __field0 . is_some ( ) { return Err ( < __V :: Error as _serde :: de :: Error > :: duplicate_field ( "id" ) ) ; } __field0 = Some ( try ! ( visitor . visit_value :: < Container > ( ) ) ) ; } __Field :: __field1 => { if __field1 . is_some ( ) { return Err ( < __V :: Error as _serde :: de :: Error > :: duplicate_field ( "state" ) ) ; } __field1 = Some ( try ! ( visitor . visit_value :: < JobState > ( ) ) ) ; } _ => { let _ = try ! ( visitor . visit_value :: < _serde :: de :: impls :: IgnoredAny > ( ) ) ; } } } try ! ( visitor . end ( ) ) ; let __field0 = match __field0 { Some ( __field0 ) => __field0 , None => try ! ( visitor . missing_field ( "id" ) ) } ; let __field1 = match __field1 { Some ( __field1 ) => __field1 , None => try ! ( visitor . missing_field ( "state" ) ) } ; Ok ( DockerJob { id : __field0 , state : __field1 } ) } } const FIELDS : & 'static [ & 'static str ] = & [ "id" , "state" ] ; deserializer . deserialize_struct ( "DockerJob" , FIELDS , __Visitor ) } } } ;
  |                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          ^^^^^^^^^^^^ the trait `serde::Deserialize` is not implemented for `docker::Container`

error[E0277]: the trait bound `docker::Container: serde::Deserialize` is not satisfied
 --> <proc-macro source code>:1:3454
  |
1 | # [ allow ( non_upper_case_globals , unused_attributes , unused_qualifications ) ] const _IMPL_DESERIALIZE_FOR_DockerJob : ( ) = { extern crate serde as _serde ; # [ automatically_derived ] impl _serde :: de :: Deserialize for DockerJob { fn deserialize < __D > ( deserializer : & mut __D ) -> :: std :: result :: Result < DockerJob , __D :: Error > where __D : _serde :: de :: Deserializer { # [ allow ( non_camel_case_types ) ] enum __Field { __field0 , __field1 , __ignore , } impl _serde :: de :: Deserialize for __Field { # [ inline ] fn deserialize < __D > ( deserializer : & mut __D ) -> :: std :: result :: Result < __Field , __D :: Error > where __D : _serde :: de :: Deserializer , { struct __FieldVisitor ; impl _serde :: de :: Visitor for __FieldVisitor { type Value = __Field ; fn visit_usize < __E > ( & mut self , value : usize ) -> :: std :: result :: Result < __Field , __E > where __E : _serde :: de :: Error { match value { 0usize => { Ok ( __Field :: __field0 ) } 1usize => { Ok ( __Field :: __field1 ) } _ => Ok ( __Field :: __ignore ) } } fn visit_str < __E > ( & mut self , value : & str ) -> :: std :: result :: Result < __Field , __E > where __E : _serde :: de :: Error { match value { "id" => { Ok ( __Field :: __field0 ) } "state" => { Ok ( __Field :: __field1 ) } _ => Ok ( __Field :: __ignore ) } } fn visit_bytes < __E > ( & mut self , value : & [ u8 ] ) -> :: std :: result :: Result < __Field , __E > where __E : _serde :: de :: Error { match value { b"id" => { Ok ( __Field :: __field0 ) } b"state" => { Ok ( __Field :: __field1 ) } _ => Ok ( __Field :: __ignore ) } } } deserializer . deserialize_struct_field ( __FieldVisitor ) } } struct __Visitor ; impl _serde :: de :: Visitor for __Visitor { type Value = DockerJob ; # [ inline ] fn visit_seq < __V > ( & mut self , mut visitor : __V ) -> :: std :: result :: Result < DockerJob , __V :: Error > where __V : _serde :: de :: SeqVisitor { let __field0 = match try ! ( visitor . visit :: < Container > ( ) ) { Some ( value ) => { value } , None => { try ! ( visitor . end ( ) ) ; return Err ( _serde :: de :: Error :: invalid_length ( 0usize ) ) ; } } ; let __field1 = match try ! ( visitor . visit :: < JobState > ( ) ) { Some ( value ) => { value } , None => { try ! ( visitor . end ( ) ) ; return Err ( _serde :: de :: Error :: invalid_length ( 1usize ) ) ; } } ; try ! ( visitor . end ( ) ) ; Ok ( DockerJob { id : __field0 , state : __field1 } ) } # [ inline ] fn visit_map < __V > ( & mut self , mut visitor : __V ) -> :: std :: result :: Result < DockerJob , __V :: Error > where __V : _serde :: de :: MapVisitor { let mut __field0 : Option < Container > = None ; let mut __field1 : Option < JobState > = None ; while let Some ( key ) = try ! ( visitor . visit_key :: < __Field > ( ) ) { match key { __Field :: __field0 => { if __field0 . is_some ( ) { return Err ( < __V :: Error as _serde :: de :: Error > :: duplicate_field ( "id" ) ) ; } __field0 = Some ( try ! ( visitor . visit_value :: < Container > ( ) ) ) ; } __Field :: __field1 => { if __field1 . is_some ( ) { return Err ( < __V :: Error as _serde :: de :: Error > :: duplicate_field ( "state" ) ) ; } __field1 = Some ( try ! ( visitor . visit_value :: < JobState > ( ) ) ) ; } _ => { let _ = try ! ( visitor . visit_value :: < _serde :: de :: impls :: IgnoredAny > ( ) ) ; } } } try ! ( visitor . end ( ) ) ; let __field0 = match __field0 { Some ( __field0 ) => __field0 , None => try ! ( visitor . missing_field ( "id" ) ) } ; let __field1 = match __field1 { Some ( __field1 ) => __field1 , None => try ! ( visitor . missing_field ( "state" ) ) } ; Ok ( DockerJob { id : __field0 , state : __field1 } ) } } const FIELDS : & 'static [ & 'static str ] = & [ "id" , "state" ] ; deserializer . deserialize_struct ( "DockerJob" , FIELDS , __Visitor ) } } } ;
  |                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              ^^^^^^^^^^^^^^ the trait `serde::Deserialize` is not implemented for `docker::Container`

error: aborting due to 4 previous errors

Metadata

Metadata

Assignees

Labels

A-diagnosticsArea: Messages for errors, warnings, and lintsP-mediumMedium priorityT-compilerRelevant to the compiler team, which will review and decide on the PR/issue.

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions