@@ -749,12 +749,28 @@ pub fn lower_expr(lctx: &LoweringContext, e: &Expr) -> P<hir::Expr> {
749749 P ( hir:: Expr {
750750 id : e. id ,
751751 node : match e. node {
752+ // Issue #22181:
753+ // Eventually a desugaring for `box EXPR`
754+ // (similar to the desugaring above for `in PLACE BLOCK`)
755+ // should go here, desugaring
756+ //
757+ // to:
758+ //
759+ // let mut place = BoxPlace::make_place();
760+ // let raw_place = Place::pointer(&mut place);
761+ // let value = $value;
762+ // unsafe {
763+ // ::std::ptr::write(raw_place, value);
764+ // Boxed::finalize(place)
765+ // }
766+ //
767+ // But for now there are type-inference issues doing that.
752768 ExprBox ( ref e) => {
753769 hir:: ExprBox ( lower_expr ( lctx, e) )
754770 }
755771
756772 // Desugar ExprBox: `in (PLACE) EXPR`
757- ExprInPlace ( Some ( ref placer) , ref value_expr) => {
773+ ExprInPlace ( ref placer, ref value_expr) => {
758774 // to:
759775 //
760776 // let p = PLACE;
@@ -810,23 +826,43 @@ pub fn lower_expr(lctx: &LoweringContext, e: &Expr) -> P<hir::Expr> {
810826 } ;
811827
812828 // pop_unsafe!(EXPR));
813- let pop_unsafe_expr = pop_unsafe_expr ( lctx, value_expr, e. span ) ;
829+ let pop_unsafe_expr =
830+ signal_block_expr ( lctx,
831+ vec ! [ ] ,
832+ signal_block_expr ( lctx,
833+ vec ! [ ] ,
834+ value_expr,
835+ e. span ,
836+ hir:: PopUnstableBlock ) ,
837+ e. span ,
838+ hir:: PopUnsafeBlock ( hir:: CompilerGenerated ) ) ;
814839
815840 // push_unsafe!({
816- // ptr::write(p_ptr , pop_unsafe!(<value_expr> ));
841+ // std::intrinsics::move_val_init(raw_place , pop_unsafe!( EXPR ));
817842 // InPlace::finalize(place)
818843 // })
819844 let expr = {
820- let call_move_val_init = hir:: StmtSemi ( make_call (
821- lctx, & move_val_init, vec ! [ expr_ident( lctx, e. span, p_ptr_ident) , pop_unsafe_expr] ) , lctx. next_id ( ) ) ;
845+ let call_move_val_init =
846+ hir:: StmtSemi ( make_call ( lctx,
847+ & move_val_init,
848+ vec ! [ expr_ident( lctx, e. span, p_ptr_ident) ,
849+ pop_unsafe_expr] ) ,
850+ lctx. next_id ( ) ) ;
822851 let call_move_val_init = respan ( e. span , call_move_val_init) ;
823852
824853 let call = make_call ( lctx, & inplace_finalize, vec ! [ expr_ident( lctx, e. span, agent_ident) ] ) ;
825- Some ( push_unsafe_expr ( lctx, vec ! [ P ( call_move_val_init) ] , call, e. span ) )
854+ signal_block_expr ( lctx,
855+ vec ! [ P ( call_move_val_init) ] ,
856+ call,
857+ e. span ,
858+ hir:: PushUnsafeBlock ( hir:: CompilerGenerated ) )
826859 } ;
827860
828- let block = block_all ( lctx, e. span , vec ! [ s1, s2, s3] , expr) ;
829- return expr_block ( lctx, block) ;
861+ return signal_block_expr ( lctx,
862+ vec ! [ s1, s2, s3] ,
863+ expr,
864+ e. span ,
865+ hir:: PushUnstableBlock ) ;
830866 }
831867
832868 ExprVec ( ref exprs) => {
@@ -1475,21 +1511,9 @@ fn core_path(lctx: &LoweringContext, span: Span, components: &[&str]) -> hir::Pa
14751511 path_global ( span, idents)
14761512}
14771513
1478- fn push_unsafe_expr ( lctx : & LoweringContext , stmts : Vec < P < hir:: Stmt > > ,
1479- expr : P < hir:: Expr > , span : Span )
1480- -> P < hir:: Expr > {
1481- let rules = hir:: PushUnsafeBlock ( hir:: CompilerGenerated ) ;
1514+ fn signal_block_expr ( lctx : & LoweringContext , stmts : Vec < P < hir:: Stmt > > , expr : P < hir:: Expr > , span : Span , rule : hir:: BlockCheckMode ) -> P < hir:: Expr > {
14821515 expr_block ( lctx, P ( hir:: Block {
1483- rules : rules , span : span, id : lctx. next_id ( ) ,
1516+ rules : rule , span : span, id : lctx. next_id ( ) ,
14841517 stmts : stmts, expr : Some ( expr) ,
14851518 } ) )
14861519}
1487-
1488- fn pop_unsafe_expr ( lctx : & LoweringContext , expr : P < hir:: Expr > , span : Span )
1489- -> P < hir:: Expr > {
1490- let rules = hir:: PopUnsafeBlock ( hir:: CompilerGenerated ) ;
1491- expr_block ( lctx, P ( hir:: Block {
1492- rules : rules, span : span, id : lctx. next_id ( ) ,
1493- stmts : vec ! [ ] , expr : Some ( expr) ,
1494- } ) )
1495- }
0 commit comments