2023-09-04 15:18:42 +00:00
|
|
|
use super::{
|
|
|
|
mir::Safety,
|
|
|
|
mir::{Body, Mutability},
|
2023-09-21 08:52:06 +00:00
|
|
|
with, AllocId, DefId, Symbol,
|
2023-09-04 15:18:42 +00:00
|
|
|
};
|
2023-09-14 15:50:11 +00:00
|
|
|
use crate::Opaque;
|
2023-09-06 11:03:12 +00:00
|
|
|
use std::fmt::{self, Debug, Formatter};
|
2023-04-24 01:04:44 +00:00
|
|
|
|
2023-09-06 11:03:12 +00:00
|
|
|
#[derive(Copy, Clone)]
|
2023-04-24 01:04:44 +00:00
|
|
|
pub struct Ty(pub usize);
|
|
|
|
|
2023-09-06 11:03:12 +00:00
|
|
|
impl Debug for Ty {
|
|
|
|
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
|
|
|
|
f.debug_struct("Ty").field("id", &self.0).field("kind", &self.kind()).finish()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-04-24 01:04:44 +00:00
|
|
|
impl Ty {
|
|
|
|
pub fn kind(&self) -> TyKind {
|
|
|
|
with(|context| context.ty_kind(*self))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-09-04 14:31:14 +00:00
|
|
|
impl From<TyKind> for Ty {
|
|
|
|
fn from(value: TyKind) -> Self {
|
|
|
|
with(|context| context.mk_ty(value))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-08-11 20:43:58 +00:00
|
|
|
#[derive(Debug, Clone)]
|
|
|
|
pub struct Const {
|
|
|
|
pub literal: ConstantKind,
|
2023-09-04 15:07:17 +00:00
|
|
|
pub ty: Ty,
|
2023-08-11 20:43:58 +00:00
|
|
|
}
|
|
|
|
|
2023-08-04 20:23:26 +00:00
|
|
|
type Ident = Opaque;
|
2023-09-21 08:52:06 +00:00
|
|
|
pub(crate) struct Region {
|
2023-09-21 09:12:06 +00:00
|
|
|
pub kind: RegionKind,
|
2023-09-21 08:52:06 +00:00
|
|
|
}
|
|
|
|
|
2023-09-21 09:01:30 +00:00
|
|
|
pub enum RegionKind {
|
2023-09-21 08:52:06 +00:00
|
|
|
ReEarlyBound(EarlyBoundRegion),
|
|
|
|
ReLateBound(DebruijnIndex, BoundRegion),
|
|
|
|
ReFree(FreeRegion),
|
|
|
|
ReStatic,
|
|
|
|
ReVar(RegionVid),
|
|
|
|
RePlaceholder(Placeholder<BoundRegion>),
|
|
|
|
ReErased,
|
|
|
|
ReError(ErrorGuaranteed),
|
|
|
|
}
|
|
|
|
|
|
|
|
pub(crate) type DebruijnIndex = u32;
|
|
|
|
|
|
|
|
pub struct EarlyBoundRegion {
|
2023-09-21 09:01:30 +00:00
|
|
|
pub def_id: RegionDef,
|
2023-09-21 08:52:06 +00:00
|
|
|
pub index: u32,
|
|
|
|
pub name: Symbol,
|
|
|
|
}
|
|
|
|
|
|
|
|
pub(crate) type BoundVar = u32;
|
|
|
|
|
|
|
|
pub struct BoundRegion {
|
|
|
|
pub var: BoundVar,
|
|
|
|
pub kind: BoundRegionKind,
|
|
|
|
}
|
|
|
|
|
|
|
|
pub struct FreeRegion {
|
2023-09-21 09:01:30 +00:00
|
|
|
pub scope: RegionDef,
|
2023-09-21 08:52:06 +00:00
|
|
|
pub bound_region: BoundRegionKind,
|
|
|
|
}
|
|
|
|
|
|
|
|
pub(crate) type RegionVid = u32;
|
|
|
|
|
|
|
|
pub(crate) type UniverseIndex = u32;
|
|
|
|
|
|
|
|
pub struct Placeholder<T> {
|
|
|
|
pub universe: UniverseIndex,
|
|
|
|
pub bound: T,
|
|
|
|
}
|
|
|
|
|
|
|
|
pub(crate) type ErrorGuaranteed = ();
|
|
|
|
|
2023-09-12 08:50:50 +00:00
|
|
|
#[derive(Clone, Copy, PartialEq, Eq)]
|
2023-09-14 15:50:11 +00:00
|
|
|
pub struct Span(pub usize);
|
2023-09-12 08:50:50 +00:00
|
|
|
|
|
|
|
impl Debug for Span {
|
|
|
|
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
|
2023-09-14 15:43:30 +00:00
|
|
|
f.debug_struct("Span")
|
|
|
|
.field("id", &self.0)
|
|
|
|
.field("repr", &with(|cx| cx.print_span(*self)))
|
|
|
|
.finish()
|
2023-09-12 08:50:50 +00:00
|
|
|
}
|
|
|
|
}
|
2023-07-12 19:24:33 +00:00
|
|
|
|
2023-07-05 21:50:13 +00:00
|
|
|
#[derive(Clone, Debug)]
|
2023-04-24 01:04:44 +00:00
|
|
|
pub enum TyKind {
|
2023-06-28 14:31:28 +00:00
|
|
|
RigidTy(RigidTy),
|
2023-07-18 00:46:33 +00:00
|
|
|
Alias(AliasKind, AliasTy),
|
2023-07-21 17:18:32 +00:00
|
|
|
Param(ParamTy),
|
2023-07-21 17:52:45 +00:00
|
|
|
Bound(usize, BoundTy),
|
2023-06-28 14:31:28 +00:00
|
|
|
}
|
|
|
|
|
2023-07-05 21:50:13 +00:00
|
|
|
#[derive(Clone, Debug)]
|
2023-06-28 14:31:28 +00:00
|
|
|
pub enum RigidTy {
|
2023-04-24 01:04:44 +00:00
|
|
|
Bool,
|
2023-07-05 22:01:11 +00:00
|
|
|
Char,
|
2023-07-05 22:06:49 +00:00
|
|
|
Int(IntTy),
|
2023-07-05 22:26:52 +00:00
|
|
|
Uint(UintTy),
|
2023-07-05 22:30:24 +00:00
|
|
|
Float(FloatTy),
|
2023-07-18 15:11:49 +00:00
|
|
|
Adt(AdtDef, GenericArgs),
|
2023-07-18 14:18:40 +00:00
|
|
|
Foreign(ForeignDef),
|
2023-07-12 04:56:45 +00:00
|
|
|
Str,
|
|
|
|
Array(Ty, Const),
|
|
|
|
Slice(Ty),
|
2023-07-13 04:23:22 +00:00
|
|
|
RawPtr(Ty, Mutability),
|
2023-07-13 05:07:50 +00:00
|
|
|
Ref(Region, Ty, Mutability),
|
2023-07-18 15:16:38 +00:00
|
|
|
FnDef(FnDef, GenericArgs),
|
2023-07-21 02:16:55 +00:00
|
|
|
FnPtr(PolyFnSig),
|
2023-07-18 15:19:41 +00:00
|
|
|
Closure(ClosureDef, GenericArgs),
|
2023-07-18 16:38:16 +00:00
|
|
|
Generator(GeneratorDef, GenericArgs, Movability),
|
2023-07-24 03:53:08 +00:00
|
|
|
Dynamic(Vec<Binder<ExistentialPredicate>>, Region, DynKind),
|
2023-07-18 15:02:35 +00:00
|
|
|
Never,
|
2023-04-24 01:04:44 +00:00
|
|
|
Tuple(Vec<Ty>),
|
|
|
|
}
|
2023-07-05 22:06:49 +00:00
|
|
|
|
|
|
|
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
|
|
|
|
pub enum IntTy {
|
|
|
|
Isize,
|
|
|
|
I8,
|
|
|
|
I16,
|
|
|
|
I32,
|
|
|
|
I64,
|
|
|
|
I128,
|
|
|
|
}
|
2023-07-05 22:26:52 +00:00
|
|
|
|
|
|
|
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
|
|
|
|
pub enum UintTy {
|
|
|
|
Usize,
|
|
|
|
U8,
|
|
|
|
U16,
|
|
|
|
U32,
|
|
|
|
U64,
|
|
|
|
U128,
|
|
|
|
}
|
2023-07-05 22:30:24 +00:00
|
|
|
|
|
|
|
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
|
|
|
|
pub enum FloatTy {
|
|
|
|
F32,
|
|
|
|
F64,
|
|
|
|
}
|
2023-07-12 19:24:33 +00:00
|
|
|
|
2023-07-18 16:38:16 +00:00
|
|
|
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
|
|
|
|
pub enum Movability {
|
|
|
|
Static,
|
|
|
|
Movable,
|
|
|
|
}
|
|
|
|
|
2023-08-22 10:01:37 +00:00
|
|
|
#[derive(Clone, Copy, PartialEq, Eq, Debug)]
|
2023-09-14 15:50:11 +00:00
|
|
|
pub struct ForeignDef(pub DefId);
|
2023-07-18 14:18:40 +00:00
|
|
|
|
2023-08-22 10:01:37 +00:00
|
|
|
#[derive(Clone, Copy, PartialEq, Eq, Debug)]
|
2023-09-14 15:50:11 +00:00
|
|
|
pub struct FnDef(pub DefId);
|
2023-07-18 15:16:38 +00:00
|
|
|
|
2023-09-04 15:18:42 +00:00
|
|
|
impl FnDef {
|
|
|
|
pub fn body(&self) -> Body {
|
|
|
|
with(|ctx| ctx.mir_body(self.0))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-08-22 10:01:37 +00:00
|
|
|
#[derive(Clone, Copy, PartialEq, Eq, Debug)]
|
2023-09-14 15:50:11 +00:00
|
|
|
pub struct ClosureDef(pub DefId);
|
2023-07-18 15:19:41 +00:00
|
|
|
|
2023-08-22 10:01:37 +00:00
|
|
|
#[derive(Clone, Copy, PartialEq, Eq, Debug)]
|
2023-09-14 15:50:11 +00:00
|
|
|
pub struct GeneratorDef(pub DefId);
|
2023-07-18 16:38:16 +00:00
|
|
|
|
2023-08-22 10:01:37 +00:00
|
|
|
#[derive(Clone, Copy, PartialEq, Eq, Debug)]
|
2023-09-14 15:50:11 +00:00
|
|
|
pub struct ParamDef(pub DefId);
|
2023-07-21 02:16:55 +00:00
|
|
|
|
2023-08-22 10:01:37 +00:00
|
|
|
#[derive(Clone, Copy, PartialEq, Eq, Debug)]
|
2023-09-14 15:50:11 +00:00
|
|
|
pub struct BrNamedDef(pub DefId);
|
2023-07-21 02:16:55 +00:00
|
|
|
|
2023-08-22 10:01:37 +00:00
|
|
|
#[derive(Clone, Copy, PartialEq, Eq, Debug)]
|
2023-09-14 15:50:11 +00:00
|
|
|
pub struct AdtDef(pub DefId);
|
2023-07-12 19:24:33 +00:00
|
|
|
|
2023-08-22 10:01:37 +00:00
|
|
|
#[derive(Clone, Copy, PartialEq, Eq, Debug)]
|
2023-09-14 15:50:11 +00:00
|
|
|
pub struct AliasDef(pub DefId);
|
2023-07-18 00:46:33 +00:00
|
|
|
|
2023-08-22 10:01:37 +00:00
|
|
|
#[derive(Clone, Copy, PartialEq, Eq, Debug)]
|
2023-09-14 15:50:11 +00:00
|
|
|
pub struct TraitDef(pub DefId);
|
2023-07-24 03:53:08 +00:00
|
|
|
|
2023-08-22 10:01:37 +00:00
|
|
|
#[derive(Clone, Copy, PartialEq, Eq, Debug)]
|
2023-09-14 15:50:11 +00:00
|
|
|
pub struct GenericDef(pub DefId);
|
2023-08-22 10:01:37 +00:00
|
|
|
|
|
|
|
#[derive(Clone, Copy, PartialEq, Eq, Debug)]
|
2023-09-14 15:50:11 +00:00
|
|
|
pub struct ConstDef(pub DefId);
|
2023-08-07 15:29:12 +00:00
|
|
|
|
2023-08-07 22:03:05 +00:00
|
|
|
#[derive(Clone, PartialEq, Eq, Debug)]
|
2023-09-14 15:50:11 +00:00
|
|
|
pub struct ImplDef(pub DefId);
|
2023-08-07 22:03:05 +00:00
|
|
|
|
2023-09-21 09:01:30 +00:00
|
|
|
#[derive(Clone, PartialEq, Eq, Debug)]
|
|
|
|
pub struct RegionDef(pub(crate) DefId);
|
|
|
|
|
2023-07-12 19:24:33 +00:00
|
|
|
#[derive(Clone, Debug)]
|
2023-07-18 15:11:49 +00:00
|
|
|
pub struct GenericArgs(pub Vec<GenericArgKind>);
|
2023-07-12 19:24:33 +00:00
|
|
|
|
2023-09-04 15:18:53 +00:00
|
|
|
impl std::ops::Index<ParamTy> for GenericArgs {
|
|
|
|
type Output = Ty;
|
|
|
|
|
|
|
|
fn index(&self, index: ParamTy) -> &Self::Output {
|
|
|
|
self.0[index.index as usize].expect_ty()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl std::ops::Index<ParamConst> for GenericArgs {
|
|
|
|
type Output = Const;
|
|
|
|
|
|
|
|
fn index(&self, index: ParamConst) -> &Self::Output {
|
|
|
|
self.0[index.index as usize].expect_const()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-07-12 19:24:33 +00:00
|
|
|
#[derive(Clone, Debug)]
|
|
|
|
pub enum GenericArgKind {
|
|
|
|
Lifetime(Region),
|
|
|
|
Type(Ty),
|
|
|
|
Const(Const),
|
|
|
|
}
|
2023-07-21 02:16:55 +00:00
|
|
|
|
2023-09-04 15:18:53 +00:00
|
|
|
impl GenericArgKind {
|
|
|
|
/// Panic if this generic argument is not a type, otherwise
|
|
|
|
/// return the type.
|
|
|
|
#[track_caller]
|
|
|
|
pub fn expect_ty(&self) -> &Ty {
|
|
|
|
match self {
|
|
|
|
GenericArgKind::Type(ty) => ty,
|
|
|
|
_ => panic!("{self:?}"),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Panic if this generic argument is not a const, otherwise
|
|
|
|
/// return the const.
|
|
|
|
#[track_caller]
|
|
|
|
pub fn expect_const(&self) -> &Const {
|
|
|
|
match self {
|
|
|
|
GenericArgKind::Const(c) => c,
|
|
|
|
_ => panic!("{self:?}"),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-07-24 03:53:08 +00:00
|
|
|
#[derive(Clone, Debug)]
|
|
|
|
pub enum TermKind {
|
|
|
|
Type(Ty),
|
|
|
|
Const(Const),
|
|
|
|
}
|
|
|
|
|
2023-07-18 00:46:33 +00:00
|
|
|
#[derive(Clone, Debug)]
|
|
|
|
pub enum AliasKind {
|
|
|
|
Projection,
|
|
|
|
Inherent,
|
|
|
|
Opaque,
|
|
|
|
Weak,
|
|
|
|
}
|
|
|
|
|
|
|
|
#[derive(Clone, Debug)]
|
|
|
|
pub struct AliasTy {
|
|
|
|
pub def_id: AliasDef,
|
|
|
|
pub args: GenericArgs,
|
|
|
|
}
|
|
|
|
|
2023-07-21 02:16:55 +00:00
|
|
|
pub type PolyFnSig = Binder<FnSig>;
|
|
|
|
|
|
|
|
#[derive(Clone, Debug)]
|
|
|
|
pub struct FnSig {
|
|
|
|
pub inputs_and_output: Vec<Ty>,
|
|
|
|
pub c_variadic: bool,
|
2023-08-04 20:01:05 +00:00
|
|
|
pub unsafety: Safety,
|
2023-07-21 02:16:55 +00:00
|
|
|
pub abi: Abi,
|
|
|
|
}
|
|
|
|
|
|
|
|
#[derive(Clone, PartialEq, Eq, Debug)]
|
|
|
|
pub enum Abi {
|
|
|
|
Rust,
|
|
|
|
C { unwind: bool },
|
|
|
|
Cdecl { unwind: bool },
|
|
|
|
Stdcall { unwind: bool },
|
|
|
|
Fastcall { unwind: bool },
|
|
|
|
Vectorcall { unwind: bool },
|
|
|
|
Thiscall { unwind: bool },
|
|
|
|
Aapcs { unwind: bool },
|
|
|
|
Win64 { unwind: bool },
|
|
|
|
SysV64 { unwind: bool },
|
|
|
|
PtxKernel,
|
|
|
|
Msp430Interrupt,
|
|
|
|
X86Interrupt,
|
|
|
|
AmdGpuKernel,
|
|
|
|
EfiApi,
|
|
|
|
AvrInterrupt,
|
|
|
|
AvrNonBlockingInterrupt,
|
|
|
|
CCmseNonSecureCall,
|
|
|
|
Wasm,
|
|
|
|
System { unwind: bool },
|
|
|
|
RustIntrinsic,
|
|
|
|
RustCall,
|
|
|
|
PlatformIntrinsic,
|
|
|
|
Unadjusted,
|
|
|
|
RustCold,
|
2023-07-29 17:56:07 +00:00
|
|
|
RiscvInterruptM,
|
|
|
|
RiscvInterruptS,
|
2023-07-21 02:16:55 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
#[derive(Clone, Debug)]
|
|
|
|
pub struct Binder<T> {
|
|
|
|
pub value: T,
|
|
|
|
pub bound_vars: Vec<BoundVariableKind>,
|
|
|
|
}
|
|
|
|
|
2023-08-07 22:03:05 +00:00
|
|
|
#[derive(Clone, Debug)]
|
|
|
|
pub struct EarlyBinder<T> {
|
|
|
|
pub value: T,
|
|
|
|
}
|
|
|
|
|
2023-07-21 02:16:55 +00:00
|
|
|
#[derive(Clone, Debug)]
|
|
|
|
pub enum BoundVariableKind {
|
|
|
|
Ty(BoundTyKind),
|
|
|
|
Region(BoundRegionKind),
|
|
|
|
Const,
|
|
|
|
}
|
|
|
|
|
|
|
|
#[derive(Clone, PartialEq, Eq, Debug)]
|
|
|
|
pub enum BoundTyKind {
|
|
|
|
Anon,
|
|
|
|
Param(ParamDef, String),
|
|
|
|
}
|
|
|
|
|
|
|
|
#[derive(Clone, Debug)]
|
|
|
|
pub enum BoundRegionKind {
|
2023-08-03 15:56:56 +00:00
|
|
|
BrAnon,
|
2023-07-21 02:16:55 +00:00
|
|
|
BrNamed(BrNamedDef, String),
|
|
|
|
BrEnv,
|
|
|
|
}
|
2023-07-24 03:53:08 +00:00
|
|
|
|
|
|
|
#[derive(Clone, Debug)]
|
|
|
|
pub enum DynKind {
|
|
|
|
Dyn,
|
|
|
|
DynStar,
|
|
|
|
}
|
|
|
|
|
|
|
|
#[derive(Clone, Debug)]
|
|
|
|
pub enum ExistentialPredicate {
|
|
|
|
Trait(ExistentialTraitRef),
|
|
|
|
Projection(ExistentialProjection),
|
|
|
|
AutoTrait(TraitDef),
|
|
|
|
}
|
|
|
|
|
|
|
|
#[derive(Clone, Debug)]
|
|
|
|
pub struct ExistentialTraitRef {
|
|
|
|
pub def_id: TraitDef,
|
|
|
|
pub generic_args: GenericArgs,
|
|
|
|
}
|
|
|
|
|
|
|
|
#[derive(Clone, Debug)]
|
|
|
|
pub struct ExistentialProjection {
|
|
|
|
pub def_id: TraitDef,
|
|
|
|
pub generic_args: GenericArgs,
|
|
|
|
pub term: TermKind,
|
|
|
|
}
|
2023-07-21 17:18:32 +00:00
|
|
|
|
|
|
|
#[derive(Clone, Debug)]
|
|
|
|
pub struct ParamTy {
|
|
|
|
pub index: u32,
|
|
|
|
pub name: String,
|
|
|
|
}
|
2023-07-21 17:52:45 +00:00
|
|
|
|
|
|
|
#[derive(Clone, Debug)]
|
|
|
|
pub struct BoundTy {
|
|
|
|
pub var: usize,
|
|
|
|
pub kind: BoundTyKind,
|
|
|
|
}
|
2023-08-02 12:12:38 +00:00
|
|
|
|
|
|
|
pub type Bytes = Vec<Option<u8>>;
|
|
|
|
pub type Size = usize;
|
2023-09-02 05:53:06 +00:00
|
|
|
|
|
|
|
#[derive(Clone, Copy, PartialEq, Eq, Debug)]
|
2023-09-14 15:50:11 +00:00
|
|
|
pub struct Prov(pub AllocId);
|
2023-08-02 12:12:38 +00:00
|
|
|
pub type Align = u64;
|
2023-08-07 15:29:12 +00:00
|
|
|
pub type Promoted = u32;
|
2023-08-02 12:12:38 +00:00
|
|
|
pub type InitMaskMaterialized = Vec<u64>;
|
|
|
|
|
|
|
|
/// Stores the provenance information of pointers stored in memory.
|
|
|
|
#[derive(Clone, Debug)]
|
|
|
|
pub struct ProvenanceMap {
|
|
|
|
/// Provenance in this map applies from the given offset for an entire pointer-size worth of
|
|
|
|
/// bytes. Two entries in this map are always at least a pointer size apart.
|
|
|
|
pub ptrs: Vec<(Size, Prov)>,
|
|
|
|
}
|
|
|
|
|
|
|
|
#[derive(Clone, Debug)]
|
|
|
|
pub struct Allocation {
|
|
|
|
pub bytes: Bytes,
|
|
|
|
pub provenance: ProvenanceMap,
|
|
|
|
pub align: Align,
|
|
|
|
pub mutability: Mutability,
|
|
|
|
}
|
2023-08-04 20:23:26 +00:00
|
|
|
|
2023-08-07 15:29:12 +00:00
|
|
|
#[derive(Clone, Debug)]
|
|
|
|
pub enum ConstantKind {
|
|
|
|
Allocated(Allocation),
|
|
|
|
Unevaluated(UnevaluatedConst),
|
2023-09-04 15:17:27 +00:00
|
|
|
Param(ParamConst),
|
|
|
|
}
|
|
|
|
|
|
|
|
#[derive(Clone, Debug)]
|
|
|
|
pub struct ParamConst {
|
|
|
|
pub index: u32,
|
|
|
|
pub name: String,
|
2023-08-07 15:29:12 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
#[derive(Clone, Debug)]
|
|
|
|
pub struct UnevaluatedConst {
|
|
|
|
pub def: ConstDef,
|
|
|
|
pub args: GenericArgs,
|
|
|
|
pub promoted: Option<Promoted>,
|
|
|
|
}
|
|
|
|
|
2023-08-16 16:10:52 +00:00
|
|
|
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
|
2023-08-04 20:23:26 +00:00
|
|
|
pub enum TraitSpecializationKind {
|
|
|
|
None,
|
|
|
|
Marker,
|
|
|
|
AlwaysApplicable,
|
|
|
|
}
|
|
|
|
|
2023-08-16 16:10:52 +00:00
|
|
|
#[derive(Clone, Debug)]
|
2023-08-04 20:23:26 +00:00
|
|
|
pub struct TraitDecl {
|
|
|
|
pub def_id: TraitDef,
|
|
|
|
pub unsafety: Safety,
|
|
|
|
pub paren_sugar: bool,
|
|
|
|
pub has_auto_impl: bool,
|
|
|
|
pub is_marker: bool,
|
|
|
|
pub is_coinductive: bool,
|
|
|
|
pub skip_array_during_method_dispatch: bool,
|
|
|
|
pub specialization_kind: TraitSpecializationKind,
|
|
|
|
pub must_implement_one_of: Option<Vec<Ident>>,
|
|
|
|
pub implement_via_object: bool,
|
|
|
|
pub deny_explicit_impl: bool,
|
|
|
|
}
|
2023-08-07 22:03:05 +00:00
|
|
|
|
2023-08-28 20:39:52 +00:00
|
|
|
impl TraitDecl {
|
|
|
|
pub fn generics_of(&self) -> Generics {
|
|
|
|
with(|cx| cx.generics_of(self.def_id.0))
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn predicates_of(&self) -> GenericPredicates {
|
|
|
|
with(|cx| cx.predicates_of(self.def_id.0))
|
|
|
|
}
|
2023-09-12 15:57:49 +00:00
|
|
|
|
|
|
|
pub fn explicit_predicates_of(&self) -> GenericPredicates {
|
|
|
|
with(|cx| cx.explicit_predicates_of(self.def_id.0))
|
|
|
|
}
|
2023-08-28 20:39:52 +00:00
|
|
|
}
|
|
|
|
|
2023-08-07 22:03:05 +00:00
|
|
|
pub type ImplTrait = EarlyBinder<TraitRef>;
|
|
|
|
|
2023-08-16 16:10:52 +00:00
|
|
|
#[derive(Clone, Debug)]
|
2023-08-07 22:03:05 +00:00
|
|
|
pub struct TraitRef {
|
|
|
|
pub def_id: TraitDef,
|
|
|
|
pub args: GenericArgs,
|
|
|
|
}
|
2023-08-22 10:01:37 +00:00
|
|
|
|
|
|
|
#[derive(Clone, Debug)]
|
|
|
|
pub struct Generics {
|
|
|
|
pub parent: Option<GenericDef>,
|
|
|
|
pub parent_count: usize,
|
|
|
|
pub params: Vec<GenericParamDef>,
|
|
|
|
pub param_def_id_to_index: Vec<(GenericDef, u32)>,
|
|
|
|
pub has_self: bool,
|
|
|
|
pub has_late_bound_regions: Option<Span>,
|
|
|
|
pub host_effect_index: Option<usize>,
|
|
|
|
}
|
|
|
|
|
|
|
|
#[derive(Clone, Debug)]
|
|
|
|
pub enum GenericParamDefKind {
|
|
|
|
Lifetime,
|
|
|
|
Type { has_default: bool, synthetic: bool },
|
|
|
|
Const { has_default: bool },
|
|
|
|
}
|
|
|
|
|
|
|
|
#[derive(Clone, Debug)]
|
|
|
|
pub struct GenericParamDef {
|
|
|
|
pub name: super::Symbol,
|
|
|
|
pub def_id: GenericDef,
|
|
|
|
pub index: u32,
|
|
|
|
pub pure_wrt_drop: bool,
|
|
|
|
pub kind: GenericParamDefKind,
|
|
|
|
}
|
2023-08-22 04:15:38 +00:00
|
|
|
|
|
|
|
pub struct GenericPredicates {
|
2023-08-28 20:39:17 +00:00
|
|
|
pub parent: Option<TraitDef>,
|
|
|
|
pub predicates: Vec<(PredicateKind, Span)>,
|
2023-08-22 04:15:38 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
#[derive(Clone, Debug)]
|
|
|
|
pub enum PredicateKind {
|
|
|
|
Clause(ClauseKind),
|
|
|
|
ObjectSafe(TraitDef),
|
|
|
|
ClosureKind(ClosureDef, GenericArgs, ClosureKind),
|
|
|
|
SubType(SubtypePredicate),
|
|
|
|
Coerce(CoercePredicate),
|
|
|
|
ConstEquate(Const, Const),
|
|
|
|
Ambiguous,
|
|
|
|
AliasRelate(TermKind, TermKind, AliasRelationDirection),
|
|
|
|
}
|
|
|
|
|
|
|
|
#[derive(Clone, Debug)]
|
|
|
|
pub enum ClauseKind {
|
|
|
|
Trait(TraitPredicate),
|
|
|
|
RegionOutlives(RegionOutlivesPredicate),
|
|
|
|
TypeOutlives(TypeOutlivesPredicate),
|
|
|
|
Projection(ProjectionPredicate),
|
|
|
|
ConstArgHasType(Const, Ty),
|
|
|
|
WellFormed(GenericArgKind),
|
|
|
|
ConstEvaluatable(Const),
|
|
|
|
}
|
|
|
|
|
|
|
|
#[derive(Clone, Debug)]
|
|
|
|
pub enum ClosureKind {
|
|
|
|
Fn,
|
|
|
|
FnMut,
|
|
|
|
FnOnce,
|
|
|
|
}
|
|
|
|
|
|
|
|
#[derive(Clone, Debug)]
|
|
|
|
pub struct SubtypePredicate {
|
|
|
|
pub a: Ty,
|
|
|
|
pub b: Ty,
|
|
|
|
}
|
|
|
|
|
|
|
|
#[derive(Clone, Debug)]
|
|
|
|
pub struct CoercePredicate {
|
|
|
|
pub a: Ty,
|
|
|
|
pub b: Ty,
|
|
|
|
}
|
|
|
|
|
|
|
|
#[derive(Clone, Debug)]
|
|
|
|
pub enum AliasRelationDirection {
|
|
|
|
Equate,
|
|
|
|
Subtype,
|
|
|
|
}
|
|
|
|
|
|
|
|
#[derive(Clone, Debug)]
|
|
|
|
pub struct TraitPredicate {
|
|
|
|
pub trait_ref: TraitRef,
|
|
|
|
pub polarity: ImplPolarity,
|
|
|
|
}
|
|
|
|
|
|
|
|
#[derive(Clone, Debug)]
|
|
|
|
pub struct OutlivesPredicate<A, B>(pub A, pub B);
|
|
|
|
|
|
|
|
pub type RegionOutlivesPredicate = OutlivesPredicate<Region, Region>;
|
|
|
|
pub type TypeOutlivesPredicate = OutlivesPredicate<Ty, Region>;
|
|
|
|
|
|
|
|
#[derive(Clone, Debug)]
|
|
|
|
pub struct ProjectionPredicate {
|
|
|
|
pub projection_ty: AliasTy,
|
|
|
|
pub term: TermKind,
|
|
|
|
}
|
|
|
|
|
|
|
|
#[derive(Clone, Debug)]
|
|
|
|
pub enum ImplPolarity {
|
|
|
|
Positive,
|
|
|
|
Negative,
|
|
|
|
Reservation,
|
|
|
|
}
|