@@ -14,6 +14,17 @@ use rustc_span::Span;
14
14
use tracing:: debug;
15
15
16
16
macro_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
+ } } ;
17
28
( $visitor: expr, $has_feature: expr, $span: expr, $name: expr, $explain: expr) => { {
18
29
let ( visitor, has_feature, span, name, explain) =
19
30
( & * $visitor, $has_feature, $span, $name, $explain) ;
@@ -27,6 +38,9 @@ macro_rules! gate_feature_fn {
27
38
}
28
39
29
40
macro_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
+ } ;
30
44
( $visitor: expr, $feature: ident, $span: expr, $explain: expr) => {
31
45
gate_feature_fn!( $visitor, |x: & Features | x. $feature, $span, sym:: $feature, $explain)
32
46
} ;
@@ -597,6 +611,13 @@ pub fn check_crate(krate: &ast::Crate, sess: &Session) {
597
611
598
612
let spans = sess. parse_sess . gated_spans . spans . borrow ( ) ;
599
613
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
+ } ;
600
621
( $gate: ident, $msg: literal) => {
601
622
if let Some ( spans) = spans. get( & sym:: $gate) {
602
623
for span in spans {
@@ -607,7 +628,11 @@ pub fn check_crate(krate: &ast::Crate, sess: &Session) {
607
628
}
608
629
gate_all ! ( if_let_guard, "`if let` guards are experimental" ) ;
609
630
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
+ ) ;
611
636
gate_all ! ( generators, "yield syntax is experimental" ) ;
612
637
gate_all ! ( or_patterns, "or-patterns syntax is experimental" ) ;
613
638
gate_all ! ( raw_ref_op, "raw address of syntax is experimental" ) ;
0 commit comments