Skip to content

Commit 81af147

Browse files
paaassscccaaalllJonasAlaif
authored andcommitted
made loop.rs compatible with #72
1 parent a325eb3 commit 81af147

File tree

1 file changed

+18
-26
lines changed
  • prusti-encoder/src/encoders/impure

1 file changed

+18
-26
lines changed

prusti-encoder/src/encoders/impure/loop.rs

Lines changed: 18 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -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

3737
pub(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

Comments
 (0)