@@ -31,8 +31,8 @@ use crate::{
3131 CastTypePure ,
3232} ;
3333
34- type ExprInput < ' vir > = ( DefId , & ' vir [ vir:: Expr < ' vir > ] ) ;
35- type ExprRet < ' vir > = vir:: ExprGen < ' vir , ExprInput < ' vir > , vir:: ExprKind < ' vir > > ;
34+ type ExprInput < ' vir > = ( DefId , & ' vir [ vir:: ExprSnap < ' vir > ] ) ;
35+ type ExprRet < ' vir > = vir:: ExprGenBool < ' vir , ExprInput < ' vir > , vir:: ExprKind < ' vir > > ;
3636
3737pub ( super ) enum WandOldOuter < ' vir > {
3838 LetBind ( Vec < ( & ' vir str , vir:: ExprSnap < ' vir > ) > ) ,
@@ -300,7 +300,7 @@ impl<'vir, 'enc, E: TaskEncoder> ImpureEncVisitor<'vir, 'enc, E> {
300300
301301 fn build_loop_invariants_map (
302302 & mut self ,
303- ) -> std:: collections:: HashMap < LoopId , Vec < vir:: Expr < ' vir > > > {
303+ ) -> std:: collections:: HashMap < LoopId , Vec < vir:: ExprBool < ' vir > > > {
304304 let mut loop_invariants_map = std:: collections:: HashMap :: new ( ) ;
305305
306306 for ( block_idx, block_data) in self . body . basic_blocks . iter_enumerated ( ) {
@@ -329,11 +329,7 @@ impl<'vir, 'enc, E: TaskEncoder> ImpureEncVisitor<'vir, 'enc, E> {
329329 * cl_args,
330330 & upvar_operands. raw ,
331331 ) ;
332- let concrete_expr = unsafe {
333- std:: mem:: transmute :: < ExprRet < ' _ > , vir:: ExprGen < ' _ , !, !> > (
334- invariant_expr,
335- )
336- } ;
332+ let concrete_expr = invariant_expr;
337333
338334 loop_invariants_map
339335 . entry ( innermost_loop_id)
@@ -354,7 +350,7 @@ impl<'vir, 'enc, E: TaskEncoder> ImpureEncVisitor<'vir, 'enc, E> {
354350 cl_def_id : DefId ,
355351 _cl_args : ty:: GenericArgsRef < ' vir > ,
356352 upvar_operands : & [ mir:: Operand < ' vir > ] ,
357- ) -> ExprRet < ' vir > {
353+ ) -> vir :: ExprBool < ' vir > {
358354 let tcx = self . vcx . tcx ( ) ;
359355 let closure_ty = tcx. type_of ( cl_def_id) . instantiate_identity ( ) ;
360356
@@ -436,14 +432,12 @@ impl<'vir, 'enc, E: TaskEncoder> ImpureEncVisitor<'vir, 'enc, E> {
436432 . deps
437433 . require_local :: < RustTySnapshotsEnc > ( upvar_ref_rust_ty)
438434 . unwrap ( ) ;
439- let field_s_ref_immutable_expr = s_ref_imm_enc_for_field
435+ let field_s_ref_immutable_expr = ( s_ref_imm_enc_for_field
440436 . generic_snapshot
441437 . specifics
442438 . expect_immref ( )
443- . prim_to_snap
444- . apply (
445- self . vcx ,
446- [ original_place_viper_ref, param_for_snap_original] ,
439+ . prim_to_snap ) (
440+ original_place_viper_ref, param_for_snap_original
447441 ) ;
448442
449443 fields_for_closure_struct. push ( field_s_ref_immutable_expr) ;
@@ -454,20 +448,19 @@ impl<'vir, 'enc, E: TaskEncoder> ImpureEncVisitor<'vir, 'enc, E> {
454448 . require_local :: < RustTySnapshotsEnc > ( closure_ty)
455449 . unwrap ( ) ;
456450 let closure_struct_val_expr = vir:: with_vcx ( |vcx| {
457- closure_struct_snapshots_enc
451+ ( closure_struct_snapshots_enc
458452 . generic_snapshot
459453 . specifics
460454 . expect_structlike ( )
461- . field_snaps_to_snap
462- . apply ( vcx, vcx. alloc_slice ( & fields_for_closure_struct) )
455+ . field_snaps_to_snap ) ( vcx. alloc_slice ( & fields_for_closure_struct. iter ( ) . map ( |f| f. upcast_ty ( ) ) . collect :: < Vec < _ > > ( ) ) )
463456 } ) ;
464457
465458 let closure_caster = self
466459 . deps
467460 . require_local :: < RustTyCastersEnc < CastTypePure > > ( closure_ty)
468461 . unwrap ( ) ;
469462 let closure_struct_as_param_expr =
470- closure_caster. cast_to_generic_if_necessary ( self . vcx , closure_struct_val_expr) ;
463+ closure_caster. cast_to_generic_if_necessary ( self . vcx , closure_struct_val_expr. upcast_ty ( ) ) ;
471464 let outer_ref_to_closure_rust_ty = tcx. mk_ty_from_kind ( ty:: TyKind :: Ref (
472465 tcx. lifetimes . re_erased ,
473466 closure_ty,
@@ -478,14 +471,14 @@ impl<'vir, 'enc, E: TaskEncoder> ImpureEncVisitor<'vir, 'enc, E> {
478471 . require_local :: < RustTySnapshotsEnc > ( outer_ref_to_closure_rust_ty)
479472 . unwrap ( ) ;
480473
481- let final_reify_arg0 = outer_s_ref_imm_enc
474+ let final_reify_arg0 = ( outer_s_ref_imm_enc
482475 . generic_snapshot
483476 . specifics
484477 . expect_immref ( )
485- . prim_to_snap
486- . apply ( self . vcx , [ self . vcx . mk_null ( ) , closure_struct_as_param_expr] ) ;
478+ . prim_to_snap ) ( self . vcx . mk_null ( ) , closure_struct_as_param_expr) ;
487479
488- let mut reify_args = vec ! [ final_reify_arg0] ;
480+ let final_reify_arg0_generic = final_reify_arg0. upcast_ty ( ) ;
481+ let mut reify_args = vec ! [ final_reify_arg0_generic] ;
489482 reify_args. extend (
490483 qvars
491484 . iter ( )
@@ -507,7 +500,7 @@ impl<'vir, 'enc, E: TaskEncoder> ImpureEncVisitor<'vir, 'enc, E> {
507500
508501 let reified_body = body
509502 . reify ( self . vcx , ( cl_def_id, self . vcx . alloc_slice ( & reify_args) ) )
510- . lift ( ) ;
503+ . downcast_ty ( ) ;
511504
512505 let bool_snapshots_enc = self
513506 . deps
@@ -521,9 +514,8 @@ impl<'vir, 'enc, E: TaskEncoder> ImpureEncVisitor<'vir, 'enc, E> {
521514 self . vcx . mk_forall_expr (
522515 qvars,
523516 & [ ] ,
524- bool_primitive_enc
525- . snap_to_prim
526- . apply ( self . vcx , [ reified_body] ) ,
517+ ( bool_primitive_enc
518+ . snap_to_prim ) ( reified_body) . downcast_ty ( ) ,
527519 )
528520 }
529521}
0 commit comments