@@ -37,6 +37,21 @@ pub trait TypeErrCtxtExt<'tcx> {
37
37
) -> OnUnimplementedNote ;
38
38
}
39
39
40
+ /// The symbols which are always allowed in a format string
41
+ static ALLOWED_FORMAT_SYMBOLS : & [ Symbol ] = & [
42
+ kw:: SelfUpper ,
43
+ sym:: ItemContext ,
44
+ sym:: from_method,
45
+ sym:: from_desugaring,
46
+ sym:: direct,
47
+ sym:: cause,
48
+ sym:: integral,
49
+ sym:: integer_,
50
+ sym:: float,
51
+ sym:: _Self,
52
+ sym:: crate_local,
53
+ ] ;
54
+
40
55
impl < ' tcx > TypeErrCtxtExt < ' tcx > for TypeErrCtxt < ' _ , ' tcx > {
41
56
fn impl_similar_to (
42
57
& self ,
@@ -543,38 +558,26 @@ impl<'tcx> OnUnimplementedFormatString {
543
558
Piece :: NextArgument ( a) => match a. position {
544
559
Position :: ArgumentNamed ( s) => {
545
560
match Symbol :: intern ( s) {
546
- // `{Self}` is allowed
547
- kw:: SelfUpper => ( ) ,
548
561
// `{ThisTraitsName}` is allowed
549
562
s if s == trait_name => ( ) ,
550
- // `{from_method}` is allowed
551
- sym:: from_method => ( ) ,
552
- // `{from_desugaring}` is allowed
553
- sym:: from_desugaring => ( ) ,
554
- // `{ItemContext}` is allowed
555
- sym:: ItemContext => ( ) ,
556
- // `{integral}` and `{integer}` and `{float}` are allowed
557
- sym:: integral | sym:: integer_ | sym:: float => ( ) ,
563
+ s if ALLOWED_FORMAT_SYMBOLS . contains ( & s) => ( ) ,
558
564
// So is `{A}` if A is a type parameter
559
- s => match generics. params . iter ( ) . find ( |param| param. name == s) {
560
- Some ( _) => ( ) ,
561
- None => {
562
- let reported = struct_span_err ! (
563
- tcx. sess,
564
- span,
565
- E0230 ,
566
- "there is no parameter `{}` on {}" ,
567
- s,
568
- if trait_def_id == item_def_id {
569
- format!( "trait `{}`" , trait_name)
570
- } else {
571
- "impl" . to_string( )
572
- }
573
- )
574
- . emit ( ) ;
575
- result = Err ( reported) ;
576
- }
577
- } ,
565
+ s if generics. params . iter ( ) . any ( |param| param. name == s) => ( ) ,
566
+ s => {
567
+ result = Err ( struct_span_err ! (
568
+ tcx. sess,
569
+ span,
570
+ E0230 ,
571
+ "there is no parameter `{}` on {}" ,
572
+ s,
573
+ if trait_def_id == item_def_id {
574
+ format!( "trait `{}`" , trait_name)
575
+ } else {
576
+ "impl" . to_string( )
577
+ }
578
+ )
579
+ . emit ( ) ) ;
580
+ }
578
581
}
579
582
}
580
583
// `{:1}` and `{}` are not to be used
0 commit comments