@@ -2630,93 +2630,9 @@ impl<'a> Parser<'a> {
26302630 return Err ( db) ;
26312631 } else if self . span . rust_2018 ( ) && self . eat_keyword ( keywords:: Await ) {
26322632 let await_sp = self . prev_span ;
2633- match self . token {
2634- token:: Not => {
2635- // FIXME: make this an error when `await!` is no longer supported
2636- // https://github.com/rust-lang/rust/issues/60610
2637- self . expect ( & token:: Not ) ?;
2638- self . expect ( & token:: OpenDelim ( token:: Paren ) ) ?;
2639- let expr = self . parse_expr ( ) . map_err ( |mut err| {
2640- err. span_label (
2641- await_sp,
2642- "while parsing this await macro call" ,
2643- ) ;
2644- err
2645- } ) ?;
2646- self . expect ( & token:: CloseDelim ( token:: Paren ) ) ?;
2647- ex = ExprKind :: Await ( ast:: AwaitOrigin :: MacroLike , expr) ;
2648- }
2649- token:: Question => {
2650- // Handle `await? <expr>`
2651- self . bump ( ) ; // `?`
2652- let expr = self . parse_expr ( ) . map_err ( |mut err| {
2653- err. span_label (
2654- await_sp,
2655- "while parsing this incorrect await statement" ,
2656- ) ;
2657- err
2658- } ) ?;
2659- let sp = lo. to ( expr. span ) ;
2660- let expr_str = self . sess . source_map ( ) . span_to_snippet ( expr. span )
2661- . unwrap_or_else ( |_| pprust:: expr_to_string ( & expr) ) ;
2662- let expr = self . mk_expr (
2663- sp,
2664- ExprKind :: Await ( ast:: AwaitOrigin :: FieldLike , expr) ,
2665- ThinVec :: new ( ) ,
2666- ) ;
2667- hi = sp;
2668- ex = ExprKind :: Try ( expr) ;
2669- let mut err = self . struct_span_err (
2670- await_sp,
2671- "incorrect use of `await`" ,
2672- ) ;
2673- err. span_suggestion (
2674- sp,
2675- "`await` is not a statement" ,
2676- format ! ( "{}.await?" , expr_str) ,
2677- Applicability :: MachineApplicable ,
2678- ) ;
2679- err. emit ( ) ;
2680- }
2681- ref t => {
2682- // Handle `await <expr>`
2683- let expr = if t == & token:: OpenDelim ( token:: Brace ) {
2684- // Handle `await { <expr> }`
2685- // this needs to be handled separatedly from the next arm to avoid
2686- // interpreting `await { <expr> }?` as `<expr>?.await`
2687- self . parse_block_expr (
2688- None ,
2689- self . span ,
2690- BlockCheckMode :: Default ,
2691- ThinVec :: new ( ) ,
2692- )
2693- } else {
2694- self . parse_expr ( )
2695- } . map_err ( |mut err| {
2696- err. span_label (
2697- await_sp,
2698- "while parsing this incorrect await statement" ,
2699- ) ;
2700- err
2701- } ) ?;
2702- let expr_str = self . sess . source_map ( ) . span_to_snippet ( expr. span )
2703- . unwrap_or_else ( |_| pprust:: expr_to_string ( & expr) ) ;
2704- let sp = lo. to ( expr. span ) ;
2705- hi = sp;
2706- ex = ExprKind :: Await ( ast:: AwaitOrigin :: FieldLike , expr) ;
2707- let mut err = self . struct_span_err (
2708- await_sp,
2709- "incorrect use of `await`" ,
2710- ) ;
2711- err. span_suggestion (
2712- sp,
2713- "`await` is not a statement" ,
2714- format ! ( "{}.await" , expr_str) ,
2715- Applicability :: MachineApplicable ,
2716- ) ;
2717- err. emit ( ) ;
2718- }
2719- }
2633+ let e = self . parse_async_macro_or_stmt ( lo, await_sp) ?;
2634+ hi = e. 0 ;
2635+ ex = e. 1 ;
27202636 } else if self . token . is_path_start ( ) {
27212637 let path = self . parse_path ( PathStyle :: Expr ) ?;
27222638
@@ -2781,6 +2697,99 @@ impl<'a> Parser<'a> {
27812697 self . maybe_recover_from_bad_qpath ( expr, true )
27822698 }
27832699
2700+ fn parse_async_macro_or_stmt (
2701+ & mut self ,
2702+ lo : Span ,
2703+ await_sp : Span ,
2704+ ) -> PResult < ' a , ( Span , ExprKind ) > {
2705+ Ok ( match self . token {
2706+ token:: Not => {
2707+ // Handle correct `await!(<expr>)`
2708+ // FIXME: make this an error when `await!` is no longer supported
2709+ // https://github.com/rust-lang/rust/issues/60610
2710+ self . expect ( & token:: Not ) ?;
2711+ self . expect ( & token:: OpenDelim ( token:: Paren ) ) ?;
2712+ let expr = self . parse_expr ( ) . map_err ( |mut err| {
2713+ err. span_label (
2714+ await_sp,
2715+ "while parsing this await macro call" ,
2716+ ) ;
2717+ err
2718+ } ) ?;
2719+ self . expect ( & token:: CloseDelim ( token:: Paren ) ) ?;
2720+ ( expr. span , ExprKind :: Await ( ast:: AwaitOrigin :: MacroLike , expr) )
2721+ }
2722+ token:: Question => {
2723+ // Handle `await? <expr>`
2724+ self . bump ( ) ; // `?`
2725+ let expr = self . parse_expr ( ) . map_err ( |mut err| {
2726+ err. span_label (
2727+ await_sp,
2728+ "while parsing this incorrect await statement" ,
2729+ ) ;
2730+ err
2731+ } ) ?;
2732+ let sp = lo. to ( expr. span ) ;
2733+ let expr_str = self . sess . source_map ( ) . span_to_snippet ( expr. span )
2734+ . unwrap_or_else ( |_| pprust:: expr_to_string ( & expr) ) ;
2735+ let expr = self . mk_expr (
2736+ sp,
2737+ ExprKind :: Await ( ast:: AwaitOrigin :: FieldLike , expr) ,
2738+ ThinVec :: new ( ) ,
2739+ ) ;
2740+ let mut err = self . struct_span_err (
2741+ await_sp,
2742+ "incorrect use of `await`" ,
2743+ ) ;
2744+ err. span_suggestion (
2745+ sp,
2746+ "`await` is not a statement" ,
2747+ format ! ( "{}.await?" , expr_str) ,
2748+ Applicability :: MachineApplicable ,
2749+ ) ;
2750+ err. emit ( ) ;
2751+ ( sp, ExprKind :: Try ( expr) )
2752+ }
2753+ ref t => {
2754+ // Handle `await <expr>`
2755+ let expr = if t == & token:: OpenDelim ( token:: Brace ) {
2756+ // Handle `await { <expr> }`
2757+ // this needs to be handled separatedly from the next arm to avoid
2758+ // interpreting `await { <expr> }?` as `<expr>?.await`
2759+ self . parse_block_expr (
2760+ None ,
2761+ self . span ,
2762+ BlockCheckMode :: Default ,
2763+ ThinVec :: new ( ) ,
2764+ )
2765+ } else {
2766+ self . parse_expr ( )
2767+ } . map_err ( |mut err| {
2768+ err. span_label (
2769+ await_sp,
2770+ "while parsing this incorrect await statement" ,
2771+ ) ;
2772+ err
2773+ } ) ?;
2774+ let expr_str = self . sess . source_map ( ) . span_to_snippet ( expr. span )
2775+ . unwrap_or_else ( |_| pprust:: expr_to_string ( & expr) ) ;
2776+ let sp = lo. to ( expr. span ) ;
2777+ let mut err = self . struct_span_err (
2778+ await_sp,
2779+ "incorrect use of `await`" ,
2780+ ) ;
2781+ err. span_suggestion (
2782+ sp,
2783+ "`await` is not a statement" ,
2784+ format ! ( "{}.await" , expr_str) ,
2785+ Applicability :: MachineApplicable ,
2786+ ) ;
2787+ err. emit ( ) ;
2788+ ( sp, ExprKind :: Await ( ast:: AwaitOrigin :: FieldLike , expr) )
2789+ }
2790+ } )
2791+ }
2792+
27842793 fn maybe_parse_struct_expr (
27852794 & mut self ,
27862795 lo : Span ,
0 commit comments