@@ -266,61 +266,63 @@ impl<'a, 'gcx, 'tcx> InferCtxt<'a, 'gcx, 'tcx> {
266266
267267 let span = obligation. cause . span ;
268268 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) ;
306299 errored = true ;
307300 None
308301 }
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
309312 }
310313 }
311- } ) . collect ( ) ;
312- // Report only if the format string checks out
313- if !errored {
314- report = Some ( err) ;
315314 }
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) ;
322319 }
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) ;
324326 }
325327 }
326328 report
0 commit comments