@@ -326,12 +326,14 @@ trait EvalContextPrivExt<'tcx>: crate::MiriInterpCxExt<'tcx> {
326
326
) ,
327
327
) ;
328
328
// 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;
330
333
331
- this. visit_freeze_sensitive ( place, ptr_size, |mut range, frozen| {
332
- is_frozen = frozen;
333
334
// Adjust range.
334
- range. start += base_offset;
335
+ let mut range_with_offset = range;
336
+ range_with_offset. start += base_offset;
335
337
336
338
// We are only ever `Frozen` inside the frozen bits.
337
339
let ( perm, access) = if frozen {
@@ -343,15 +345,15 @@ trait EvalContextPrivExt<'tcx>: crate::MiriInterpCxExt<'tcx> {
343
345
344
346
// Store initial permissions.
345
347
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 ) {
347
349
* perm = perm_init;
348
350
}
349
351
350
352
// Some reborrows incur a read access to the parent.
351
353
if access {
352
354
tree_borrows. perform_access (
353
355
orig_tag,
354
- Some ( ( range , AccessKind :: Read , diagnostics:: AccessCause :: Reborrow ) ) ,
356
+ Some ( ( range_with_offset , AccessKind :: Read , diagnostics:: AccessCause :: Reborrow ) ) ,
355
357
this. machine . borrow_tracker . as_ref ( ) . unwrap ( ) ,
356
358
alloc_id,
357
359
this. machine . current_span ( ) ,
@@ -363,7 +365,7 @@ trait EvalContextPrivExt<'tcx>: crate::MiriInterpCxExt<'tcx> {
363
365
if let Some ( data_race) = alloc_extra. data_race . as_vclocks_ref ( ) {
364
366
data_race. read (
365
367
alloc_id,
366
- range ,
368
+ range_with_offset ,
367
369
NaReadType :: Retag ,
368
370
Some ( place. layout . ty ) ,
369
371
& this. machine ,
@@ -382,7 +384,7 @@ trait EvalContextPrivExt<'tcx>: crate::MiriInterpCxExt<'tcx> {
382
384
new_perm,
383
385
perms_map,
384
386
span,
385
- is_frozen ,
387
+ has_unsafe_cell ,
386
388
) ?;
387
389
drop ( tree_borrows) ;
388
390
0 commit comments