Skip to content

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

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
brson opened this issue Dec 24, 2016 · 7 comments
Closed

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

brson opened this issue Dec 24, 2016 · 7 comments
Assignees
Labels
A-diagnostics Area: Messages for errors, warnings, and lints P-medium Medium priority T-compiler Relevant to the compiler team, which will review and decide on the PR/issue.

Comments

@brson
Copy link
Contributor

brson commented Dec 24, 2016

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

@brson brson added A-diagnostics Area: Messages for errors, warnings, and lints I-nominated T-compiler Relevant to the compiler team, which will review and decide on the PR/issue. labels Dec 24, 2016
@brson
Copy link
Contributor Author

brson commented Dec 24, 2016

cc @erickt

@brson brson changed the title proc macro 1.1 error messages are quite bad proc macro 1.1 error messages spew massive amounts of junk Dec 24, 2016
@nrc
Copy link
Member

nrc commented Dec 29, 2016

I think we could basically never show source spans for proc macro source code. And/or always show the use site, rather than the def site.

@nrc
Copy link
Member

nrc commented Dec 29, 2016

cc @jseyfried @dtolnay

@nikomatsakis
Copy link
Contributor

@jseyfried says he'll take a look when he gets back from vacation

@nikomatsakis
Copy link
Contributor

triage: P-medium

@jseyfried
Copy link
Contributor

Fixed in #38792.

@brson
Copy link
Contributor Author

brson commented Jan 3, 2017

Thank you so much @jseyfried ! This is good polish.

bors added a commit that referenced this issue Jan 6, 2017
…omatsakis

proc macros 1.1: improve diagnostics

Fixes #38586.
r? @nrc
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
A-diagnostics Area: Messages for errors, warnings, and lints P-medium Medium priority T-compiler Relevant to the compiler team, which will review and decide on the PR/issue.
Projects
None yet
Development

No branches or pull requests

5 participants