Skip to content

Commit 614f446

Browse files
author
Xinglu Chen
committed
Suggestions in third round of review
1 parent eaffee0 commit 614f446

File tree

2 files changed

+13
-10
lines changed

2 files changed

+13
-10
lines changed

src/borrow_tracker/tree_borrows/mod.rs

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -326,12 +326,14 @@ trait EvalContextPrivExt<'tcx>: crate::MiriInterpCxExt<'tcx> {
326326
),
327327
);
328328
// Keep track of whether the node has any part that allows for interior mutability.
329-
let mut is_frozen = true;
329+
let mut has_unsafe_cell = false;
330+
331+
this.visit_freeze_sensitive(place, ptr_size, |range, frozen| {
332+
has_unsafe_cell = has_unsafe_cell || !frozen;
330333

331-
this.visit_freeze_sensitive(place, ptr_size, |mut range, frozen| {
332-
is_frozen = frozen;
333334
// Adjust range.
334-
range.start += base_offset;
335+
let mut range_with_offset = range;
336+
range_with_offset.start += base_offset;
335337

336338
// We are only ever `Frozen` inside the frozen bits.
337339
let (perm, access) = if frozen {
@@ -343,15 +345,15 @@ trait EvalContextPrivExt<'tcx>: crate::MiriInterpCxExt<'tcx> {
343345

344346
// Store initial permissions.
345347
let perm_init = LocationState::new_init(perm, strongest_idempotent);
346-
for (_perm_range, perm) in perms_map.iter_mut(range.start - base_offset, range.size) {
348+
for (_perm_range, perm) in perms_map.iter_mut(range.start, range.size) {
347349
*perm = perm_init;
348350
}
349351

350352
// Some reborrows incur a read access to the parent.
351353
if access {
352354
tree_borrows.perform_access(
353355
orig_tag,
354-
Some((range, AccessKind::Read, diagnostics::AccessCause::Reborrow)),
356+
Some((range_with_offset, AccessKind::Read, diagnostics::AccessCause::Reborrow)),
355357
this.machine.borrow_tracker.as_ref().unwrap(),
356358
alloc_id,
357359
this.machine.current_span(),
@@ -363,7 +365,7 @@ trait EvalContextPrivExt<'tcx>: crate::MiriInterpCxExt<'tcx> {
363365
if let Some(data_race) = alloc_extra.data_race.as_vclocks_ref() {
364366
data_race.read(
365367
alloc_id,
366-
range,
368+
range_with_offset,
367369
NaReadType::Retag,
368370
Some(place.layout.ty),
369371
&this.machine,
@@ -382,7 +384,7 @@ trait EvalContextPrivExt<'tcx>: crate::MiriInterpCxExt<'tcx> {
382384
new_perm,
383385
perms_map,
384386
span,
385-
is_frozen,
387+
has_unsafe_cell,
386388
)?;
387389
drop(tree_borrows);
388390

src/borrow_tracker/tree_borrows/tree.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -624,12 +624,13 @@ impl<'tcx> Tree {
624624
perm: NewPermission,
625625
perms_map: RangeMap<LocationState>,
626626
span: Span,
627-
frozen: bool,
627+
has_unsafe_cell: bool,
628628
) -> InterpResult<'tcx> {
629629
let idx = self.tag_mapping.insert(new_tag);
630630
let parent_idx = self.tag_mapping.get(&parent_tag).unwrap();
631631
// Allow lazily writing to surrounding data if we have a reference to interior mutable data.
632-
let default_initial_perm = if frozen { perm.freeze_perm } else { perm.nonfreeze_perm };
632+
let default_initial_perm =
633+
if has_unsafe_cell { perm.nonfreeze_perm } else { perm.freeze_perm };
633634
let prot = perm.protector.is_some();
634635

635636
// SIFA of the frozen part must be weaker than SIFA of the non-frozen part, otherwise

0 commit comments

Comments
 (0)