@@ -110,30 +110,40 @@ pub fn compare_impl_method<'a, 'tcx>(ccx: &CrateCtxt<'a, 'tcx>,
110
110
_ => bug ! ( "{:?} is not a method" , impl_m)
111
111
} ;
112
112
113
- struct_span_err ! ( tcx. sess, span, E0049 ,
113
+ let mut err = struct_span_err ! ( tcx. sess, span, E0049 ,
114
114
"method `{}` has {} type parameter{} \
115
115
but its trait declaration has {} type parameter{}",
116
116
trait_m. name,
117
117
num_impl_m_type_params,
118
118
if num_impl_m_type_params == 1 { "" } else { "s" } ,
119
119
num_trait_m_type_params,
120
- if num_trait_m_type_params == 1 { "" } else { "s" } )
121
- . span_label ( trait_item_span. unwrap ( ) ,
122
- & format ! ( "expected {}" ,
123
- & if num_trait_m_type_params != 1 {
124
- format!( "{} type parameters" ,
125
- num_trait_m_type_params)
126
- } else {
127
- format!( "{} type parameter" ,
128
- num_trait_m_type_params)
129
- } ) )
130
- . span_label ( span, & format ! ( "found {}" ,
131
- & if num_impl_m_type_params != 1 {
132
- format!( "{} type parameters" , num_impl_m_type_params)
133
- } else {
134
- format!( "1 type parameter" )
135
- } ) )
136
- . emit ( ) ;
120
+ if num_trait_m_type_params == 1 { "" } else { "s" } ) ;
121
+
122
+ let mut suffix = None ;
123
+
124
+ if let Some ( span) = trait_item_span {
125
+ err. span_label ( span,
126
+ & format ! ( "expected {}" ,
127
+ & if num_trait_m_type_params != 1 {
128
+ format!( "{} type parameters" , num_trait_m_type_params)
129
+ } else {
130
+ format!( "{} type parameter" , num_trait_m_type_params)
131
+ } ) ) ;
132
+ } else {
133
+ suffix = Some ( format ! ( ", expected {}" , num_trait_m_type_params) ) ;
134
+ }
135
+
136
+ err. span_label ( span,
137
+ & format ! ( "found {}{}" ,
138
+ & if num_impl_m_type_params != 1 {
139
+ format!( "{} type parameters" , num_impl_m_type_params)
140
+ } else {
141
+ format!( "1 type parameter" )
142
+ } ,
143
+ suffix. as_ref( ) . map( |s| & s[ ..] ) . unwrap_or( "" ) ) ) ;
144
+
145
+ err. emit ( ) ;
146
+
137
147
return ;
138
148
}
139
149
0 commit comments