@@ -11,8 +11,9 @@ use rustc_ast as ast;
1111use rustc_ast:: ptr:: P ;
1212use rustc_ast:: token:: { self , TokenKind } ;
1313use rustc_ast:: util:: classify;
14- use rustc_ast:: AstLike ;
15- use rustc_ast:: { AttrStyle , AttrVec , Attribute , MacCall , MacCallStmt , MacStmtStyle } ;
14+ use rustc_ast:: {
15+ AstLike , AttrStyle , AttrVec , Attribute , LocalKind , MacCall , MacCallStmt , MacStmtStyle ,
16+ } ;
1617use rustc_ast:: { Block , BlockCheckMode , Expr , ExprKind , Local , Stmt } ;
1718use rustc_ast:: { StmtKind , DUMMY_NODE_ID } ;
1819use rustc_errors:: { Applicability , PResult } ;
@@ -292,8 +293,19 @@ impl<'a> Parser<'a> {
292293 return Err ( err) ;
293294 }
294295 } ;
296+ let kind = match init {
297+ None => LocalKind :: Decl ,
298+ Some ( init) => {
299+ if self . eat_keyword ( kw:: Else ) {
300+ let els = self . parse_block ( ) ?;
301+ LocalKind :: InitElse ( init, els)
302+ } else {
303+ LocalKind :: Init ( init)
304+ }
305+ }
306+ } ;
295307 let hi = if self . token == token:: Semi { self . token . span } else { self . prev_token . span } ;
296- Ok ( P ( ast:: Local { ty, pat, init , id : DUMMY_NODE_ID , span : lo. to ( hi) , attrs, tokens : None } ) )
308+ Ok ( P ( ast:: Local { ty, pat, kind , id : DUMMY_NODE_ID , span : lo. to ( hi) , attrs, tokens : None } ) )
297309 }
298310
299311 /// Parses the RHS of a local variable declaration (e.g., `= 14;`).
@@ -495,13 +507,13 @@ impl<'a> Parser<'a> {
495507 StmtKind :: Expr ( _) | StmtKind :: MacCall ( _) => { }
496508 StmtKind :: Local ( ref mut local) if let Err ( e) = self . expect_semi ( ) => {
497509 // We might be at the `,` in `let x = foo<bar, baz>;`. Try to recover.
498- match & mut local. init {
499- Some ( ref mut expr) => {
500- self . check_mistyped_turbofish_with_multiple_type_params ( e, expr) ?;
501- // We found `foo<bar, baz>`, have we fully recovered?
502- self . expect_semi ( ) ?;
503- }
504- None => return Err ( e) ,
510+ match & mut local. kind {
511+ LocalKind :: Init ( expr ) | LocalKind :: InitElse ( expr, _ ) => {
512+ self . check_mistyped_turbofish_with_multiple_type_params ( e, expr) ?;
513+ // We found `foo<bar, baz>`, have we fully recovered?
514+ self . expect_semi ( ) ?;
515+ }
516+ LocalKind :: Decl => return Err ( e) ,
505517 }
506518 eat_semi = false ;
507519 }
0 commit comments