@@ -647,7 +647,7 @@ fn check_matcher_core(sess: &ParseSess,
647647 let msg = format ! ( "invalid fragment specifier `{}`" , bad_frag) ;
648648 sess. span_diagnostic . struct_span_err ( token. span ( ) , & msg)
649649 . help ( "valid fragment specifiers are `ident`, `block`, `stmt`, `expr`, \
650- `pat`, `ty`, `path`, `meta`, `tt`, `item` and `vis`")
650+ `pat`, `ty`, `literal`, ` path`, `meta`, `tt`, `item` and `vis`")
651651 . emit ( ) ;
652652 // (This eliminates false positives and duplicates
653653 // from error messages.)
@@ -784,6 +784,7 @@ fn frag_can_be_followed_by_any(frag: &str) -> bool {
784784 "item" | // always terminated by `}` or `;`
785785 "block" | // exactly one token tree
786786 "ident" | // exactly one token tree
787+ "literal" | // exactly one token tree
787788 "meta" | // exactly one token tree
788789 "lifetime" | // exactly one token tree
789790 "tt" => // exactly one token tree
@@ -850,6 +851,10 @@ fn is_in_follow(tok: "ed::TokenTree, frag: &str) -> Result<bool, (String, &'
850851 // being a single token, idents and lifetimes are harmless
851852 Ok ( true )
852853 } ,
854+ "literal" => {
855+ // literals may be of a single token, or two tokens (negative numbers)
856+ Ok ( true )
857+ } ,
853858 "meta" | "tt" => {
854859 // being either a single token or a delimited sequence, tt is
855860 // harmless
@@ -873,7 +878,7 @@ fn is_in_follow(tok: "ed::TokenTree, frag: &str) -> Result<bool, (String, &'
873878 _ => Err ( ( format ! ( "invalid fragment specifier `{}`" , frag) ,
874879 "valid fragment specifiers are `ident`, `block`, \
875880 `stmt`, `expr`, `pat`, `ty`, `path`, `meta`, `tt`, \
876- `item` and `vis`") )
881+ `literal`, ` item` and `vis`") )
877882 }
878883 }
879884}
@@ -913,6 +918,18 @@ fn is_legal_fragment_specifier(sess: &ParseSess,
913918 }
914919 true
915920 } ,
921+ "literal" => {
922+ if !features. macro_literal_matcher &&
923+ !attr:: contains_name ( attrs, "allow_internal_unstable" ) {
924+ let explain = feature_gate:: EXPLAIN_LITERAL_MATCHER ;
925+ emit_feature_err ( sess,
926+ "macro_literal_matcher" ,
927+ frag_span,
928+ GateIssue :: Language ,
929+ explain) ;
930+ }
931+ true
932+ } ,
916933 "vis" => {
917934 if !features. macro_vis_matcher &&
918935 !attr:: contains_name ( attrs, "allow_internal_unstable" ) {
0 commit comments