diff options
| author | bors <bors@rust-lang.org> | 2022-03-06 22:37:54 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2022-03-06 22:37:54 +0000 |
| commit | 8876ca3dd46b99fe7e6ad937f11493d37996231e (patch) | |
| tree | cf019658fc97dc581e45f15d0ca2a67cbfa9c7ef /compiler/rustc_mir_transform/src | |
| parent | 38a0b81b1c32764d6a583a5efb6f306b8c44c503 (diff) | |
| parent | 4852291417127d86c3f8404ef03cb1706d89a3e6 (diff) | |
| download | rust-8876ca3dd46b99fe7e6ad937f11493d37996231e.tar.gz rust-8876ca3dd46b99fe7e6ad937f11493d37996231e.zip | |
Auto merge of #94597 - nnethercote:ConstAllocation, r=fee1-dead
Introduce `ConstAllocation`. Currently some `Allocation`s are interned, some are not, and it's very hard to tell at a use point which is which. This commit introduces `ConstAllocation` for the known-interned ones, which makes the division much clearer. `ConstAllocation::inner()` is used to get the underlying `Allocation`. In some places it's natural to use an `Allocation`, in some it's natural to use a `ConstAllocation`, and in some places there's no clear choice. I've tried to make things look as nice as possible, while generally favouring `ConstAllocation`, which is the type that embodies more information. This does require quite a few calls to `inner()`. The commit also tweaks how `PartialOrd` works for `Interned`. The previous code was too clever by half, building on `T: Ord` to make the code shorter. That caused problems with deriving `PartialOrd` and `Ord` for `ConstAllocation`, so I changed it to build on `T: PartialOrd`, which is slightly more verbose but much more standard and avoided the problems. r? `@fee1-dead`
Diffstat (limited to 'compiler/rustc_mir_transform/src')
| -rw-r--r-- | compiler/rustc_mir_transform/src/const_prop.rs | 8 |
1 files changed, 4 insertions, 4 deletions
diff --git a/compiler/rustc_mir_transform/src/const_prop.rs b/compiler/rustc_mir_transform/src/const_prop.rs index d849bc408fa..34c539f3191 100644 --- a/compiler/rustc_mir_transform/src/const_prop.rs +++ b/compiler/rustc_mir_transform/src/const_prop.rs @@ -31,8 +31,8 @@ use rustc_trait_selection::traits; use crate::MirPass; use rustc_const_eval::const_eval::ConstEvalErr; use rustc_const_eval::interpret::{ - self, compile_time_machine, AllocId, Allocation, ConstValue, CtfeValidationMode, Frame, ImmTy, - Immediate, InterpCx, InterpResult, LocalState, LocalValue, MemPlace, MemoryKind, OpTy, + self, compile_time_machine, AllocId, ConstAllocation, ConstValue, CtfeValidationMode, Frame, + ImmTy, Immediate, InterpCx, InterpResult, LocalState, LocalValue, MemPlace, MemoryKind, OpTy, Operand as InterpOperand, PlaceTy, Scalar, ScalarMaybeUninit, StackPopCleanup, StackPopUnwind, }; @@ -274,7 +274,7 @@ impl<'mir, 'tcx> interpret::Machine<'mir, 'tcx> for ConstPropMachine<'mir, 'tcx> fn before_access_global( _memory_extra: &(), _alloc_id: AllocId, - allocation: &Allocation<Self::PointerTag, Self::AllocExtra>, + alloc: ConstAllocation<'tcx, Self::PointerTag, Self::AllocExtra>, _static_def_id: Option<DefId>, is_write: bool, ) -> InterpResult<'tcx> { @@ -283,7 +283,7 @@ impl<'mir, 'tcx> interpret::Machine<'mir, 'tcx> for ConstPropMachine<'mir, 'tcx> } // If the static allocation is mutable, then we can't const prop it as its content // might be different at runtime. - if allocation.mutability == Mutability::Mut { + if alloc.inner().mutability == Mutability::Mut { throw_machine_stop_str!("can't access mutable globals in ConstProp"); } |
