1111use ast:: NodeId ;
1212use early_buffered_lints:: BufferedEarlyLintId ;
1313use ext:: tt:: macro_parser;
14- use feature_gate:: { self , emit_feature_err , Features , GateIssue } ;
14+ use feature_gate:: Features ;
1515use parse:: { token, ParseSess } ;
1616use print:: pprust;
1717use symbol:: keywords;
1818use syntax_pos:: { edition:: Edition , BytePos , Span } ;
1919use tokenstream:: { self , DelimSpan } ;
20- use { ast, attr } ;
20+ use ast;
2121
2222use rustc_data_structures:: sync:: Lrc ;
2323use std:: iter:: Peekable ;
@@ -566,32 +566,17 @@ fn parse_sep_and_kleene_op_2018<I>(
566566 input : & mut Peekable < I > ,
567567 span : Span ,
568568 sess : & ParseSess ,
569- features : & Features ,
570- attrs : & [ ast:: Attribute ] ,
569+ _features : & Features ,
570+ _attrs : & [ ast:: Attribute ] ,
571571) -> ( Option < token:: Token > , KleeneOp )
572572where
573573 I : Iterator < Item = tokenstream:: TokenTree > ,
574574{
575575 // We basically look at two token trees here, denoted as #1 and #2 below
576576 let span = match parse_kleene_op ( input, span) {
577577 // #1 is a `?` (needs feature gate)
578- Ok ( Ok ( ( op, op1_span) ) ) if op == KleeneOp :: ZeroOrOne => {
579- if !features. macro_at_most_once_rep
580- && !attr:: contains_name ( attrs, "allow_internal_unstable" )
581- {
582- let explain = feature_gate:: EXPLAIN_MACRO_AT_MOST_ONCE_REP ;
583- emit_feature_err (
584- sess,
585- "macro_at_most_once_rep" ,
586- op1_span,
587- GateIssue :: Language ,
588- explain,
589- ) ;
590-
591- op1_span
592- } else {
593- return ( None , op) ;
594- }
578+ Ok ( Ok ( ( op, _op1_span) ) ) if op == KleeneOp :: ZeroOrOne => {
579+ return ( None , op) ;
595580 }
596581
597582 // #1 is a `+` or `*` KleeneOp
@@ -600,24 +585,12 @@ where
600585 // #1 is a separator followed by #2, a KleeneOp
601586 Ok ( Err ( ( tok, span) ) ) => match parse_kleene_op ( input, span) {
602587 // #2 is the `?` Kleene op, which does not take a separator (error)
603- Ok ( Ok ( ( op, op2_span ) ) ) if op == KleeneOp :: ZeroOrOne => {
588+ Ok ( Ok ( ( op, _op2_span ) ) ) if op == KleeneOp :: ZeroOrOne => {
604589 // Error!
605-
606- if !features. macro_at_most_once_rep
607- && !attr:: contains_name ( attrs, "allow_internal_unstable" )
608- {
609- // FIXME: when `?` as a Kleene op is stabilized, we only need the "does not
610- // take a macro separator" error (i.e. the `else` case).
611- sess. span_diagnostic
612- . struct_span_err ( op2_span, "expected `*` or `+`" )
613- . note ( "`?` is not a macro repetition operator" )
614- . emit ( ) ;
615- } else {
616- sess. span_diagnostic . span_err (
617- span,
618- "the `?` macro repetition operator does not take a separator" ,
619- ) ;
620- }
590+ sess. span_diagnostic . span_err (
591+ span,
592+ "the `?` macro repetition operator does not take a separator" ,
593+ ) ;
621594
622595 // Return a dummy
623596 return ( None , KleeneOp :: ZeroOrMore ) ;
@@ -638,13 +611,8 @@ where
638611 } ;
639612
640613 // If we ever get to this point, we have experienced an "unexpected token" error
641-
642- if !features. macro_at_most_once_rep && !attr:: contains_name ( attrs, "allow_internal_unstable" ) {
643- sess. span_diagnostic . span_err ( span, "expected `*` or `+`" ) ;
644- } else {
645- sess. span_diagnostic
646- . span_err ( span, "expected one of: `*`, `+`, or `?`" ) ;
647- }
614+ sess. span_diagnostic
615+ . span_err ( span, "expected one of: `*`, `+`, or `?`" ) ;
648616
649617 // Return a dummy
650618 ( None , KleeneOp :: ZeroOrMore )
0 commit comments