@@ -138,14 +138,51 @@ pub fn compare_impl_method<'a, 'tcx>(ccx: &CrateCtxt<'a, 'tcx>,
138
138
}
139
139
140
140
if impl_m. fty . sig . 0 . inputs . len ( ) != trait_m. fty . sig . 0 . inputs . len ( ) {
141
- span_err ! ( tcx. sess, impl_m_span, E0050 ,
141
+ let trait_number_args = trait_m. fty . sig . 0 . inputs . len ( ) ;
142
+ let impl_number_args = impl_m. fty . sig . 0 . inputs . len ( ) ;
143
+ let impl_m_node_id = tcx. map . as_local_node_id ( impl_m. def_id ) . unwrap ( ) ;
144
+ let mspan = match tcx. map . expect_impl_item ( impl_m_node_id) . node {
145
+ ImplItemKind :: Method ( ref impl_m_sig, _) => {
146
+ if let Some ( arg) = impl_m_sig. decl . inputs . get (
147
+ if trait_number_args > 0 {
148
+ trait_number_args - 1
149
+ } else {
150
+ 0
151
+ } ) {
152
+ arg. pat . span
153
+ } else {
154
+ impl_m_span
155
+ }
156
+ }
157
+ _ => bug ! ( "{:?} is not a method" , impl_m)
158
+ } ;
159
+ let span = impl_m_span;
160
+ struct_span_err ! ( tcx. sess, mspan, E0050 ,
142
161
"method `{}` has {} parameter{} \
143
162
but the declaration in trait `{}` has {}",
144
163
trait_m. name,
145
- impl_m . fty . sig . 0 . inputs . len ( ) ,
146
- if impl_m . fty . sig . 0 . inputs . len ( ) == 1 { "" } else { "s" } ,
164
+ impl_number_args ,
165
+ if impl_number_args == 1 { "" } else { "s" } ,
147
166
tcx. item_path_str( trait_m. def_id) ,
148
- trait_m. fty. sig. 0 . inputs. len( ) ) ;
167
+ trait_number_args)
168
+ . span_label ( trait_item_span. unwrap ( ) ,
169
+ & format ! ( "trait requires {}" ,
170
+ & if trait_number_args != 1 {
171
+ format!( "{} parameters" , trait_number_args)
172
+ } else {
173
+ format!( "{} parameter" , trait_number_args)
174
+ } ) )
175
+ . span_label ( span,
176
+ & format ! ( "expected {}, found {}" ,
177
+ & if trait_number_args != 1 {
178
+ format!( "{} parameters" ,
179
+ trait_number_args)
180
+ } else {
181
+ format!( "{} parameter" ,
182
+ trait_number_args)
183
+ } ,
184
+ impl_number_args) )
185
+ . emit ( ) ;
149
186
return ;
150
187
}
151
188
0 commit comments