@@ -9,7 +9,11 @@ use std::num::NonZeroU64;
9
9
use rustc_data_structures:: fx:: { FxHashMap , FxHashSet } ;
10
10
use rustc_hir:: Mutability ;
11
11
use rustc_middle:: mir:: RetagKind ;
12
- use rustc_middle:: ty:: { self , layout:: LayoutOf } ;
12
+ use rustc_middle:: ty:: {
13
+ self ,
14
+ layout:: { HasParamEnv , LayoutOf } ,
15
+ } ;
16
+ use rustc_span:: DUMMY_SP ;
13
17
use rustc_target:: abi:: Size ;
14
18
15
19
use crate :: * ;
@@ -657,8 +661,16 @@ trait EvalContextPrivExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
657
661
// Make sure that raw pointers and mutable shared references are reborrowed "weak":
658
662
// There could be existing unique pointers reborrowed from them that should remain valid!
659
663
let perm = match kind {
660
- RefKind :: Unique { two_phase : false } => Permission :: Unique ,
661
- RefKind :: Unique { two_phase : true } => Permission :: SharedReadWrite ,
664
+ RefKind :: Unique { two_phase : false }
665
+ if place. layout . ty . is_unpin ( this. tcx . at ( DUMMY_SP ) , this. param_env ( ) ) =>
666
+ {
667
+ // Only if the type is unpin do we actually enforce uniqueness
668
+ Permission :: Unique
669
+ }
670
+ RefKind :: Unique { .. } => {
671
+ // Two-phase references and !Unpin references are treated as SharedReadWrite
672
+ Permission :: SharedReadWrite
673
+ }
662
674
RefKind :: Raw { mutable : true } => Permission :: SharedReadWrite ,
663
675
RefKind :: Shared | RefKind :: Raw { mutable : false } => {
664
676
// Shared references and *const are a whole different kind of game, the
0 commit comments