@@ -266,61 +266,63 @@ impl<'a, 'gcx, 'tcx> InferCtxt<'a, 'gcx, 'tcx> {
266
266
267
267
let span = obligation. cause . span ;
268
268
let mut report = None ;
269
- for item in self . tcx . get_attrs ( def_id) . iter ( ) {
270
- if item. check_name ( "rustc_on_unimplemented" ) {
271
- let err_sp = item. meta ( ) . span . substitute_dummy ( span) ;
272
- let trait_str = self . tcx . item_path_str ( trait_ref. def_id ) ;
273
- if let Some ( istring) = item. value_str ( ) {
274
- let istring = & * istring. as_str ( ) ;
275
- let generics = self . tcx . item_generics ( trait_ref. def_id ) ;
276
- let generic_map = generics. types . iter ( ) . map ( |param| {
277
- ( param. name . as_str ( ) . to_string ( ) ,
278
- trait_ref. substs . type_for_def ( param) . to_string ( ) )
279
- } ) . collect :: < FxHashMap < String , String > > ( ) ;
280
- let parser = Parser :: new ( istring) ;
281
- let mut errored = false ;
282
- let err: String = parser. filter_map ( |p| {
283
- match p {
284
- Piece :: String ( s) => Some ( s) ,
285
- Piece :: NextArgument ( a) => match a. position {
286
- Position :: ArgumentNamed ( s) => match generic_map. get ( s) {
287
- Some ( val) => Some ( val) ,
288
- None => {
289
- span_err ! ( self . tcx. sess, err_sp, E0272 ,
290
- "the #[rustc_on_unimplemented] \
291
- attribute on \
292
- trait definition for {} refers to \
293
- non-existent type parameter {}",
294
- trait_str, s) ;
295
- errored = true ;
296
- None
297
- }
298
- } ,
299
- _ => {
300
- span_err ! ( self . tcx. sess, err_sp, E0273 ,
301
- "the #[rustc_on_unimplemented] attribute \
302
- on trait definition for {} must have \
303
- named format arguments, eg \
304
- `#[rustc_on_unimplemented = \
305
- \" foo {{T}}\" ]`", trait_str) ;
269
+ if let Some ( item) = self . tcx
270
+ . get_attrs ( def_id)
271
+ . into_iter ( )
272
+ . filter ( |a| a. check_name ( "rustc_on_unimplemented" ) )
273
+ . next ( )
274
+ {
275
+ let err_sp = item. meta ( ) . span . substitute_dummy ( span) ;
276
+ let trait_str = self . tcx . item_path_str ( trait_ref. def_id ) ;
277
+ if let Some ( istring) = item. value_str ( ) {
278
+ let istring = & * istring. as_str ( ) ;
279
+ let generics = self . tcx . item_generics ( trait_ref. def_id ) ;
280
+ let generic_map = generics. types . iter ( ) . map ( |param| {
281
+ ( param. name . as_str ( ) . to_string ( ) ,
282
+ trait_ref. substs . type_for_def ( param) . to_string ( ) )
283
+ } ) . collect :: < FxHashMap < String , String > > ( ) ;
284
+ let parser = Parser :: new ( istring) ;
285
+ let mut errored = false ;
286
+ let err: String = parser. filter_map ( |p| {
287
+ match p {
288
+ Piece :: String ( s) => Some ( s) ,
289
+ Piece :: NextArgument ( a) => match a. position {
290
+ Position :: ArgumentNamed ( s) => match generic_map. get ( s) {
291
+ Some ( val) => Some ( val) ,
292
+ None => {
293
+ span_err ! ( self . tcx. sess, err_sp, E0272 ,
294
+ "the #[rustc_on_unimplemented] \
295
+ attribute on \
296
+ trait definition for {} refers to \
297
+ non-existent type parameter {}",
298
+ trait_str, s) ;
306
299
errored = true ;
307
300
None
308
301
}
302
+ } ,
303
+ _ => {
304
+ span_err ! ( self . tcx. sess, err_sp, E0273 ,
305
+ "the #[rustc_on_unimplemented] attribute \
306
+ on trait definition for {} must have \
307
+ named format arguments, eg \
308
+ `#[rustc_on_unimplemented = \
309
+ \" foo {{T}}\" ]`", trait_str) ;
310
+ errored = true ;
311
+ None
309
312
}
310
313
}
311
- } ) . collect ( ) ;
312
- // Report only if the format string checks out
313
- if !errored {
314
- report = Some ( err) ;
315
314
}
316
- } else {
317
- span_err ! ( self . tcx. sess, err_sp, E0274 ,
318
- "the #[rustc_on_unimplemented] attribute on \
319
- trait definition for {} must have a value, \
320
- eg `#[rustc_on_unimplemented = \" foo\" ]`",
321
- trait_str) ;
315
+ } ) . collect ( ) ;
316
+ // Report only if the format string checks out
317
+ if !errored {
318
+ report = Some ( err) ;
322
319
}
323
- break ;
320
+ } else {
321
+ span_err ! ( self . tcx. sess, err_sp, E0274 ,
322
+ "the #[rustc_on_unimplemented] attribute on \
323
+ trait definition for {} must have a value, \
324
+ eg `#[rustc_on_unimplemented = \" foo\" ]`",
325
+ trait_str) ;
324
326
}
325
327
}
326
328
report
0 commit comments