reorder nesting scopes and declare bindings without drop schedule · rust-lang/rust@1b87ce0 (original) (raw)
`@@ -109,13 +109,99 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
`
109
109
`)
`
110
110
`);
`
111
111
`}
`
``
112
`+
StmtKind::Let {
`
``
113
`+
remainder_scope,
`
``
114
`+
init_scope,
`
``
115
`+
pattern,
`
``
116
`+
initializer: Some(initializer),
`
``
117
`+
lint_level,
`
``
118
`+
else_block: Some(else_block),
`
``
119
`+
} => {
`
``
120
`+
let ignores_expr_result = matches!(pattern.kind, PatKind::Wild);
`
``
121
`+
this.block_context.push(BlockFrame::Statement { ignores_expr_result });
`
``
122
`+
// This place is not really used because this destination place
`
``
123
`+
// should never be used to take values at the end of the failure
`
``
124
`+
// block.
`
``
125
`+
let else_block_span = this.thir[*else_block].span;
`
``
126
`+
let dummy_place = this.temp(this.tcx.types.never, else_block_span);
`
``
127
`+
let failure_entry = this.cfg.start_new_block();
`
``
128
`+
let failure_block;
`
``
129
`+
unpack!(
`
``
130
`+
failure_block = this.ast_block(
`
``
131
`+
dummy_place,
`
``
132
`+
failure_entry,
`
``
133
`+
*else_block,
`
``
134
`+
this.source_info(else_block_span),
`
``
135
`+
)
`
``
136
`+
);
`
``
137
`+
this.cfg.terminate(
`
``
138
`+
failure_block,
`
``
139
`+
this.source_info(else_block_span),
`
``
140
`+
TerminatorKind::Unreachable,
`
``
141
`+
);
`
``
142
+
``
143
`+
// Declare the bindings, which may create a source scope.
`
``
144
`+
let remainder_span = remainder_scope.span(this.tcx, this.region_scope_tree);
`
``
145
`+
this.push_scope((*remainder_scope, source_info));
`
``
146
`+
let_scope_stack.push(remainder_scope);
`
``
147
+
``
148
`+
let visibility_scope =
`
``
149
`+
Some(this.new_source_scope(remainder_span, LintLevel::Inherited, None));
`
``
150
+
``
151
`+
let init = &this.thir[*initializer];
`
``
152
`+
let initializer_span = init.span;
`
``
153
`+
this.declare_bindings(
`
``
154
`+
visibility_scope,
`
``
155
`+
remainder_span,
`
``
156
`+
pattern,
`
``
157
`+
ArmHasGuard(false),
`
``
158
`+
Some((None, initializer_span)),
`
``
159
`+
);
`
``
160
`+
this.visit_primary_bindings(
`
``
161
`+
pattern,
`
``
162
`+
UserTypeProjections::none(),
`
``
163
`+
&mut |this, _, _, _, node, span, _, _| {
`
``
164
`+
this.storage_live_binding(block, node, span, OutsideGuard, false);
`
``
165
`+
},
`
``
166
`+
);
`
``
167
`+
let failure = unpack!(
`
``
168
`+
block = this.in_opt_scope(
`
``
169
`+
opt_destruction_scope.map(|de| (de, source_info)),
`
``
170
`+
|this| {
`
``
171
`+
let scope = (*init_scope, source_info);
`
``
172
`+
this.in_scope(scope, *lint_level, |this| {
`
``
173
`+
this.ast_let_else(
`
``
174
`+
block,
`
``
175
`+
init,
`
``
176
`+
initializer_span,
`
``
177
`+
*else_block,
`
``
178
`+
&last_remainder_scope,
`
``
179
`+
pattern,
`
``
180
`+
)
`
``
181
`+
})
`
``
182
`+
}
`
``
183
`+
)
`
``
184
`+
);
`
``
185
`+
this.cfg.goto(failure, source_info, failure_entry);
`
``
186
+
``
187
`+
if let Some(source_scope) = visibility_scope {
`
``
188
`+
this.source_scope = source_scope;
`
``
189
`+
}
`
``
190
`+
last_remainder_scope = *remainder_scope;
`
``
191
`+
}
`
``
192
`+
StmtKind::Let { init_scope, initializer: None, else_block: Some(_), .. } => {
`
``
193
`+
span_bug!(
`
``
194
`+
init_scope.span(this.tcx, this.region_scope_tree),
`
``
195
`+
"initializer is missing, but else block is present in this let binding",
`
``
196
`+
)
`
``
197
`+
}
`
112
198
`StmtKind::Let {
`
113
199
` remainder_scope,
`
114
200
` init_scope,
`
115
201
`ref pattern,
`
116
202
` initializer,
`
117
203
` lint_level,
`
118
``
`-
else_block,
`
``
204
`+
else_block: None,
`
119
205
`} => {
`
120
206
`let ignores_expr_result = matches!(pattern.kind, PatKind::Wild);
`
121
207
` this.block_context.push(BlockFrame::Statement { ignores_expr_result });
`
`@@ -141,27 +227,14 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
`
141
227
` |this| {
`
142
228
`let scope = (*init_scope, source_info);
`
143
229
` this.in_scope(scope, *lint_level, |this| {
`
144
``
`-
if let Some(else_block) = else_block {
`
145
``
`-
this.ast_let_else(
`
146
``
`-
block,
`
147
``
`-
init,
`
148
``
`-
initializer_span,
`
149
``
`-
*else_block,
`
150
``
`-
visibility_scope,
`
151
``
`-
last_remainder_scope,
`
152
``
`-
remainder_span,
`
153
``
`-
pattern,
`
154
``
`-
)
`
155
``
`-
} else {
`
156
``
`-
this.declare_bindings(
`
157
``
`-
visibility_scope,
`
158
``
`-
remainder_span,
`
159
``
`-
pattern,
`
160
``
`-
ArmHasGuard(false),
`
161
``
`-
Some((None, initializer_span)),
`
162
``
`-
);
`
163
``
`-
this.expr_into_pattern(block, pattern, init) // irrefutable pattern
`
164
``
`-
}
`
``
230
`+
this.declare_bindings(
`
``
231
`+
visibility_scope,
`
``
232
`+
remainder_span,
`
``
233
`+
pattern,
`
``
234
`+
ArmHasGuard(false),
`
``
235
`+
Some((None, initializer_span)),
`
``
236
`+
);
`
``
237
`+
this.expr_into_pattern(block, &pattern, init) // irrefutable pattern
`
165
238
`})
`
166
239
`},
`
167
240
`)
`