Struct rustc_const_eval::interpret::OpTy
source · pub struct OpTy<'tcx, Prov: Provenance = AllocId> {
op: Operand<Prov>,
pub layout: TyAndLayout<'tcx>,
pub align: Option<Align>,
}
Fields§
§op: Operand<Prov>
§layout: TyAndLayout<'tcx>
§align: Option<Align>
rustc does not have a proper way to represent the type of a field of a repr(packed)
struct:
it needs to have a different alignment than the field type would usually have.
So we represent this here with a separate field that “overwrites” layout.align
.
This means layout.align
should never be used for an OpTy
!
None
means “alignment does not matter since this is a by-value operand”
(Operand::Immediate
); this field is only relevant for Operand::Indirect
.
Also CTFE ignores alignment anyway, so this is for Miri only.
Implementations§
source§impl<'tcx, Prov: Provenance> OpTy<'tcx, Prov>
impl<'tcx, Prov: Provenance> OpTy<'tcx, Prov>
pub fn len(&self, cx: &impl HasDataLayout) -> InterpResult<'tcx, u64>
sourcepub fn transmute(&self, layout: TyAndLayout<'tcx>) -> Self
pub fn transmute(&self, layout: TyAndLayout<'tcx>) -> Self
Replace the layout of this operand. There’s basically no sanity check that this makes sense, you better know what you are doing! If this is an immediate, applying the wrong layout can not just lead to invalid data, it can actually shift the data around since the offsets of a ScalarPair are entirely determined by the layout, not the data.
sourcepub(super) fn offset_with_meta(
&self,
offset: Size,
meta: MemPlaceMeta<Prov>,
layout: TyAndLayout<'tcx>,
cx: &impl HasDataLayout
) -> InterpResult<'tcx, Self>
pub(super) fn offset_with_meta( &self, offset: Size, meta: MemPlaceMeta<Prov>, layout: TyAndLayout<'tcx>, cx: &impl HasDataLayout ) -> InterpResult<'tcx, Self>
Offset the operand in memory (if possible) and change its metadata.
This can go wrong very easily if you give the wrong layout for the new place!
sourcepub fn offset(
&self,
offset: Size,
layout: TyAndLayout<'tcx>,
cx: &impl HasDataLayout
) -> InterpResult<'tcx, Self>
pub fn offset( &self, offset: Size, layout: TyAndLayout<'tcx>, cx: &impl HasDataLayout ) -> InterpResult<'tcx, Self>
Offset the operand in memory (if possible).
This can go wrong very easily if you give the wrong layout for the new place!
source§impl<'tcx, Prov: Provenance> OpTy<'tcx, Prov>
impl<'tcx, Prov: Provenance> OpTy<'tcx, Prov>
pub fn as_mplace_or_imm( &self ) -> Either<MPlaceTy<'tcx, Prov>, ImmTy<'tcx, Prov>>
pub fn assert_mem_place(&self) -> MPlaceTy<'tcx, Prov>
Trait Implementations§
source§impl<'tcx, Prov: Provenance> Deref for OpTy<'tcx, Prov>
impl<'tcx, Prov: Provenance> Deref for OpTy<'tcx, Prov>
source§impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> Value<'mir, 'tcx, M> for OpTy<'tcx, M::Provenance>
impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> Value<'mir, 'tcx, M> for OpTy<'tcx, M::Provenance>
source§fn layout(&self) -> TyAndLayout<'tcx>
fn layout(&self) -> TyAndLayout<'tcx>
source§fn to_op_for_read(
&self,
_ecx: &InterpCx<'mir, 'tcx, M>
) -> InterpResult<'tcx, OpTy<'tcx, M::Provenance>>
fn to_op_for_read( &self, _ecx: &InterpCx<'mir, 'tcx, M> ) -> InterpResult<'tcx, OpTy<'tcx, M::Provenance>>
OpTy
, in a cheap way that is good for reading.source§fn project_downcast(
&self,
ecx: &InterpCx<'mir, 'tcx, M>,
variant: VariantIdx
) -> InterpResult<'tcx, Self>
fn project_downcast( &self, ecx: &InterpCx<'mir, 'tcx, M>, variant: VariantIdx ) -> InterpResult<'tcx, Self>
source§fn project_field(
&self,
ecx: &InterpCx<'mir, 'tcx, M>,
field: usize
) -> InterpResult<'tcx, Self>
fn project_field( &self, ecx: &InterpCx<'mir, 'tcx, M>, field: usize ) -> InterpResult<'tcx, Self>
source§fn to_op_for_proj(
&self,
ecx: &InterpCx<'mir, 'tcx, M>
) -> InterpResult<'tcx, OpTy<'tcx, M::Provenance>>
fn to_op_for_proj( &self, ecx: &InterpCx<'mir, 'tcx, M> ) -> InterpResult<'tcx, OpTy<'tcx, M::Provenance>>
OpTy
, in a potentially more expensive way that is good for projections.source§impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> ValueMut<'mir, 'tcx, M> for OpTy<'tcx, M::Provenance>
impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> ValueMut<'mir, 'tcx, M> for OpTy<'tcx, M::Provenance>
source§fn layout(&self) -> TyAndLayout<'tcx>
fn layout(&self) -> TyAndLayout<'tcx>
source§fn to_op_for_read(
&self,
_ecx: &InterpCx<'mir, 'tcx, M>
) -> InterpResult<'tcx, OpTy<'tcx, M::Provenance>>
fn to_op_for_read( &self, _ecx: &InterpCx<'mir, 'tcx, M> ) -> InterpResult<'tcx, OpTy<'tcx, M::Provenance>>
OpTy
, in a cheap way that is good for reading.source§fn to_op_for_proj(
&self,
_ecx: &mut InterpCx<'mir, 'tcx, M>
) -> InterpResult<'tcx, OpTy<'tcx, M::Provenance>>
fn to_op_for_proj( &self, _ecx: &mut InterpCx<'mir, 'tcx, M> ) -> InterpResult<'tcx, OpTy<'tcx, M::Provenance>>
OpTy
, in a potentially more expensive way that is good for projections.source§fn project_downcast(
&self,
ecx: &mut InterpCx<'mir, 'tcx, M>,
variant: VariantIdx
) -> InterpResult<'tcx, Self>
fn project_downcast( &self, ecx: &mut InterpCx<'mir, 'tcx, M>, variant: VariantIdx ) -> InterpResult<'tcx, Self>
source§fn project_field(
&self,
ecx: &mut InterpCx<'mir, 'tcx, M>,
field: usize
) -> InterpResult<'tcx, Self>
fn project_field( &self, ecx: &mut InterpCx<'mir, 'tcx, M>, field: usize ) -> InterpResult<'tcx, Self>
Auto Trait Implementations§
impl<'tcx, Prov = AllocId> !RefUnwindSafe for OpTy<'tcx, Prov>
impl<'tcx, Prov = AllocId> !Send for OpTy<'tcx, Prov>
impl<'tcx, Prov = AllocId> !Sync for OpTy<'tcx, Prov>
impl<'tcx, Prov> Unpin for OpTy<'tcx, Prov>where Prov: Unpin,
impl<'tcx, Prov = AllocId> !UnwindSafe for OpTy<'tcx, Prov>
Blanket Implementations§
Layout§
Note: Unable to compute type layout, possibly due to this type having generic parameters. Layout can only be computed for concrete, fully-instantiated types.