|
1 | 1 | use crate::{ImplTraitContext, ImplTraitPosition, LoweringContext};
|
2 |
| -use rustc_ast::{AttrVec, Block, BlockCheckMode, Expr, Local, LocalKind, Stmt, StmtKind}; |
| 2 | +use rustc_ast::{Block, BlockCheckMode, Local, LocalKind, Stmt, StmtKind}; |
3 | 3 | use rustc_hir as hir;
|
4 | 4 | use rustc_session::parse::feature_err;
|
5 |
| -use rustc_span::{sym, DesugaringKind}; |
| 5 | +use rustc_span::sym; |
6 | 6 |
|
7 | 7 | use smallvec::SmallVec;
|
8 | 8 |
|
@@ -36,21 +36,25 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
|
36 | 36 | match s.kind {
|
37 | 37 | StmtKind::Local(ref local) => {
|
38 | 38 | let hir_id = self.lower_node_id(s.id);
|
39 |
| - match &local.kind { |
40 |
| - LocalKind::InitElse(init, els) => { |
41 |
| - let e = self.lower_let_else(hir_id, local, init, els, tail); |
42 |
| - expr = Some(e); |
43 |
| - // remaining statements are in let-else expression |
44 |
| - break; |
| 39 | + let els = if let LocalKind::InitElse(_, els) = &local.kind { |
| 40 | + if !self.tcx.features().let_else { |
| 41 | + feature_err( |
| 42 | + &self.tcx.sess.parse_sess, |
| 43 | + sym::let_else, |
| 44 | + s.span, |
| 45 | + "`let...else` statements are unstable", |
| 46 | + ) |
| 47 | + .emit(); |
45 | 48 | }
|
46 |
| - _ => { |
47 |
| - let local = self.lower_local(local); |
48 |
| - self.alias_attrs(hir_id, local.hir_id); |
49 |
| - let kind = hir::StmtKind::Local(local); |
50 |
| - let span = self.lower_span(s.span); |
51 |
| - stmts.push(hir::Stmt { hir_id, kind, span }); |
52 |
| - } |
53 |
| - } |
| 49 | + Some(self.lower_block(els, false)) |
| 50 | + } else { |
| 51 | + None |
| 52 | + }; |
| 53 | + let local = self.lower_local(local); |
| 54 | + self.alias_attrs(hir_id, local.hir_id); |
| 55 | + let kind = hir::StmtKind::Local(local, els); |
| 56 | + let span = self.lower_span(s.span); |
| 57 | + stmts.push(hir::Stmt { hir_id, kind, span }); |
54 | 58 | }
|
55 | 59 | StmtKind::Item(ref it) => {
|
56 | 60 | stmts.extend(self.lower_item_ref(it).into_iter().enumerate().map(
|
@@ -115,59 +119,4 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
|
115 | 119 | }
|
116 | 120 | }
|
117 | 121 | }
|
118 |
| - |
119 |
| - fn lower_let_else( |
120 |
| - &mut self, |
121 |
| - stmt_hir_id: hir::HirId, |
122 |
| - local: &Local, |
123 |
| - init: &Expr, |
124 |
| - els: &Block, |
125 |
| - tail: &[Stmt], |
126 |
| - ) -> &'hir hir::Expr<'hir> { |
127 |
| - let ty = local |
128 |
| - .ty |
129 |
| - .as_ref() |
130 |
| - .map(|t| self.lower_ty(t, ImplTraitContext::Disallowed(ImplTraitPosition::Variable))); |
131 |
| - let span = self.lower_span(local.span); |
132 |
| - let span = self.mark_span_with_reason(DesugaringKind::LetElse, span, None); |
133 |
| - let init = self.lower_expr(init); |
134 |
| - let local_hir_id = self.lower_node_id(local.id); |
135 |
| - self.lower_attrs(local_hir_id, &local.attrs); |
136 |
| - let let_expr = { |
137 |
| - let lex = self.arena.alloc(hir::Let { |
138 |
| - hir_id: local_hir_id, |
139 |
| - pat: self.lower_pat(&local.pat), |
140 |
| - ty, |
141 |
| - init, |
142 |
| - span, |
143 |
| - }); |
144 |
| - self.arena.alloc(self.expr(span, hir::ExprKind::Let(lex), AttrVec::new())) |
145 |
| - }; |
146 |
| - let then_expr = { |
147 |
| - let (stmts, expr) = self.lower_stmts(tail); |
148 |
| - let block = self.block_all(span, stmts, expr); |
149 |
| - self.arena.alloc(self.expr_block(block, AttrVec::new())) |
150 |
| - }; |
151 |
| - let else_expr = { |
152 |
| - let block = self.lower_block(els, false); |
153 |
| - self.arena.alloc(self.expr_block(block, AttrVec::new())) |
154 |
| - }; |
155 |
| - self.alias_attrs(let_expr.hir_id, local_hir_id); |
156 |
| - self.alias_attrs(else_expr.hir_id, local_hir_id); |
157 |
| - let if_expr = self.arena.alloc(hir::Expr { |
158 |
| - hir_id: stmt_hir_id, |
159 |
| - span, |
160 |
| - kind: hir::ExprKind::If(let_expr, then_expr, Some(else_expr)), |
161 |
| - }); |
162 |
| - if !self.tcx.features().let_else { |
163 |
| - feature_err( |
164 |
| - &self.tcx.sess.parse_sess, |
165 |
| - sym::let_else, |
166 |
| - local.span, |
167 |
| - "`let...else` statements are unstable", |
168 |
| - ) |
169 |
| - .emit(); |
170 |
| - } |
171 |
| - if_expr |
172 |
| - } |
173 | 122 | }
|
0 commit comments