Skip to content

Commit 10033f4

Browse files
committed
analyze: rewrite::convert: apply LoadFromTempForAdjustment before adjust, not after
1 parent aba93d1 commit 10033f4

File tree

1 file changed

+27
-15
lines changed

1 file changed

+27
-15
lines changed

c2rust-analyze/src/rewrite/expr/convert.rs

Lines changed: 27 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -440,15 +440,21 @@ impl<'tcx> Visitor<'tcx> for ConvertVisitor<'tcx> {
440440
.any(|x| matches!(x.desc, MirOriginDesc::Adjustment(_)));
441441
if self.materialize_adjustments || has_adjustment_rewrites {
442442
let adjusts = self.typeck_results.expr_adjustments(ex);
443-
hir_rw = materialize_adjustments(self.tcx, adjusts, hir_rw, |i, mut hir_rw| {
444-
let load_rws = take_prefix_while(&mut mir_rws, |x| {
445-
x.desc == MirOriginDesc::LoadFromTempForAdjustment(i)
443+
hir_rw =
444+
materialize_adjustments(self.tcx, adjusts, hir_rw, |step, hir_rw| match step {
445+
AdjustmentStep::Before(i) => {
446+
let load_rws = take_prefix_while(&mut mir_rws, |x| {
447+
x.desc == MirOriginDesc::LoadFromTempForAdjustment(i)
448+
});
449+
self.rewrite_from_mir_rws(Some(ex), load_rws, hir_rw)
450+
}
451+
AdjustmentStep::After(i) => {
452+
let adj_rws = take_prefix_while(&mut mir_rws, |x| {
453+
x.desc == MirOriginDesc::Adjustment(i)
454+
});
455+
self.rewrite_from_mir_rws(Some(ex), adj_rws, hir_rw)
456+
}
446457
});
447-
hir_rw = self.rewrite_from_mir_rws(Some(ex), load_rws, hir_rw);
448-
let adj_rws =
449-
take_prefix_while(&mut mir_rws, |x| x.desc == MirOriginDesc::Adjustment(i));
450-
self.rewrite_from_mir_rws(Some(ex), adj_rws, hir_rw)
451-
});
452458
}
453459

454460
// Apply late rewrites.
@@ -517,31 +523,37 @@ fn apply_adjustment<'tcx>(
517523
}
518524
}
519525

526+
enum AdjustmentStep {
527+
Before(usize),
528+
After(usize),
529+
}
530+
520531
fn materialize_adjustments<'tcx>(
521532
tcx: TyCtxt<'tcx>,
522533
adjustments: &[Adjustment<'tcx>],
523534
hir_rw: Rewrite,
524-
mut callback: impl FnMut(usize, Rewrite) -> Rewrite,
535+
mut callback: impl FnMut(AdjustmentStep, Rewrite) -> Rewrite,
525536
) -> Rewrite {
526537
let adj_kinds: Vec<&_> = adjustments.iter().map(|a| &a.kind).collect();
527538
match (hir_rw, &adj_kinds[..]) {
528539
// The mut-to-const cast should be unneeded once the inner rewrite switches to a safe
529540
// reference type appropriate for the pointer's uses. However, we still want to give
530541
// `callback` a chance to remove the cast itself so that if there's a `RemoveCast` rewrite
531542
// on this adjustment, we don't get an error about it failing to apply.
532-
(rw, &[Adjust::Pointer(PointerCast::MutToConstPointer)]) => {
533-
let mut hir_rw = Rewrite::RemovedCast(Box::new(rw));
534-
hir_rw = callback(0, hir_rw);
543+
(mut hir_rw, &[Adjust::Pointer(PointerCast::MutToConstPointer)]) => {
544+
hir_rw = callback(AdjustmentStep::Before(0), hir_rw);
545+
hir_rw = Rewrite::RemovedCast(Box::new(hir_rw));
546+
hir_rw = callback(AdjustmentStep::After(0), hir_rw);
535547
match hir_rw {
536548
Rewrite::RemovedCast(rw) => *rw,
537549
rw => rw,
538550
}
539551
}
540-
(rw, _) => {
541-
let mut hir_rw = rw;
552+
(mut hir_rw, _) => {
542553
for (i, adj) in adjustments.iter().enumerate() {
554+
hir_rw = callback(AdjustmentStep::Before(i), hir_rw);
543555
hir_rw = apply_adjustment(tcx, adj, hir_rw);
544-
hir_rw = callback(i, hir_rw);
556+
hir_rw = callback(AdjustmentStep::After(i), hir_rw);
545557
}
546558
hir_rw
547559
}

0 commit comments

Comments
 (0)