11//! See docs in build/expr/mod.rs
22
33use crate :: build:: expr:: category:: { Category , RvalueFunc } ;
4- use crate :: build:: scope:: DropKind ;
54use crate :: build:: { BlockAnd , BlockAndExtension , BlockFrame , Builder } ;
65use crate :: thir:: * ;
76use rustc_ast:: InlineAsmOptions ;
87use rustc_data_structures:: fx:: FxHashMap ;
98use rustc_data_structures:: stack:: ensure_sufficient_stack;
109use rustc_hir as hir;
11- use rustc_middle:: middle:: region;
1210use rustc_middle:: mir:: * ;
1311use rustc_middle:: ty:: CanonicalUserTypeAnnotation ;
1412
15- use std:: slice;
16-
1713impl < ' a , ' tcx > Builder < ' a , ' tcx > {
1814 /// Compile `expr`, storing the result into `destination`, which
1915 /// is assumed to be uninitialized.
20- /// If a `drop_scope` is provided, `destination` is scheduled to be dropped
21- /// in `scope` once it has been initialized.
2216 crate fn into_expr (
2317 & mut self ,
2418 destination : Place < ' tcx > ,
25- scope : Option < region:: Scope > ,
2619 mut block : BasicBlock ,
2720 expr : Expr < ' tcx > ,
2821 ) -> BlockAnd < ( ) > {
29- debug ! (
30- "into_expr(destination={:?}, scope={:?}, block={:?}, expr={:?})" ,
31- destination, scope, block, expr
32- ) ;
22+ debug ! ( "into_expr(destination={:?}, block={:?}, expr={:?})" , destination, block, expr) ;
3323
3424 // since we frequently have to reference `self` from within a
3525 // closure, where `self` would be shadowed, it's easier to
@@ -41,14 +31,6 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
4131 let expr_is_block_or_scope =
4232 matches ! ( expr. kind, ExprKind :: Block { .. } | ExprKind :: Scope { .. } ) ;
4333
44- let schedule_drop = move |this : & mut Self | {
45- if let Some ( drop_scope) = scope {
46- let local =
47- destination. as_local ( ) . expect ( "cannot schedule drop of non-Local place" ) ;
48- this. schedule_drop ( expr_span, drop_scope, local, DropKind :: Value ) ;
49- }
50- } ;
51-
5234 if !expr_is_block_or_scope {
5335 this. block_context . push ( BlockFrame :: SubExpr ) ;
5436 }
@@ -58,15 +40,15 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
5840 let region_scope = ( region_scope, source_info) ;
5941 ensure_sufficient_stack ( || {
6042 this. in_scope ( region_scope, lint_level, |this| {
61- this. into ( destination, scope , block, value)
43+ this. into ( destination, block, value)
6244 } )
6345 } )
6446 }
6547 ExprKind :: Block { body : ast_block } => {
66- this. ast_block ( destination, scope , block, ast_block, source_info)
48+ this. ast_block ( destination, block, ast_block, source_info)
6749 }
6850 ExprKind :: Match { scrutinee, arms } => {
69- this. match_expr ( destination, scope , expr_span, block, scrutinee, arms)
51+ this. match_expr ( destination, expr_span, block, scrutinee, arms)
7052 }
7153 ExprKind :: If { cond, then, else_opt } => {
7254 let place = unpack ! (
@@ -79,9 +61,9 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
7961 let term = TerminatorKind :: if_ ( this. hir . tcx ( ) , operand, then_block, else_block) ;
8062 this. cfg . terminate ( block, source_info, term) ;
8163
82- unpack ! ( then_block = this. into( destination, scope , then_block, then) ) ;
64+ unpack ! ( then_block = this. into( destination, then_block, then) ) ;
8365 else_block = if let Some ( else_opt) = else_opt {
84- unpack ! ( this. into( destination, None , else_block, else_opt) )
66+ unpack ! ( this. into( destination, else_block, else_opt) )
8567 } else {
8668 // Body of the `if` expression without an `else` clause must return `()`, thus
8769 // we implicitly generate a `else {}` if it is not specified.
@@ -117,7 +99,6 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
11799
118100 // This is an optimization. If the expression was a call then we already have an
119101 // unreachable block. Don't bother to terminate it and create a new one.
120- schedule_drop ( this) ;
121102 if is_call {
122103 block. unit ( )
123104 } else {
@@ -193,35 +174,26 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
193174 // Start the loop.
194175 this. cfg . goto ( block, source_info, loop_block) ;
195176
196- this. in_breakable_scope (
197- Some ( loop_block) ,
198- destination,
199- scope,
200- expr_span,
201- move |this| {
202- // conduct the test, if necessary
203- let body_block = this. cfg . start_new_block ( ) ;
204- this. cfg . terminate (
205- loop_block,
206- source_info,
207- TerminatorKind :: FalseUnwind { real_target : body_block, unwind : None } ,
208- ) ;
209- this. diverge_from ( loop_block) ;
210-
211- // The “return” value of the loop body must always be an unit. We therefore
212- // introduce a unit temporary as the destination for the loop body.
213- let tmp = this. get_unit_temp ( ) ;
214- // Execute the body, branching back to the test.
215- // We don't need to provide a drop scope because `tmp`
216- // has type `()`.
217- let body_block_end = unpack ! ( this. into( tmp, None , body_block, body) ) ;
218- this. cfg . goto ( body_block_end, source_info, loop_block) ;
219- schedule_drop ( this) ;
220-
221- // Loops are only exited by `break` expressions.
222- None
223- } ,
224- )
177+ this. in_breakable_scope ( Some ( loop_block) , destination, expr_span, move |this| {
178+ // conduct the test, if necessary
179+ let body_block = this. cfg . start_new_block ( ) ;
180+ this. cfg . terminate (
181+ loop_block,
182+ source_info,
183+ TerminatorKind :: FalseUnwind { real_target : body_block, unwind : None } ,
184+ ) ;
185+ this. diverge_from ( loop_block) ;
186+
187+ // The “return” value of the loop body must always be an unit. We therefore
188+ // introduce a unit temporary as the destination for the loop body.
189+ let tmp = this. get_unit_temp ( ) ;
190+ // Execute the body, branching back to the test.
191+ let body_block_end = unpack ! ( this. into( tmp, body_block, body) ) ;
192+ this. cfg . goto ( body_block_end, source_info, loop_block) ;
193+
194+ // Loops are only exited by `break` expressions.
195+ None
196+ } )
225197 }
226198 ExprKind :: Call { ty : _, fun, args, from_hir_call, fn_span } => {
227199 let fun = unpack ! ( block = this. as_local_operand( block, fun) ) ;
@@ -256,10 +228,9 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
256228 } ,
257229 ) ;
258230 this. diverge_from ( block) ;
259- schedule_drop ( this) ;
260231 success. unit ( )
261232 }
262- ExprKind :: Use { source } => this. into ( destination, scope , block, source) ,
233+ ExprKind :: Use { source } => this. into ( destination, block, source) ,
263234 ExprKind :: Borrow { arg, borrow_kind } => {
264235 // We don't do this in `as_rvalue` because we use `as_place`
265236 // for borrow expressions, so we cannot create an `RValue` that
@@ -341,14 +312,12 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
341312 user_ty,
342313 active_field_index,
343314 ) ;
344- this. record_operands_moved ( & fields) ;
345315 this. cfg . push_assign (
346316 block,
347317 source_info,
348318 destination,
349319 Rvalue :: Aggregate ( adt, fields) ,
350320 ) ;
351- schedule_drop ( this) ;
352321 block. unit ( )
353322 }
354323 ExprKind :: InlineAsm { template, operands, options, line_spans } => {
@@ -445,7 +414,6 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
445414 let place = unpack ! ( block = this. as_place( block, expr) ) ;
446415 let rvalue = Rvalue :: Use ( this. consume_by_copy_or_move ( place) ) ;
447416 this. cfg . push_assign ( block, source_info, destination, rvalue) ;
448- schedule_drop ( this) ;
449417 block. unit ( )
450418 }
451419 ExprKind :: Index { .. } | ExprKind :: Deref { .. } | ExprKind :: Field { .. } => {
@@ -463,22 +431,19 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
463431 let place = unpack ! ( block = this. as_place( block, expr) ) ;
464432 let rvalue = Rvalue :: Use ( this. consume_by_copy_or_move ( place) ) ;
465433 this. cfg . push_assign ( block, source_info, destination, rvalue) ;
466- schedule_drop ( this) ;
467434 block. unit ( )
468435 }
469436
470437 ExprKind :: Yield { value } => {
471438 let scope = this. local_scope ( ) ;
472439 let value = unpack ! ( block = this. as_operand( block, Some ( scope) , value) ) ;
473440 let resume = this. cfg . start_new_block ( ) ;
474- this. record_operands_moved ( slice:: from_ref ( & value) ) ;
475441 this. cfg . terminate (
476442 block,
477443 source_info,
478444 TerminatorKind :: Yield { value, resume, resume_arg : destination, drop : None } ,
479445 ) ;
480446 this. generator_drop_cleanup ( block) ;
481- schedule_drop ( this) ;
482447 resume. unit ( )
483448 }
484449
@@ -510,7 +475,6 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
510475
511476 let rvalue = unpack ! ( block = this. as_local_rvalue( block, expr) ) ;
512477 this. cfg . push_assign ( block, source_info, destination, rvalue) ;
513- schedule_drop ( this) ;
514478 block. unit ( )
515479 }
516480 } ;
0 commit comments