@@ -14,6 +14,17 @@ use rustc_span::Span;
1414use tracing:: debug;
1515
1616macro_rules! gate_feature_fn {
17+ ( $visitor: expr, $has_feature: expr, $span: expr, $name: expr, $explain: expr, $help: expr) => { {
18+ let ( visitor, has_feature, span, name, explain, help) =
19+ ( & * $visitor, $has_feature, $span, $name, $explain, $help) ;
20+ let has_feature: bool = has_feature( visitor. features) ;
21+ debug!( "gate_feature(feature = {:?}, span = {:?}); has? {}" , name, span, has_feature) ;
22+ if !has_feature && !span. allows_unstable( $name) {
23+ feature_err_issue( & visitor. sess. parse_sess, name, span, GateIssue :: Language , explain)
24+ . help( help)
25+ . emit( ) ;
26+ }
27+ } } ;
1728 ( $visitor: expr, $has_feature: expr, $span: expr, $name: expr, $explain: expr) => { {
1829 let ( visitor, has_feature, span, name, explain) =
1930 ( & * $visitor, $has_feature, $span, $name, $explain) ;
@@ -27,6 +38,9 @@ macro_rules! gate_feature_fn {
2738}
2839
2940macro_rules! gate_feature_post {
41+ ( $visitor: expr, $feature: ident, $span: expr, $explain: expr, $help: expr) => {
42+ gate_feature_fn!( $visitor, |x: & Features | x. $feature, $span, sym:: $feature, $explain, $help)
43+ } ;
3044 ( $visitor: expr, $feature: ident, $span: expr, $explain: expr) => {
3145 gate_feature_fn!( $visitor, |x: & Features | x. $feature, $span, sym:: $feature, $explain)
3246 } ;
@@ -597,6 +611,13 @@ pub fn check_crate(krate: &ast::Crate, sess: &Session) {
597611
598612 let spans = sess. parse_sess . gated_spans . spans . borrow ( ) ;
599613 macro_rules! gate_all {
614+ ( $gate: ident, $msg: literal, $help: literal) => {
615+ if let Some ( spans) = spans. get( & sym:: $gate) {
616+ for span in spans {
617+ gate_feature_post!( & visitor, $gate, * span, $msg, $help) ;
618+ }
619+ }
620+ } ;
600621 ( $gate: ident, $msg: literal) => {
601622 if let Some ( spans) = spans. get( & sym:: $gate) {
602623 for span in spans {
@@ -607,7 +628,11 @@ pub fn check_crate(krate: &ast::Crate, sess: &Session) {
607628 }
608629 gate_all ! ( if_let_guard, "`if let` guards are experimental" ) ;
609630 gate_all ! ( let_chains, "`let` expressions in this position are experimental" ) ;
610- gate_all ! ( async_closure, "async closures are unstable" ) ;
631+ gate_all ! (
632+ async_closure,
633+ "async closures are unstable" ,
634+ "to use an async block, remove the `||`: `async {`"
635+ ) ;
611636 gate_all ! ( generators, "yield syntax is experimental" ) ;
612637 gate_all ! ( or_patterns, "or-patterns syntax is experimental" ) ;
613638 gate_all ! ( raw_ref_op, "raw address of syntax is experimental" ) ;
0 commit comments