1use std::fmt;
2use std::marker::PhantomData;
3use std::ops::Deref;
4
5use derive_where::derive_where;
6use rustc_abi::ExternAbi;
7use rustc_ast_ir::Mutability;
8#[cfg(feature = "nightly")]
9use rustc_data_structures::stable_hasher::{StableHash, StableHashCtxt, StableHasher};
10#[cfg(feature = "nightly")]
11use rustc_macros::{Decodable_NoContext, Encodable_NoContext, StableHash_NoContext};
12use rustc_type_ir::data_structures::{NoError, UnifyKey, UnifyValue};
13use rustc_type_ir_macros::{
14 GenericTypeVisitable, Lift_Generic, TypeFoldable_Generic, TypeVisitable_Generic,
15};
16
17use self::TyKind::*;
18pub use self::closure::*;
19use crate::inherent::*;
20#[cfg(feature = "nightly")]
21use crate::visit::TypeVisitable;
22use crate::{self as ty, BoundVarIndexKind, FloatTy, IntTy, Interner, UintTy};
23
24mod closure;
25
26#[automatically_derived]
impl<I: Interner> ::core::fmt::Debug for AliasTyKind<I> where I: Interner {
fn fmt(&self, __f: &mut ::core::fmt::Formatter<'_>)
-> ::core::fmt::Result {
match self {
AliasTyKind::Projection { def_id: ref __field_def_id } => {
let mut __builder =
::core::fmt::Formatter::debug_struct(__f, "Projection");
::core::fmt::DebugStruct::field(&mut __builder, "def_id",
__field_def_id);
::core::fmt::DebugStruct::finish(&mut __builder)
}
AliasTyKind::Inherent { def_id: ref __field_def_id } => {
let mut __builder =
::core::fmt::Formatter::debug_struct(__f, "Inherent");
::core::fmt::DebugStruct::field(&mut __builder, "def_id",
__field_def_id);
::core::fmt::DebugStruct::finish(&mut __builder)
}
AliasTyKind::Opaque { def_id: ref __field_def_id } => {
let mut __builder =
::core::fmt::Formatter::debug_struct(__f, "Opaque");
::core::fmt::DebugStruct::field(&mut __builder, "def_id",
__field_def_id);
::core::fmt::DebugStruct::finish(&mut __builder)
}
AliasTyKind::Free { def_id: ref __field_def_id } => {
let mut __builder =
::core::fmt::Formatter::debug_struct(__f, "Free");
::core::fmt::DebugStruct::field(&mut __builder, "def_id",
__field_def_id);
::core::fmt::DebugStruct::finish(&mut __builder)
}
}
}
}#[derive_where(Clone, Copy, Hash, PartialEq, Debug; I: Interner)]
27#[derive(GenericTypeVisitable, const _: () =
{
impl<I: Interner, J> ::rustc_type_ir::lift::Lift<J> for AliasTyKind<I>
where I: Interner, J: Interner,
I::DefId: ::rustc_type_ir::lift::Lift<J, Lifted = J::DefId>,
I::DefId: ::rustc_type_ir::lift::Lift<J, Lifted = J::DefId>,
I::DefId: ::rustc_type_ir::lift::Lift<J, Lifted = J::DefId>,
I::DefId: ::rustc_type_ir::lift::Lift<J, Lifted = J::DefId> {
type Lifted = AliasTyKind<J>;
fn lift_to_interner(self, interner: J) -> Self::Lifted {
match self {
AliasTyKind::Projection { def_id: __binding_0 } => {
AliasTyKind::Projection {
def_id: __binding_0.lift_to_interner(interner),
}
}
AliasTyKind::Inherent { def_id: __binding_0 } => {
AliasTyKind::Inherent {
def_id: __binding_0.lift_to_interner(interner),
}
}
AliasTyKind::Opaque { def_id: __binding_0 } => {
AliasTyKind::Opaque {
def_id: __binding_0.lift_to_interner(interner),
}
}
AliasTyKind::Free { def_id: __binding_0 } => {
AliasTyKind::Free {
def_id: __binding_0.lift_to_interner(interner),
}
}
}
}
}
};Lift_Generic)]
28#[cfg_attr(
29 feature = "nightly",
30 derive(const _: () =
{
impl<I: Interner, __E: ::rustc_serialize::Encoder>
::rustc_serialize::Encodable<__E> for AliasTyKind<I> where
I::DefId: ::rustc_serialize::Encodable<__E> {
fn encode(&self, __encoder: &mut __E) {
let disc =
match *self {
AliasTyKind::Projection { def_id: ref __binding_0 } => {
0usize
}
AliasTyKind::Inherent { def_id: ref __binding_0 } => {
1usize
}
AliasTyKind::Opaque { def_id: ref __binding_0 } => {
2usize
}
AliasTyKind::Free { def_id: ref __binding_0 } => { 3usize }
};
::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
match *self {
AliasTyKind::Projection { def_id: ref __binding_0 } => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
AliasTyKind::Inherent { def_id: ref __binding_0 } => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
AliasTyKind::Opaque { def_id: ref __binding_0 } => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
AliasTyKind::Free { def_id: ref __binding_0 } => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
}
}
}
};Encodable_NoContext, const _: () =
{
impl<I: Interner, __D: ::rustc_serialize::Decoder>
::rustc_serialize::Decodable<__D> for AliasTyKind<I> where
I::DefId: ::rustc_serialize::Decodable<__D> {
fn decode(__decoder: &mut __D) -> Self {
match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
{
0usize => {
AliasTyKind::Projection {
def_id: ::rustc_serialize::Decodable::decode(__decoder),
}
}
1usize => {
AliasTyKind::Inherent {
def_id: ::rustc_serialize::Decodable::decode(__decoder),
}
}
2usize => {
AliasTyKind::Opaque {
def_id: ::rustc_serialize::Decodable::decode(__decoder),
}
}
3usize => {
AliasTyKind::Free {
def_id: ::rustc_serialize::Decodable::decode(__decoder),
}
}
n => {
::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `AliasTyKind`, expected 0..4, actual {0}",
n));
}
}
}
}
};Decodable_NoContext, const _: () =
{
impl<I: Interner> ::rustc_data_structures::stable_hasher::StableHash
for AliasTyKind<I> where
I::DefId: ::rustc_data_structures::stable_hasher::StableHash {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hasher::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hasher::StableHasher) {
::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
match *self {
AliasTyKind::Projection { def_id: ref __binding_0 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
AliasTyKind::Inherent { def_id: ref __binding_0 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
AliasTyKind::Opaque { def_id: ref __binding_0 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
AliasTyKind::Free { def_id: ref __binding_0 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash_NoContext)
31)]
32pub enum AliasTyKind<I: Interner> {
33 Projection { def_id: I::DefId },
43
44 Inherent { def_id: I::DefId },
48
49 Opaque { def_id: I::DefId },
59
60 Free { def_id: I::DefId },
65}
66
67impl<I: Interner> AliasTyKind<I> {
68 pub fn new_from_def_id(interner: I, def_id: I::DefId) -> Self {
69 interner.alias_ty_kind_from_def_id(def_id)
70 }
71
72 pub fn descr(self) -> &'static str {
73 match self {
74 AliasTyKind::Projection { .. } => "associated type",
75 AliasTyKind::Inherent { .. } => "inherent associated type",
76 AliasTyKind::Opaque { .. } => "opaque type",
77 AliasTyKind::Free { .. } => "type alias",
78 }
79 }
80
81 pub fn def_id(self) -> I::DefId {
82 let (AliasTyKind::Projection { def_id }
83 | AliasTyKind::Inherent { def_id }
84 | AliasTyKind::Opaque { def_id }
85 | AliasTyKind::Free { def_id }) = self;
86
87 def_id
88 }
89}
90
91#[cfg_attr(feature = "nightly", rustc_diagnostic_item = "IrTyKind")]
96#[automatically_derived]
impl<I: Interner> ::core::cmp::PartialEq for TyKind<I> where I: Interner {
#[inline]
fn eq(&self, __other: &Self) -> ::core::primitive::bool {
if ::core::mem::discriminant(self) ==
::core::mem::discriminant(__other) {
match (self, __other) {
(TyKind::Int(ref __field_0), TyKind::Int(ref __other_field_0))
=>
true &&
::core::cmp::PartialEq::eq(__field_0, __other_field_0),
(TyKind::Uint(ref __field_0),
TyKind::Uint(ref __other_field_0)) =>
true &&
::core::cmp::PartialEq::eq(__field_0, __other_field_0),
(TyKind::Float(ref __field_0),
TyKind::Float(ref __other_field_0)) =>
true &&
::core::cmp::PartialEq::eq(__field_0, __other_field_0),
(TyKind::Adt(ref __field_0, ref __field_1),
TyKind::Adt(ref __other_field_0, ref __other_field_1)) =>
true &&
::core::cmp::PartialEq::eq(__field_0, __other_field_0) &&
::core::cmp::PartialEq::eq(__field_1, __other_field_1),
(TyKind::Foreign(ref __field_0),
TyKind::Foreign(ref __other_field_0)) =>
true &&
::core::cmp::PartialEq::eq(__field_0, __other_field_0),
(TyKind::Array(ref __field_0, ref __field_1),
TyKind::Array(ref __other_field_0, ref __other_field_1)) =>
true &&
::core::cmp::PartialEq::eq(__field_0, __other_field_0) &&
::core::cmp::PartialEq::eq(__field_1, __other_field_1),
(TyKind::Pat(ref __field_0, ref __field_1),
TyKind::Pat(ref __other_field_0, ref __other_field_1)) =>
true &&
::core::cmp::PartialEq::eq(__field_0, __other_field_0) &&
::core::cmp::PartialEq::eq(__field_1, __other_field_1),
(TyKind::Slice(ref __field_0),
TyKind::Slice(ref __other_field_0)) =>
true &&
::core::cmp::PartialEq::eq(__field_0, __other_field_0),
(TyKind::RawPtr(ref __field_0, ref __field_1),
TyKind::RawPtr(ref __other_field_0, ref __other_field_1)) =>
true &&
::core::cmp::PartialEq::eq(__field_0, __other_field_0) &&
::core::cmp::PartialEq::eq(__field_1, __other_field_1),
(TyKind::Ref(ref __field_0, ref __field_1, ref __field_2),
TyKind::Ref(ref __other_field_0, ref __other_field_1,
ref __other_field_2)) =>
true &&
::core::cmp::PartialEq::eq(__field_0, __other_field_0) &&
::core::cmp::PartialEq::eq(__field_1, __other_field_1) &&
::core::cmp::PartialEq::eq(__field_2, __other_field_2),
(TyKind::FnDef(ref __field_0, ref __field_1),
TyKind::FnDef(ref __other_field_0, ref __other_field_1)) =>
true &&
::core::cmp::PartialEq::eq(__field_0, __other_field_0) &&
::core::cmp::PartialEq::eq(__field_1, __other_field_1),
(TyKind::FnPtr(ref __field_0, ref __field_1),
TyKind::FnPtr(ref __other_field_0, ref __other_field_1)) =>
true &&
::core::cmp::PartialEq::eq(__field_0, __other_field_0) &&
::core::cmp::PartialEq::eq(__field_1, __other_field_1),
(TyKind::UnsafeBinder(ref __field_0),
TyKind::UnsafeBinder(ref __other_field_0)) =>
true &&
::core::cmp::PartialEq::eq(__field_0, __other_field_0),
(TyKind::Dynamic(ref __field_0, ref __field_1),
TyKind::Dynamic(ref __other_field_0, ref __other_field_1))
=>
true &&
::core::cmp::PartialEq::eq(__field_0, __other_field_0) &&
::core::cmp::PartialEq::eq(__field_1, __other_field_1),
(TyKind::Closure(ref __field_0, ref __field_1),
TyKind::Closure(ref __other_field_0, ref __other_field_1))
=>
true &&
::core::cmp::PartialEq::eq(__field_0, __other_field_0) &&
::core::cmp::PartialEq::eq(__field_1, __other_field_1),
(TyKind::CoroutineClosure(ref __field_0, ref __field_1),
TyKind::CoroutineClosure(ref __other_field_0,
ref __other_field_1)) =>
true &&
::core::cmp::PartialEq::eq(__field_0, __other_field_0) &&
::core::cmp::PartialEq::eq(__field_1, __other_field_1),
(TyKind::Coroutine(ref __field_0, ref __field_1),
TyKind::Coroutine(ref __other_field_0, ref __other_field_1))
=>
true &&
::core::cmp::PartialEq::eq(__field_0, __other_field_0) &&
::core::cmp::PartialEq::eq(__field_1, __other_field_1),
(TyKind::CoroutineWitness(ref __field_0, ref __field_1),
TyKind::CoroutineWitness(ref __other_field_0,
ref __other_field_1)) =>
true &&
::core::cmp::PartialEq::eq(__field_0, __other_field_0) &&
::core::cmp::PartialEq::eq(__field_1, __other_field_1),
(TyKind::Tuple(ref __field_0),
TyKind::Tuple(ref __other_field_0)) =>
true &&
::core::cmp::PartialEq::eq(__field_0, __other_field_0),
(TyKind::Alias(ref __field_0),
TyKind::Alias(ref __other_field_0)) =>
true &&
::core::cmp::PartialEq::eq(__field_0, __other_field_0),
(TyKind::Param(ref __field_0),
TyKind::Param(ref __other_field_0)) =>
true &&
::core::cmp::PartialEq::eq(__field_0, __other_field_0),
(TyKind::Bound(ref __field_0, ref __field_1),
TyKind::Bound(ref __other_field_0, ref __other_field_1)) =>
true &&
::core::cmp::PartialEq::eq(__field_0, __other_field_0) &&
::core::cmp::PartialEq::eq(__field_1, __other_field_1),
(TyKind::Placeholder(ref __field_0),
TyKind::Placeholder(ref __other_field_0)) =>
true &&
::core::cmp::PartialEq::eq(__field_0, __other_field_0),
(TyKind::Infer(ref __field_0),
TyKind::Infer(ref __other_field_0)) =>
true &&
::core::cmp::PartialEq::eq(__field_0, __other_field_0),
(TyKind::Error(ref __field_0),
TyKind::Error(ref __other_field_0)) =>
true &&
::core::cmp::PartialEq::eq(__field_0, __other_field_0),
_ => true,
}
} else { false }
}
}#[derive_where(Clone, Copy, Hash, PartialEq; I: Interner)]
97#[derive(GenericTypeVisitable)]
98#[cfg_attr(
99 feature = "nightly",
100 derive(const _: () =
{
impl<I: Interner, __E: ::rustc_serialize::Encoder>
::rustc_serialize::Encodable<__E> for TyKind<I> where
I::AdtDef: ::rustc_serialize::Encodable<__E>,
I::GenericArgs: ::rustc_serialize::Encodable<__E>,
I::ForeignId: ::rustc_serialize::Encodable<__E>,
I::Ty: ::rustc_serialize::Encodable<__E>,
I::Const: ::rustc_serialize::Encodable<__E>,
I::Pat: ::rustc_serialize::Encodable<__E>,
I::Region: ::rustc_serialize::Encodable<__E>,
I::FunctionId: ::rustc_serialize::Encodable<__E>,
ty::Binder<I, FnSigTys<I>>: ::rustc_serialize::Encodable<__E>,
FnHeader<I>: ::rustc_serialize::Encodable<__E>,
UnsafeBinderInner<I>: ::rustc_serialize::Encodable<__E>,
I::BoundExistentialPredicates: ::rustc_serialize::Encodable<__E>,
I::ClosureId: ::rustc_serialize::Encodable<__E>,
I::CoroutineClosureId: ::rustc_serialize::Encodable<__E>,
I::CoroutineId: ::rustc_serialize::Encodable<__E>,
I::Tys: ::rustc_serialize::Encodable<__E>,
AliasTy<I>: ::rustc_serialize::Encodable<__E>,
I::ParamTy: ::rustc_serialize::Encodable<__E>,
ty::BoundTy<I>: ::rustc_serialize::Encodable<__E>,
ty::PlaceholderType<I>: ::rustc_serialize::Encodable<__E>,
I::ErrorGuaranteed: ::rustc_serialize::Encodable<__E> {
fn encode(&self, __encoder: &mut __E) {
let disc =
match *self {
TyKind::Bool => { 0usize }
TyKind::Char => { 1usize }
TyKind::Int(ref __binding_0) => { 2usize }
TyKind::Uint(ref __binding_0) => { 3usize }
TyKind::Float(ref __binding_0) => { 4usize }
TyKind::Adt(ref __binding_0, ref __binding_1) => { 5usize }
TyKind::Foreign(ref __binding_0) => { 6usize }
TyKind::Str => { 7usize }
TyKind::Array(ref __binding_0, ref __binding_1) => {
8usize
}
TyKind::Pat(ref __binding_0, ref __binding_1) => { 9usize }
TyKind::Slice(ref __binding_0) => { 10usize }
TyKind::RawPtr(ref __binding_0, ref __binding_1) => {
11usize
}
TyKind::Ref(ref __binding_0, ref __binding_1,
ref __binding_2) => {
12usize
}
TyKind::FnDef(ref __binding_0, ref __binding_1) => {
13usize
}
TyKind::FnPtr(ref __binding_0, ref __binding_1) => {
14usize
}
TyKind::UnsafeBinder(ref __binding_0) => { 15usize }
TyKind::Dynamic(ref __binding_0, ref __binding_1) => {
16usize
}
TyKind::Closure(ref __binding_0, ref __binding_1) => {
17usize
}
TyKind::CoroutineClosure(ref __binding_0, ref __binding_1)
=> {
18usize
}
TyKind::Coroutine(ref __binding_0, ref __binding_1) => {
19usize
}
TyKind::CoroutineWitness(ref __binding_0, ref __binding_1)
=> {
20usize
}
TyKind::Never => { 21usize }
TyKind::Tuple(ref __binding_0) => { 22usize }
TyKind::Alias(ref __binding_0) => { 23usize }
TyKind::Param(ref __binding_0) => { 24usize }
TyKind::Bound(ref __binding_0, ref __binding_1) => {
25usize
}
TyKind::Placeholder(ref __binding_0) => { 26usize }
TyKind::Infer(ref __binding_0) => { 27usize }
TyKind::Error(ref __binding_0) => { 28usize }
};
::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
match *self {
TyKind::Bool => {}
TyKind::Char => {}
TyKind::Int(ref __binding_0) => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
TyKind::Uint(ref __binding_0) => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
TyKind::Float(ref __binding_0) => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
TyKind::Adt(ref __binding_0, ref __binding_1) => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_1,
__encoder);
}
TyKind::Foreign(ref __binding_0) => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
TyKind::Str => {}
TyKind::Array(ref __binding_0, ref __binding_1) => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_1,
__encoder);
}
TyKind::Pat(ref __binding_0, ref __binding_1) => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_1,
__encoder);
}
TyKind::Slice(ref __binding_0) => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
TyKind::RawPtr(ref __binding_0, ref __binding_1) => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_1,
__encoder);
}
TyKind::Ref(ref __binding_0, ref __binding_1,
ref __binding_2) => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_1,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_2,
__encoder);
}
TyKind::FnDef(ref __binding_0, ref __binding_1) => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_1,
__encoder);
}
TyKind::FnPtr(ref __binding_0, ref __binding_1) => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_1,
__encoder);
}
TyKind::UnsafeBinder(ref __binding_0) => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
TyKind::Dynamic(ref __binding_0, ref __binding_1) => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_1,
__encoder);
}
TyKind::Closure(ref __binding_0, ref __binding_1) => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_1,
__encoder);
}
TyKind::CoroutineClosure(ref __binding_0, ref __binding_1)
=> {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_1,
__encoder);
}
TyKind::Coroutine(ref __binding_0, ref __binding_1) => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_1,
__encoder);
}
TyKind::CoroutineWitness(ref __binding_0, ref __binding_1)
=> {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_1,
__encoder);
}
TyKind::Never => {}
TyKind::Tuple(ref __binding_0) => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
TyKind::Alias(ref __binding_0) => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
TyKind::Param(ref __binding_0) => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
TyKind::Bound(ref __binding_0, ref __binding_1) => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_1,
__encoder);
}
TyKind::Placeholder(ref __binding_0) => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
TyKind::Infer(ref __binding_0) => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
TyKind::Error(ref __binding_0) => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
}
}
}
};Encodable_NoContext, const _: () =
{
impl<I: Interner, __D: ::rustc_serialize::Decoder>
::rustc_serialize::Decodable<__D> for TyKind<I> where
I::AdtDef: ::rustc_serialize::Decodable<__D>,
I::GenericArgs: ::rustc_serialize::Decodable<__D>,
I::ForeignId: ::rustc_serialize::Decodable<__D>,
I::Ty: ::rustc_serialize::Decodable<__D>,
I::Const: ::rustc_serialize::Decodable<__D>,
I::Pat: ::rustc_serialize::Decodable<__D>,
I::Region: ::rustc_serialize::Decodable<__D>,
I::FunctionId: ::rustc_serialize::Decodable<__D>,
ty::Binder<I, FnSigTys<I>>: ::rustc_serialize::Decodable<__D>,
FnHeader<I>: ::rustc_serialize::Decodable<__D>,
UnsafeBinderInner<I>: ::rustc_serialize::Decodable<__D>,
I::BoundExistentialPredicates: ::rustc_serialize::Decodable<__D>,
I::ClosureId: ::rustc_serialize::Decodable<__D>,
I::CoroutineClosureId: ::rustc_serialize::Decodable<__D>,
I::CoroutineId: ::rustc_serialize::Decodable<__D>,
I::Tys: ::rustc_serialize::Decodable<__D>,
AliasTy<I>: ::rustc_serialize::Decodable<__D>,
I::ParamTy: ::rustc_serialize::Decodable<__D>,
ty::BoundTy<I>: ::rustc_serialize::Decodable<__D>,
ty::PlaceholderType<I>: ::rustc_serialize::Decodable<__D>,
I::ErrorGuaranteed: ::rustc_serialize::Decodable<__D> {
fn decode(__decoder: &mut __D) -> Self {
match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
{
0usize => { TyKind::Bool }
1usize => { TyKind::Char }
2usize => {
TyKind::Int(::rustc_serialize::Decodable::decode(__decoder))
}
3usize => {
TyKind::Uint(::rustc_serialize::Decodable::decode(__decoder))
}
4usize => {
TyKind::Float(::rustc_serialize::Decodable::decode(__decoder))
}
5usize => {
TyKind::Adt(::rustc_serialize::Decodable::decode(__decoder),
::rustc_serialize::Decodable::decode(__decoder))
}
6usize => {
TyKind::Foreign(::rustc_serialize::Decodable::decode(__decoder))
}
7usize => { TyKind::Str }
8usize => {
TyKind::Array(::rustc_serialize::Decodable::decode(__decoder),
::rustc_serialize::Decodable::decode(__decoder))
}
9usize => {
TyKind::Pat(::rustc_serialize::Decodable::decode(__decoder),
::rustc_serialize::Decodable::decode(__decoder))
}
10usize => {
TyKind::Slice(::rustc_serialize::Decodable::decode(__decoder))
}
11usize => {
TyKind::RawPtr(::rustc_serialize::Decodable::decode(__decoder),
::rustc_serialize::Decodable::decode(__decoder))
}
12usize => {
TyKind::Ref(::rustc_serialize::Decodable::decode(__decoder),
::rustc_serialize::Decodable::decode(__decoder),
::rustc_serialize::Decodable::decode(__decoder))
}
13usize => {
TyKind::FnDef(::rustc_serialize::Decodable::decode(__decoder),
::rustc_serialize::Decodable::decode(__decoder))
}
14usize => {
TyKind::FnPtr(::rustc_serialize::Decodable::decode(__decoder),
::rustc_serialize::Decodable::decode(__decoder))
}
15usize => {
TyKind::UnsafeBinder(::rustc_serialize::Decodable::decode(__decoder))
}
16usize => {
TyKind::Dynamic(::rustc_serialize::Decodable::decode(__decoder),
::rustc_serialize::Decodable::decode(__decoder))
}
17usize => {
TyKind::Closure(::rustc_serialize::Decodable::decode(__decoder),
::rustc_serialize::Decodable::decode(__decoder))
}
18usize => {
TyKind::CoroutineClosure(::rustc_serialize::Decodable::decode(__decoder),
::rustc_serialize::Decodable::decode(__decoder))
}
19usize => {
TyKind::Coroutine(::rustc_serialize::Decodable::decode(__decoder),
::rustc_serialize::Decodable::decode(__decoder))
}
20usize => {
TyKind::CoroutineWitness(::rustc_serialize::Decodable::decode(__decoder),
::rustc_serialize::Decodable::decode(__decoder))
}
21usize => { TyKind::Never }
22usize => {
TyKind::Tuple(::rustc_serialize::Decodable::decode(__decoder))
}
23usize => {
TyKind::Alias(::rustc_serialize::Decodable::decode(__decoder))
}
24usize => {
TyKind::Param(::rustc_serialize::Decodable::decode(__decoder))
}
25usize => {
TyKind::Bound(::rustc_serialize::Decodable::decode(__decoder),
::rustc_serialize::Decodable::decode(__decoder))
}
26usize => {
TyKind::Placeholder(::rustc_serialize::Decodable::decode(__decoder))
}
27usize => {
TyKind::Infer(::rustc_serialize::Decodable::decode(__decoder))
}
28usize => {
TyKind::Error(::rustc_serialize::Decodable::decode(__decoder))
}
n => {
::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `TyKind`, expected 0..29, actual {0}",
n));
}
}
}
}
};Decodable_NoContext, const _: () =
{
impl<I: Interner> ::rustc_data_structures::stable_hasher::StableHash
for TyKind<I> where
I::AdtDef: ::rustc_data_structures::stable_hasher::StableHash,
I::GenericArgs: ::rustc_data_structures::stable_hasher::StableHash,
I::ForeignId: ::rustc_data_structures::stable_hasher::StableHash,
I::Ty: ::rustc_data_structures::stable_hasher::StableHash,
I::Const: ::rustc_data_structures::stable_hasher::StableHash,
I::Pat: ::rustc_data_structures::stable_hasher::StableHash,
I::Region: ::rustc_data_structures::stable_hasher::StableHash,
I::FunctionId: ::rustc_data_structures::stable_hasher::StableHash,
ty::Binder<I,
FnSigTys<I>>: ::rustc_data_structures::stable_hasher::StableHash,
FnHeader<I>: ::rustc_data_structures::stable_hasher::StableHash,
UnsafeBinderInner<I>: ::rustc_data_structures::stable_hasher::StableHash,
I::BoundExistentialPredicates: ::rustc_data_structures::stable_hasher::StableHash,
I::ClosureId: ::rustc_data_structures::stable_hasher::StableHash,
I::CoroutineClosureId: ::rustc_data_structures::stable_hasher::StableHash,
I::CoroutineId: ::rustc_data_structures::stable_hasher::StableHash,
I::Tys: ::rustc_data_structures::stable_hasher::StableHash,
AliasTy<I>: ::rustc_data_structures::stable_hasher::StableHash,
I::ParamTy: ::rustc_data_structures::stable_hasher::StableHash,
ty::BoundTy<I>: ::rustc_data_structures::stable_hasher::StableHash,
ty::PlaceholderType<I>: ::rustc_data_structures::stable_hasher::StableHash,
I::ErrorGuaranteed: ::rustc_data_structures::stable_hasher::StableHash
{
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hasher::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hasher::StableHasher) {
::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
match *self {
TyKind::Bool => {}
TyKind::Char => {}
TyKind::Int(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
TyKind::Uint(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
TyKind::Float(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
TyKind::Adt(ref __binding_0, ref __binding_1) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
TyKind::Foreign(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
TyKind::Str => {}
TyKind::Array(ref __binding_0, ref __binding_1) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
TyKind::Pat(ref __binding_0, ref __binding_1) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
TyKind::Slice(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
TyKind::RawPtr(ref __binding_0, ref __binding_1) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
TyKind::Ref(ref __binding_0, ref __binding_1,
ref __binding_2) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
}
TyKind::FnDef(ref __binding_0, ref __binding_1) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
TyKind::FnPtr(ref __binding_0, ref __binding_1) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
TyKind::UnsafeBinder(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
TyKind::Dynamic(ref __binding_0, ref __binding_1) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
TyKind::Closure(ref __binding_0, ref __binding_1) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
TyKind::CoroutineClosure(ref __binding_0, ref __binding_1)
=> {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
TyKind::Coroutine(ref __binding_0, ref __binding_1) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
TyKind::CoroutineWitness(ref __binding_0, ref __binding_1)
=> {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
TyKind::Never => {}
TyKind::Tuple(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
TyKind::Alias(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
TyKind::Param(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
TyKind::Bound(ref __binding_0, ref __binding_1) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
TyKind::Placeholder(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
TyKind::Infer(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
TyKind::Error(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash_NoContext)
101)]
102pub enum TyKind<I: Interner> {
103 Bool,
105
106 Char,
109
110 Int(IntTy),
112
113 Uint(UintTy),
115
116 Float(FloatTy),
118
119 Adt(I::AdtDef, I::GenericArgs),
127
128 Foreign(I::ForeignId),
130
131 Str,
133
134 Array(I::Ty, I::Const),
136
137 Pat(I::Ty, I::Pat),
145
146 Slice(I::Ty),
148
149 RawPtr(I::Ty, Mutability),
151
152 Ref(I::Region, I::Ty, Mutability),
155
156 FnDef(I::FunctionId, I::GenericArgs),
169
170 FnPtr(ty::Binder<I, FnSigTys<I>>, FnHeader<I>),
189
190 UnsafeBinder(UnsafeBinderInner<I>),
196
197 Dynamic(I::BoundExistentialPredicates, I::Region),
199
200 Closure(I::ClosureId, I::GenericArgs),
206
207 CoroutineClosure(I::CoroutineClosureId, I::GenericArgs),
213
214 Coroutine(I::CoroutineId, I::GenericArgs),
220
221 CoroutineWitness(I::CoroutineId, I::GenericArgs),
246
247 Never,
249
250 Tuple(I::Tys),
252
253 Alias(AliasTy<I>),
258
259 Param(I::ParamTy),
261
262 Bound(BoundVarIndexKind, ty::BoundTy<I>),
279
280 Placeholder(ty::PlaceholderType<I>),
289
290 Infer(InferTy),
297
298 Error(I::ErrorGuaranteed),
302}
303
304impl<I: Interner> Eq for TyKind<I> {}
305
306impl<I: Interner> TyKind<I> {
307 pub fn fn_sig(self, interner: I) -> ty::Binder<I, ty::FnSig<I>> {
308 match self {
309 ty::FnPtr(sig_tys, hdr) => sig_tys.with(hdr),
310 ty::FnDef(def_id, args) => {
311 interner.fn_sig(def_id).instantiate(interner, args).skip_norm_wip()
312 }
313 ty::Error(_) => {
314 ty::Binder::dummy(ty::FnSig::dummy())
316 }
317 ty::Closure(..) => {
::core::panicking::panic_fmt(format_args!("to get the signature of a closure, use `args.as_closure().sig()` not `fn_sig()`"));
}panic!(
318 "to get the signature of a closure, use `args.as_closure().sig()` not `fn_sig()`",
319 ),
320 _ => {
::core::panicking::panic_fmt(format_args!("Ty::fn_sig() called on non-fn type: {0:?}",
self));
}panic!("Ty::fn_sig() called on non-fn type: {:?}", self),
321 }
322 }
323
324 pub fn is_known_rigid(self) -> bool {
332 match self {
333 ty::Bool
334 | ty::Char
335 | ty::Int(_)
336 | ty::Uint(_)
337 | ty::Float(_)
338 | ty::Adt(_, _)
339 | ty::Foreign(_)
340 | ty::Str
341 | ty::Array(_, _)
342 | ty::Pat(_, _)
343 | ty::Slice(_)
344 | ty::RawPtr(_, _)
345 | ty::Ref(_, _, _)
346 | ty::FnDef(_, _)
347 | ty::FnPtr(..)
348 | ty::UnsafeBinder(_)
349 | ty::Dynamic(_, _)
350 | ty::Closure(_, _)
351 | ty::CoroutineClosure(_, _)
352 | ty::Coroutine(_, _)
353 | ty::CoroutineWitness(..)
354 | ty::Never
355 | ty::Tuple(_) => true,
356
357 ty::Error(_)
358 | ty::Infer(_)
359 | ty::Alias(_)
360 | ty::Param(_)
361 | ty::Bound(_, _)
362 | ty::Placeholder(_) => false,
363 }
364 }
365}
366
367impl<I: Interner> fmt::Debug for TyKind<I> {
369 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
370 match self {
371 Bool => f.write_fmt(format_args!("bool"))write!(f, "bool"),
372 Char => f.write_fmt(format_args!("char"))write!(f, "char"),
373 Int(i) => f.write_fmt(format_args!("{0:?}", i))write!(f, "{i:?}"),
374 Uint(u) => f.write_fmt(format_args!("{0:?}", u))write!(f, "{u:?}"),
375 Float(float) => f.write_fmt(format_args!("{0:?}", float))write!(f, "{float:?}"),
376 Adt(d, s) => {
377 f.write_fmt(format_args!("{0:?}", d))write!(f, "{d:?}")?;
378 let mut s = s.iter();
379 let first = s.next();
380 match first {
381 Some(first) => f.write_fmt(format_args!("<{0:?}", first))write!(f, "<{:?}", first)?,
382 None => return Ok(()),
383 };
384
385 for arg in s {
386 f.write_fmt(format_args!(", {0:?}", arg))write!(f, ", {:?}", arg)?;
387 }
388
389 f.write_fmt(format_args!(">"))write!(f, ">")
390 }
391 Foreign(d) => f.debug_tuple("Foreign").field(d).finish(),
392 Str => f.write_fmt(format_args!("str"))write!(f, "str"),
393 Array(t, c) => f.write_fmt(format_args!("[{0:?}; {1:?}]", t, c))write!(f, "[{t:?}; {c:?}]"),
394 Pat(t, p) => f.write_fmt(format_args!("pattern_type!({0:?} is {1:?})", t, p))write!(f, "pattern_type!({t:?} is {p:?})"),
395 Slice(t) => f.write_fmt(format_args!("[{0:?}]", &t))write!(f, "[{:?}]", &t),
396 RawPtr(ty, mutbl) => f.write_fmt(format_args!("*{0} {1:?}", mutbl.ptr_str(), ty))write!(f, "*{} {:?}", mutbl.ptr_str(), ty),
397 Ref(r, t, m) => f.write_fmt(format_args!("&{0:?} {1}{2:?}", r, m.prefix_str(), t))write!(f, "&{:?} {}{:?}", r, m.prefix_str(), t),
398 FnDef(d, s) => f.debug_tuple("FnDef").field(d).field(&s).finish(),
399 FnPtr(sig_tys, hdr) => f.write_fmt(format_args!("{0:?}", sig_tys.with(*hdr)))write!(f, "{:?}", sig_tys.with(*hdr)),
400 UnsafeBinder(binder) => f.write_fmt(format_args!("{0:?}", binder))write!(f, "{:?}", binder),
402 Dynamic(p, r) => f.write_fmt(format_args!("dyn {0:?} + {1:?}", p, r))write!(f, "dyn {p:?} + {r:?}"),
403 Closure(d, s) => f.debug_tuple("Closure").field(d).field(&s).finish(),
404 CoroutineClosure(d, s) => f.debug_tuple("CoroutineClosure").field(d).field(&s).finish(),
405 Coroutine(d, s) => f.debug_tuple("Coroutine").field(d).field(&s).finish(),
406 CoroutineWitness(d, s) => f.debug_tuple("CoroutineWitness").field(d).field(&s).finish(),
407 Never => f.write_fmt(format_args!("!"))write!(f, "!"),
408 Tuple(t) => {
409 f.write_fmt(format_args!("("))write!(f, "(")?;
410 let mut count = 0;
411 for ty in t.iter() {
412 if count > 0 {
413 f.write_fmt(format_args!(", "))write!(f, ", ")?;
414 }
415 f.write_fmt(format_args!("{0:?}", ty))write!(f, "{ty:?}")?;
416 count += 1;
417 }
418 if count == 1 {
420 f.write_fmt(format_args!(","))write!(f, ",")?;
421 }
422 f.write_fmt(format_args!(")"))write!(f, ")")
423 }
424 Alias(a) => f.debug_tuple("Alias").field(&a).finish(),
425 Param(p) => f.write_fmt(format_args!("{0:?}", p))write!(f, "{p:?}"),
426 Bound(d, b) => crate::debug_bound_var(f, *d, b),
427 Placeholder(p) => f.write_fmt(format_args!("{0:?}", p))write!(f, "{p:?}"),
428 Infer(t) => f.write_fmt(format_args!("{0:?}", t))write!(f, "{:?}", t),
429 TyKind::Error(_) => f.write_fmt(format_args!("{{type error}}"))write!(f, "{{type error}}"),
430 }
431 }
432}
433
434#[automatically_derived]
impl<I: Interner> ::core::fmt::Debug for AliasTy<I> where I: Interner {
fn fmt(&self, __f: &mut ::core::fmt::Formatter<'_>)
-> ::core::fmt::Result {
match self {
AliasTy {
args: ref __field_args,
kind: ref __field_kind,
_use_alias_ty_new_instead: ref __field__use_alias_ty_new_instead
} => {
let mut __builder =
::core::fmt::Formatter::debug_struct(__f, "AliasTy");
::core::fmt::DebugStruct::field(&mut __builder, "args",
__field_args);
::core::fmt::DebugStruct::field(&mut __builder, "kind",
__field_kind);
::core::fmt::DebugStruct::finish_non_exhaustive(&mut __builder)
}
}
}
}#[derive_where(Clone, Copy, Hash, PartialEq, Debug; I: Interner)]
440#[derive(const _: () =
{
impl<I: Interner> ::rustc_type_ir::TypeVisitable<I> for AliasTy<I>
where I: Interner,
I::GenericArgs: ::rustc_type_ir::TypeVisitable<I> {
fn visit_with<__V: ::rustc_type_ir::TypeVisitor<I>>(&self,
__visitor: &mut __V) -> __V::Result {
match *self {
AliasTy {
args: ref __binding_0,
_use_alias_ty_new_instead: ref __binding_2, .. } => {
{
match ::rustc_type_ir::VisitorResult::branch(::rustc_type_ir::TypeVisitable::visit_with(__binding_0,
__visitor)) {
::core::ops::ControlFlow::Continue(()) => {}
::core::ops::ControlFlow::Break(r) => {
return ::rustc_type_ir::VisitorResult::from_residual(r);
}
}
}
{
match ::rustc_type_ir::VisitorResult::branch(::rustc_type_ir::TypeVisitable::visit_with(__binding_2,
__visitor)) {
::core::ops::ControlFlow::Continue(()) => {}
::core::ops::ControlFlow::Break(r) => {
return ::rustc_type_ir::VisitorResult::from_residual(r);
}
}
}
}
}
<__V::Result as ::rustc_type_ir::VisitorResult>::output()
}
}
};TypeVisitable_Generic, GenericTypeVisitable, const _: () =
{
impl<I: Interner> ::rustc_type_ir::TypeFoldable<I> for AliasTy<I>
where I: Interner,
I::GenericArgs: ::rustc_type_ir::TypeFoldable<I> {
fn try_fold_with<__F: ::rustc_type_ir::FallibleTypeFolder<I>>(self,
__folder: &mut __F) -> Result<Self, __F::Error> {
Ok(match self {
AliasTy {
args: __binding_0,
kind: __binding_1,
_use_alias_ty_new_instead: __binding_2 } => {
AliasTy {
args: ::rustc_type_ir::TypeFoldable::try_fold_with(__binding_0,
__folder)?,
kind: __binding_1,
_use_alias_ty_new_instead: ::rustc_type_ir::TypeFoldable::try_fold_with(__binding_2,
__folder)?,
}
}
})
}
fn fold_with<__F: ::rustc_type_ir::TypeFolder<I>>(self,
__folder: &mut __F) -> Self {
match self {
AliasTy {
args: __binding_0,
kind: __binding_1,
_use_alias_ty_new_instead: __binding_2 } => {
AliasTy {
args: ::rustc_type_ir::TypeFoldable::fold_with(__binding_0,
__folder),
kind: __binding_1,
_use_alias_ty_new_instead: ::rustc_type_ir::TypeFoldable::fold_with(__binding_2,
__folder),
}
}
}
}
}
};TypeFoldable_Generic, const _: () =
{
impl<I: Interner, J> ::rustc_type_ir::lift::Lift<J> for AliasTy<I>
where I: Interner, J: Interner,
I::GenericArgs: ::rustc_type_ir::lift::Lift<J, Lifted =
J::GenericArgs>,
AliasTyKind<I>: ::rustc_type_ir::lift::Lift<J, Lifted =
AliasTyKind<J>>, (): ::rustc_type_ir::lift::Lift<J, Lifted = ()> {
type Lifted = AliasTy<J>;
fn lift_to_interner(self, interner: J) -> Self::Lifted {
match self {
AliasTy {
args: __binding_0,
kind: __binding_1,
_use_alias_ty_new_instead: __binding_2 } => {
AliasTy {
args: __binding_0.lift_to_interner(interner),
kind: __binding_1.lift_to_interner(interner),
_use_alias_ty_new_instead: __binding_2.lift_to_interner(interner),
}
}
}
}
}
};Lift_Generic)]
441#[cfg_attr(
442 feature = "nightly",
443 derive(const _: () =
{
impl<I: Interner, __D: ::rustc_serialize::Decoder>
::rustc_serialize::Decodable<__D> for AliasTy<I> where
I::GenericArgs: ::rustc_serialize::Decodable<__D>,
AliasTyKind<I>: ::rustc_serialize::Decodable<__D> {
fn decode(__decoder: &mut __D) -> Self {
AliasTy {
args: ::rustc_serialize::Decodable::decode(__decoder),
kind: ::rustc_serialize::Decodable::decode(__decoder),
_use_alias_ty_new_instead: ::rustc_serialize::Decodable::decode(__decoder),
}
}
}
};Decodable_NoContext, const _: () =
{
impl<I: Interner, __E: ::rustc_serialize::Encoder>
::rustc_serialize::Encodable<__E> for AliasTy<I> where
I::GenericArgs: ::rustc_serialize::Encodable<__E>,
AliasTyKind<I>: ::rustc_serialize::Encodable<__E> {
fn encode(&self, __encoder: &mut __E) {
match *self {
AliasTy {
args: ref __binding_0,
kind: ref __binding_1,
_use_alias_ty_new_instead: ref __binding_2 } => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_1,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_2,
__encoder);
}
}
}
}
};Encodable_NoContext, const _: () =
{
impl<I: Interner> ::rustc_data_structures::stable_hasher::StableHash
for AliasTy<I> where
I::GenericArgs: ::rustc_data_structures::stable_hasher::StableHash,
AliasTyKind<I>: ::rustc_data_structures::stable_hasher::StableHash
{
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hasher::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hasher::StableHasher) {
match *self {
AliasTy {
args: ref __binding_0,
kind: ref __binding_1,
_use_alias_ty_new_instead: ref __binding_2 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash_NoContext)
444)]
445pub struct AliasTy<I: Interner> {
446 pub args: I::GenericArgs,
457
458 #[type_foldable(identity)]
459 #[type_visitable(ignore)]
460 pub kind: AliasTyKind<I>,
461
462 #[derive_where(skip(Debug))]
464 pub(crate) _use_alias_ty_new_instead: (),
465}
466
467impl<I: Interner> Eq for AliasTy<I> {}
468
469impl<I: Interner> AliasTy<I> {
470 pub fn new_from_args(interner: I, kind: AliasTyKind<I>, args: I::GenericArgs) -> AliasTy<I> {
471 interner.debug_assert_args_compatible(kind.def_id(), args);
472 AliasTy { kind, args, _use_alias_ty_new_instead: () }
473 }
474
475 pub fn new(
476 interner: I,
477 kind: AliasTyKind<I>,
478 args: impl IntoIterator<Item: Into<I::GenericArg>>,
479 ) -> AliasTy<I> {
480 let args = interner.mk_args_from_iter(args.into_iter().map(Into::into));
481 Self::new_from_args(interner, kind, args)
482 }
483
484 pub fn is_opaque(self) -> bool {
486 #[allow(non_exhaustive_omitted_patterns)] match self.kind {
AliasTyKind::Opaque { .. } => true,
_ => false,
}matches!(self.kind, AliasTyKind::Opaque { .. })
487 }
488
489 pub fn to_ty(self, interner: I) -> I::Ty {
490 Ty::new_alias(interner, self)
491 }
492}
493
494impl<I: Interner> AliasTy<I> {
496 #[track_caller]
497 pub fn self_ty(self) -> I::Ty {
498 self.args.type_at(0)
499 }
500
501 pub fn with_replaced_self_ty(self, interner: I, self_ty: I::Ty) -> Self {
502 AliasTy::new(
503 interner,
504 self.kind,
505 [self_ty.into()].into_iter().chain(self.args.iter().skip(1)),
506 )
507 }
508
509 pub fn trait_def_id(self, interner: I) -> I::DefId {
510 let AliasTyKind::Projection { def_id } = self.kind else { { ::core::panicking::panic_fmt(format_args!("expected a projection")); }panic!("expected a projection") };
511
512 interner.parent(def_id)
513 }
514
515 pub fn trait_ref_and_own_args(self, interner: I) -> (ty::TraitRef<I>, I::GenericArgsSlice) {
521 let AliasTyKind::Projection { def_id } = self.kind else { { ::core::panicking::panic_fmt(format_args!("expected a projection")); }panic!("expected a projection") };
522
523 interner.trait_ref_and_own_args_for_alias(def_id, self.args)
524 }
525
526 pub fn trait_ref(self, interner: I) -> ty::TraitRef<I> {
535 self.trait_ref_and_own_args(interner).0
536 }
537}
538
539#[derive(#[automatically_derived]
impl ::core::clone::Clone for IntVarValue {
#[inline]
fn clone(&self) -> IntVarValue {
let _: ::core::clone::AssertParamIsClone<IntTy>;
let _: ::core::clone::AssertParamIsClone<UintTy>;
*self
}
}Clone, #[automatically_derived]
impl ::core::marker::Copy for IntVarValue { }Copy, #[automatically_derived]
impl ::core::cmp::PartialEq for IntVarValue {
#[inline]
fn eq(&self, other: &IntVarValue) -> bool {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
__self_discr == __arg1_discr &&
match (self, other) {
(IntVarValue::IntType(__self_0),
IntVarValue::IntType(__arg1_0)) => __self_0 == __arg1_0,
(IntVarValue::UintType(__self_0),
IntVarValue::UintType(__arg1_0)) => __self_0 == __arg1_0,
_ => true,
}
}
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for IntVarValue {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<IntTy>;
let _: ::core::cmp::AssertParamIsEq<UintTy>;
}
}Eq, #[automatically_derived]
impl ::core::fmt::Debug for IntVarValue {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
IntVarValue::Unknown =>
::core::fmt::Formatter::write_str(f, "Unknown"),
IntVarValue::IntType(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"IntType", &__self_0),
IntVarValue::UintType(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"UintType", &__self_0),
}
}
}Debug)]
540pub enum IntVarValue {
541 Unknown,
542 IntType(IntTy),
543 UintType(UintTy),
544}
545
546impl IntVarValue {
547 pub fn is_known(self) -> bool {
548 match self {
549 IntVarValue::IntType(_) | IntVarValue::UintType(_) => true,
550 IntVarValue::Unknown => false,
551 }
552 }
553
554 pub fn is_unknown(self) -> bool {
555 !self.is_known()
556 }
557}
558
559#[derive(#[automatically_derived]
impl ::core::clone::Clone for FloatVarValue {
#[inline]
fn clone(&self) -> FloatVarValue {
let _: ::core::clone::AssertParamIsClone<FloatTy>;
*self
}
}Clone, #[automatically_derived]
impl ::core::marker::Copy for FloatVarValue { }Copy, #[automatically_derived]
impl ::core::cmp::PartialEq for FloatVarValue {
#[inline]
fn eq(&self, other: &FloatVarValue) -> bool {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
__self_discr == __arg1_discr &&
match (self, other) {
(FloatVarValue::Known(__self_0),
FloatVarValue::Known(__arg1_0)) => __self_0 == __arg1_0,
_ => true,
}
}
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for FloatVarValue {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<FloatTy>;
}
}Eq, #[automatically_derived]
impl ::core::fmt::Debug for FloatVarValue {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
FloatVarValue::Unknown =>
::core::fmt::Formatter::write_str(f, "Unknown"),
FloatVarValue::Known(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Known",
&__self_0),
}
}
}Debug)]
560pub enum FloatVarValue {
561 Unknown,
562 Known(FloatTy),
563}
564
565impl FloatVarValue {
566 pub fn is_known(self) -> bool {
567 match self {
568 FloatVarValue::Known(_) => true,
569 FloatVarValue::Unknown => false,
570 }
571 }
572
573 pub fn is_unknown(self) -> bool {
574 !self.is_known()
575 }
576}
577
578impl ::std::fmt::Debug for TyVid {
fn fmt(&self, fmt: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
fmt.write_fmt(format_args!("?{0}t", self.as_u32()))
}
}rustc_index::newtype_index! {
579 #[encodable]
581 #[orderable]
582 #[debug_format = "?{}t"]
583 #[gate_rustc_only]
584 pub struct TyVid {}
585}
586
587impl ::std::fmt::Debug for IntVid {
fn fmt(&self, fmt: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
fmt.write_fmt(format_args!("?{0}i", self.as_u32()))
}
}rustc_index::newtype_index! {
588 #[encodable]
590 #[orderable]
591 #[debug_format = "?{}i"]
592 #[gate_rustc_only]
593 pub struct IntVid {}
594}
595
596impl ::std::fmt::Debug for FloatVid {
fn fmt(&self, fmt: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
fmt.write_fmt(format_args!("?{0}f", self.as_u32()))
}
}rustc_index::newtype_index! {
597 #[encodable]
599 #[orderable]
600 #[debug_format = "?{}f"]
601 #[gate_rustc_only]
602 pub struct FloatVid {}
603}
604
605#[derive(#[automatically_derived]
impl ::core::clone::Clone for InferTy {
#[inline]
fn clone(&self) -> InferTy {
let _: ::core::clone::AssertParamIsClone<TyVid>;
let _: ::core::clone::AssertParamIsClone<IntVid>;
let _: ::core::clone::AssertParamIsClone<FloatVid>;
let _: ::core::clone::AssertParamIsClone<u32>;
*self
}
}Clone, #[automatically_derived]
impl ::core::marker::Copy for InferTy { }Copy, #[automatically_derived]
impl ::core::cmp::PartialEq for InferTy {
#[inline]
fn eq(&self, other: &InferTy) -> bool {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
__self_discr == __arg1_discr &&
match (self, other) {
(InferTy::TyVar(__self_0), InferTy::TyVar(__arg1_0)) =>
__self_0 == __arg1_0,
(InferTy::IntVar(__self_0), InferTy::IntVar(__arg1_0)) =>
__self_0 == __arg1_0,
(InferTy::FloatVar(__self_0), InferTy::FloatVar(__arg1_0)) =>
__self_0 == __arg1_0,
(InferTy::FreshTy(__self_0), InferTy::FreshTy(__arg1_0)) =>
__self_0 == __arg1_0,
(InferTy::FreshIntTy(__self_0), InferTy::FreshIntTy(__arg1_0))
=> __self_0 == __arg1_0,
(InferTy::FreshFloatTy(__self_0),
InferTy::FreshFloatTy(__arg1_0)) => __self_0 == __arg1_0,
_ => unsafe { ::core::intrinsics::unreachable() }
}
}
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for InferTy {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<TyVid>;
let _: ::core::cmp::AssertParamIsEq<IntVid>;
let _: ::core::cmp::AssertParamIsEq<FloatVid>;
let _: ::core::cmp::AssertParamIsEq<u32>;
}
}Eq, #[automatically_derived]
impl ::core::cmp::PartialOrd for InferTy {
#[inline]
fn partial_cmp(&self, other: &InferTy)
-> ::core::option::Option<::core::cmp::Ordering> {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
match (self, other) {
(InferTy::TyVar(__self_0), InferTy::TyVar(__arg1_0)) =>
::core::cmp::PartialOrd::partial_cmp(__self_0, __arg1_0),
(InferTy::IntVar(__self_0), InferTy::IntVar(__arg1_0)) =>
::core::cmp::PartialOrd::partial_cmp(__self_0, __arg1_0),
(InferTy::FloatVar(__self_0), InferTy::FloatVar(__arg1_0)) =>
::core::cmp::PartialOrd::partial_cmp(__self_0, __arg1_0),
(InferTy::FreshTy(__self_0), InferTy::FreshTy(__arg1_0)) =>
::core::cmp::PartialOrd::partial_cmp(__self_0, __arg1_0),
(InferTy::FreshIntTy(__self_0), InferTy::FreshIntTy(__arg1_0)) =>
::core::cmp::PartialOrd::partial_cmp(__self_0, __arg1_0),
(InferTy::FreshFloatTy(__self_0), InferTy::FreshFloatTy(__arg1_0))
=> ::core::cmp::PartialOrd::partial_cmp(__self_0, __arg1_0),
_ =>
::core::cmp::PartialOrd::partial_cmp(&__self_discr,
&__arg1_discr),
}
}
}PartialOrd, #[automatically_derived]
impl ::core::cmp::Ord for InferTy {
#[inline]
fn cmp(&self, other: &InferTy) -> ::core::cmp::Ordering {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
match ::core::cmp::Ord::cmp(&__self_discr, &__arg1_discr) {
::core::cmp::Ordering::Equal =>
match (self, other) {
(InferTy::TyVar(__self_0), InferTy::TyVar(__arg1_0)) =>
::core::cmp::Ord::cmp(__self_0, __arg1_0),
(InferTy::IntVar(__self_0), InferTy::IntVar(__arg1_0)) =>
::core::cmp::Ord::cmp(__self_0, __arg1_0),
(InferTy::FloatVar(__self_0), InferTy::FloatVar(__arg1_0))
=> ::core::cmp::Ord::cmp(__self_0, __arg1_0),
(InferTy::FreshTy(__self_0), InferTy::FreshTy(__arg1_0)) =>
::core::cmp::Ord::cmp(__self_0, __arg1_0),
(InferTy::FreshIntTy(__self_0),
InferTy::FreshIntTy(__arg1_0)) =>
::core::cmp::Ord::cmp(__self_0, __arg1_0),
(InferTy::FreshFloatTy(__self_0),
InferTy::FreshFloatTy(__arg1_0)) =>
::core::cmp::Ord::cmp(__self_0, __arg1_0),
_ => unsafe { ::core::intrinsics::unreachable() }
},
cmp => cmp,
}
}
}Ord, #[automatically_derived]
impl ::core::hash::Hash for InferTy {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
let __self_discr = ::core::intrinsics::discriminant_value(self);
::core::hash::Hash::hash(&__self_discr, state);
match self {
InferTy::TyVar(__self_0) =>
::core::hash::Hash::hash(__self_0, state),
InferTy::IntVar(__self_0) =>
::core::hash::Hash::hash(__self_0, state),
InferTy::FloatVar(__self_0) =>
::core::hash::Hash::hash(__self_0, state),
InferTy::FreshTy(__self_0) =>
::core::hash::Hash::hash(__self_0, state),
InferTy::FreshIntTy(__self_0) =>
::core::hash::Hash::hash(__self_0, state),
InferTy::FreshFloatTy(__self_0) =>
::core::hash::Hash::hash(__self_0, state),
}
}
}Hash)]
611#[cfg_attr(feature = "nightly", derive(const _: () =
{
impl<__E: ::rustc_serialize::Encoder>
::rustc_serialize::Encodable<__E> for InferTy {
fn encode(&self, __encoder: &mut __E) {
let disc =
match *self {
InferTy::TyVar(ref __binding_0) => { 0usize }
InferTy::IntVar(ref __binding_0) => { 1usize }
InferTy::FloatVar(ref __binding_0) => { 2usize }
InferTy::FreshTy(ref __binding_0) => { 3usize }
InferTy::FreshIntTy(ref __binding_0) => { 4usize }
InferTy::FreshFloatTy(ref __binding_0) => { 5usize }
};
::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
match *self {
InferTy::TyVar(ref __binding_0) => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
InferTy::IntVar(ref __binding_0) => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
InferTy::FloatVar(ref __binding_0) => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
InferTy::FreshTy(ref __binding_0) => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
InferTy::FreshIntTy(ref __binding_0) => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
InferTy::FreshFloatTy(ref __binding_0) => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
}
}
}
};Encodable_NoContext, const _: () =
{
impl<__D: ::rustc_serialize::Decoder>
::rustc_serialize::Decodable<__D> for InferTy {
fn decode(__decoder: &mut __D) -> Self {
match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
{
0usize => {
InferTy::TyVar(::rustc_serialize::Decodable::decode(__decoder))
}
1usize => {
InferTy::IntVar(::rustc_serialize::Decodable::decode(__decoder))
}
2usize => {
InferTy::FloatVar(::rustc_serialize::Decodable::decode(__decoder))
}
3usize => {
InferTy::FreshTy(::rustc_serialize::Decodable::decode(__decoder))
}
4usize => {
InferTy::FreshIntTy(::rustc_serialize::Decodable::decode(__decoder))
}
5usize => {
InferTy::FreshFloatTy(::rustc_serialize::Decodable::decode(__decoder))
}
n => {
::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `InferTy`, expected 0..6, actual {0}",
n));
}
}
}
}
};Decodable_NoContext))]
612pub enum InferTy {
613 TyVar(TyVid),
615 IntVar(IntVid),
622 FloatVar(FloatVid),
629
630 FreshTy(u32),
637 FreshIntTy(u32),
639 FreshFloatTy(u32),
641}
642
643impl UnifyValue for IntVarValue {
644 type Error = NoError;
645
646 fn unify_values(value1: &Self, value2: &Self) -> Result<Self, Self::Error> {
647 match (*value1, *value2) {
648 (IntVarValue::Unknown, IntVarValue::Unknown) => Ok(IntVarValue::Unknown),
649 (
650 IntVarValue::Unknown,
651 known @ (IntVarValue::UintType(_) | IntVarValue::IntType(_)),
652 )
653 | (
654 known @ (IntVarValue::UintType(_) | IntVarValue::IntType(_)),
655 IntVarValue::Unknown,
656 ) => Ok(known),
657 _ => {
::core::panicking::panic_fmt(format_args!("differing ints should have been resolved first"));
}panic!("differing ints should have been resolved first"),
658 }
659 }
660}
661
662impl UnifyKey for IntVid {
663 type Value = IntVarValue;
664 #[inline] fn index(&self) -> u32 {
666 self.as_u32()
667 }
668 #[inline]
669 fn from_index(i: u32) -> IntVid {
670 IntVid::from_u32(i)
671 }
672 fn tag() -> &'static str {
673 "IntVid"
674 }
675}
676
677impl UnifyValue for FloatVarValue {
678 type Error = NoError;
679
680 fn unify_values(value1: &Self, value2: &Self) -> Result<Self, Self::Error> {
681 match (*value1, *value2) {
682 (FloatVarValue::Unknown, FloatVarValue::Unknown) => Ok(FloatVarValue::Unknown),
683 (FloatVarValue::Unknown, FloatVarValue::Known(known))
684 | (FloatVarValue::Known(known), FloatVarValue::Unknown) => {
685 Ok(FloatVarValue::Known(known))
686 }
687 (FloatVarValue::Known(_), FloatVarValue::Known(_)) => {
688 {
::core::panicking::panic_fmt(format_args!("differing floats should have been resolved first"));
}panic!("differing floats should have been resolved first")
689 }
690 }
691 }
692}
693
694impl UnifyKey for FloatVid {
695 type Value = FloatVarValue;
696 #[inline]
697 fn index(&self) -> u32 {
698 self.as_u32()
699 }
700 #[inline]
701 fn from_index(i: u32) -> FloatVid {
702 FloatVid::from_u32(i)
703 }
704 fn tag() -> &'static str {
705 "FloatVid"
706 }
707}
708
709#[cfg(feature = "nightly")]
710impl StableHash for InferTy {
711 fn stable_hash<Hcx: StableHashCtxt>(&self, hcx: &mut Hcx, hasher: &mut StableHasher) {
712 use InferTy::*;
713 std::mem::discriminant(self).stable_hash(hcx, hasher);
714 match self {
715 TyVar(_) | IntVar(_) | FloatVar(_) => {
716 {
::core::panicking::panic_fmt(format_args!("type variables should not be hashed: {0:?}",
self));
}panic!("type variables should not be hashed: {self:?}")
717 }
718 FreshTy(v) | FreshIntTy(v) | FreshFloatTy(v) => v.stable_hash(hcx, hasher),
719 }
720 }
721}
722
723impl fmt::Display for InferTy {
724 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
725 use InferTy::*;
726 match *self {
727 TyVar(_) => f.write_fmt(format_args!("_"))write!(f, "_"),
728 IntVar(_) => f.write_fmt(format_args!("{0}", "{integer}"))write!(f, "{}", "{integer}"),
729 FloatVar(_) => f.write_fmt(format_args!("{0}", "{float}"))write!(f, "{}", "{float}"),
730 FreshTy(v) => f.write_fmt(format_args!("FreshTy({0})", v))write!(f, "FreshTy({v})"),
731 FreshIntTy(v) => f.write_fmt(format_args!("FreshIntTy({0})", v))write!(f, "FreshIntTy({v})"),
732 FreshFloatTy(v) => f.write_fmt(format_args!("FreshFloatTy({0})", v))write!(f, "FreshFloatTy({v})"),
733 }
734 }
735}
736
737impl fmt::Debug for InferTy {
738 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
739 use InferTy::*;
740 match *self {
741 TyVar(ref v) => v.fmt(f),
742 IntVar(ref v) => v.fmt(f),
743 FloatVar(ref v) => v.fmt(f),
744 FreshTy(v) => f.write_fmt(format_args!("FreshTy({0:?})", v))write!(f, "FreshTy({v:?})"),
745 FreshIntTy(v) => f.write_fmt(format_args!("FreshIntTy({0:?})", v))write!(f, "FreshIntTy({v:?})"),
746 FreshFloatTy(v) => f.write_fmt(format_args!("FreshFloatTy({0:?})", v))write!(f, "FreshFloatTy({v:?})"),
747 }
748 }
749}
750
751#[automatically_derived]
impl<I: Interner> ::core::fmt::Debug for TypeAndMut<I> where I: Interner {
fn fmt(&self, __f: &mut ::core::fmt::Formatter<'_>)
-> ::core::fmt::Result {
match self {
TypeAndMut { ty: ref __field_ty, mutbl: ref __field_mutbl } => {
let mut __builder =
::core::fmt::Formatter::debug_struct(__f, "TypeAndMut");
::core::fmt::DebugStruct::field(&mut __builder, "ty",
__field_ty);
::core::fmt::DebugStruct::field(&mut __builder, "mutbl",
__field_mutbl);
::core::fmt::DebugStruct::finish(&mut __builder)
}
}
}
}#[derive_where(Clone, Copy, PartialEq, Hash, Debug; I: Interner)]
752#[cfg_attr(
753 feature = "nightly",
754 derive(const _: () =
{
impl<I: Interner, __E: ::rustc_serialize::Encoder>
::rustc_serialize::Encodable<__E> for TypeAndMut<I> where
I::Ty: ::rustc_serialize::Encodable<__E> {
fn encode(&self, __encoder: &mut __E) {
match *self {
TypeAndMut { ty: ref __binding_0, mutbl: ref __binding_1 }
=> {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_1,
__encoder);
}
}
}
}
};Encodable_NoContext, const _: () =
{
impl<I: Interner, __D: ::rustc_serialize::Decoder>
::rustc_serialize::Decodable<__D> for TypeAndMut<I> where
I::Ty: ::rustc_serialize::Decodable<__D> {
fn decode(__decoder: &mut __D) -> Self {
TypeAndMut {
ty: ::rustc_serialize::Decodable::decode(__decoder),
mutbl: ::rustc_serialize::Decodable::decode(__decoder),
}
}
}
};Decodable_NoContext, const _: () =
{
impl<I: Interner> ::rustc_data_structures::stable_hasher::StableHash
for TypeAndMut<I> where
I::Ty: ::rustc_data_structures::stable_hasher::StableHash {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hasher::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hasher::StableHasher) {
match *self {
TypeAndMut { ty: ref __binding_0, mutbl: ref __binding_1 }
=> {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash_NoContext)
755)]
756#[derive(const _: () =
{
impl<I: Interner> ::rustc_type_ir::TypeVisitable<I> for TypeAndMut<I>
where I: Interner, I::Ty: ::rustc_type_ir::TypeVisitable<I> {
fn visit_with<__V: ::rustc_type_ir::TypeVisitor<I>>(&self,
__visitor: &mut __V) -> __V::Result {
match *self {
TypeAndMut { ty: ref __binding_0, mutbl: ref __binding_1 }
=> {
{
match ::rustc_type_ir::VisitorResult::branch(::rustc_type_ir::TypeVisitable::visit_with(__binding_0,
__visitor)) {
::core::ops::ControlFlow::Continue(()) => {}
::core::ops::ControlFlow::Break(r) => {
return ::rustc_type_ir::VisitorResult::from_residual(r);
}
}
}
{
match ::rustc_type_ir::VisitorResult::branch(::rustc_type_ir::TypeVisitable::visit_with(__binding_1,
__visitor)) {
::core::ops::ControlFlow::Continue(()) => {}
::core::ops::ControlFlow::Break(r) => {
return ::rustc_type_ir::VisitorResult::from_residual(r);
}
}
}
}
}
<__V::Result as ::rustc_type_ir::VisitorResult>::output()
}
}
};TypeVisitable_Generic, GenericTypeVisitable, const _: () =
{
impl<I: Interner> ::rustc_type_ir::TypeFoldable<I> for TypeAndMut<I>
where I: Interner, I::Ty: ::rustc_type_ir::TypeFoldable<I> {
fn try_fold_with<__F: ::rustc_type_ir::FallibleTypeFolder<I>>(self,
__folder: &mut __F) -> Result<Self, __F::Error> {
Ok(match self {
TypeAndMut { ty: __binding_0, mutbl: __binding_1 } => {
TypeAndMut {
ty: ::rustc_type_ir::TypeFoldable::try_fold_with(__binding_0,
__folder)?,
mutbl: ::rustc_type_ir::TypeFoldable::try_fold_with(__binding_1,
__folder)?,
}
}
})
}
fn fold_with<__F: ::rustc_type_ir::TypeFolder<I>>(self,
__folder: &mut __F) -> Self {
match self {
TypeAndMut { ty: __binding_0, mutbl: __binding_1 } => {
TypeAndMut {
ty: ::rustc_type_ir::TypeFoldable::fold_with(__binding_0,
__folder),
mutbl: ::rustc_type_ir::TypeFoldable::fold_with(__binding_1,
__folder),
}
}
}
}
}
};TypeFoldable_Generic)]
757pub struct TypeAndMut<I: Interner> {
758 pub ty: I::Ty,
759 pub mutbl: Mutability,
760}
761
762impl<I: Interner> Eq for TypeAndMut<I> {}
763
764#[automatically_derived]
impl<I: Interner> ::core::hash::Hash for FnSigKind<I> where I: Interner {
fn hash<__H: ::core::hash::Hasher>(&self, __state: &mut __H) {
match self {
FnSigKind { flags: ref __field_flags, _marker: ref __field__marker
} => {
::core::hash::Hash::hash(__field_flags, __state);
::core::hash::Hash::hash(__field__marker, __state);
}
}
}
}#[derive_where(Copy, Clone, PartialEq, Eq, Hash; I: Interner)]
767#[derive(const _: () =
{
impl<I: Interner> ::rustc_type_ir::TypeVisitable<I> for FnSigKind<I>
where I: Interner {
fn visit_with<__V: ::rustc_type_ir::TypeVisitor<I>>(&self,
__visitor: &mut __V) -> __V::Result {
match *self { FnSigKind { .. } => {} }
<__V::Result as ::rustc_type_ir::VisitorResult>::output()
}
}
};TypeVisitable_Generic, const _: () =
{
impl<I: Interner> ::rustc_type_ir::TypeFoldable<I> for FnSigKind<I>
where I: Interner {
fn try_fold_with<__F: ::rustc_type_ir::FallibleTypeFolder<I>>(self,
__folder: &mut __F) -> Result<Self, __F::Error> {
Ok(match self {
FnSigKind { flags: __binding_0, _marker: __binding_1 } => {
FnSigKind { flags: __binding_0, _marker: __binding_1 }
}
})
}
fn fold_with<__F: ::rustc_type_ir::TypeFolder<I>>(self,
__folder: &mut __F) -> Self {
match self {
FnSigKind { flags: __binding_0, _marker: __binding_1 } => {
FnSigKind { flags: __binding_0, _marker: __binding_1 }
}
}
}
}
};TypeFoldable_Generic)]
768#[cfg_attr(
769 feature = "nightly",
770 derive(const _: () =
{
impl<I: Interner, __E: ::rustc_serialize::Encoder>
::rustc_serialize::Encodable<__E> for FnSigKind<I> where
PhantomData<fn() -> I>: ::rustc_serialize::Encodable<__E> {
fn encode(&self, __encoder: &mut __E) {
match *self {
FnSigKind { flags: ref __binding_0, _marker: ref __binding_1
} => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_1,
__encoder);
}
}
}
}
};Encodable_NoContext, const _: () =
{
impl<I: Interner, __D: ::rustc_serialize::Decoder>
::rustc_serialize::Decodable<__D> for FnSigKind<I> where
PhantomData<fn() -> I>: ::rustc_serialize::Decodable<__D> {
fn decode(__decoder: &mut __D) -> Self {
FnSigKind {
flags: ::rustc_serialize::Decodable::decode(__decoder),
_marker: ::rustc_serialize::Decodable::decode(__decoder),
}
}
}
};Decodable_NoContext, const _: () =
{
impl<I: Interner> ::rustc_data_structures::stable_hasher::StableHash
for FnSigKind<I> where
PhantomData<fn()
-> I>: ::rustc_data_structures::stable_hasher::StableHash {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hasher::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hasher::StableHasher) {
match *self {
FnSigKind { flags: ref __binding_0, _marker: ref __binding_1
} => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash_NoContext)
771)]
772pub struct FnSigKind<I: Interner> {
773 #[type_visitable(ignore)]
776 #[type_foldable(identity)]
777 flags: u8,
778 #[type_visitable(ignore)]
779 #[type_foldable(identity)]
780 _marker: PhantomData<fn() -> I>,
781}
782
783impl<I: Interner, J: Interner> crate::lift::Lift<J> for FnSigKind<I> {
784 type Lifted = FnSigKind<J>;
785 fn lift_to_interner(self, _cx: J) -> Self::Lifted {
786 FnSigKind { flags: self.flags, _marker: PhantomData }
787 }
788}
789
790impl<I: Interner> fmt::Debug for FnSigKind<I> {
791 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
792 let mut f = f.debug_tuple("FnSigKind");
793
794 if self.is_safe() {
795 f.field(&"Safe");
796 } else {
797 f.field(&"Unsafe");
798 }
799
800 f.field(&self.abi());
801
802 if self.c_variadic() {
803 f.field(&"CVariadic");
804 };
805
806 f.finish()
807 }
808}
809
810impl<I: Interner> FnSigKind<I> {
811 const EXTERN_ABI_MASK: u8 = 0b111111;
813
814 const SAFE_FLAG: u8 = 1 << 6;
816
817 const C_VARIADIC_FLAG: u8 = 1 << 7;
819
820 pub fn default() -> Self {
824 Self { flags: 0, _marker: PhantomData }
825 .set_abi(ExternAbi::Rust)
826 .set_safety(I::Safety::unsafe_mode())
827 .set_c_variadic(false)
828 }
829
830 pub fn new(abi: ExternAbi, safety: I::Safety, c_variadic: bool) -> Self {
832 Self::default().set_abi(abi).set_safety(safety).set_c_variadic(c_variadic)
833 }
834
835 #[must_use = "this method does not modify the receiver"]
837 pub fn set_abi(mut self, abi: ExternAbi) -> Self {
838 let abi_index = abi.as_packed();
839 if !(abi_index <= Self::EXTERN_ABI_MASK) {
::core::panicking::panic("assertion failed: abi_index <= Self::EXTERN_ABI_MASK")
};assert!(abi_index <= Self::EXTERN_ABI_MASK);
840
841 self.flags &= !Self::EXTERN_ABI_MASK;
842 self.flags |= abi_index;
843
844 self
845 }
846
847 #[must_use = "this method does not modify the receiver"]
849 pub fn set_safety(mut self, safety: I::Safety) -> Self {
850 if safety.is_safe() {
851 self.flags |= Self::SAFE_FLAG;
852 } else {
853 self.flags &= !Self::SAFE_FLAG;
854 }
855
856 self
857 }
858
859 #[must_use = "this method does not modify the receiver"]
861 pub fn set_c_variadic(mut self, c_variadic: bool) -> Self {
862 if c_variadic {
863 self.flags |= Self::C_VARIADIC_FLAG;
864 } else {
865 self.flags &= !Self::C_VARIADIC_FLAG;
866 }
867
868 self
869 }
870
871 pub fn abi(self) -> ExternAbi {
873 let abi_index = self.flags & Self::EXTERN_ABI_MASK;
874 ExternAbi::from_packed(abi_index)
875 }
876
877 pub fn is_safe(self) -> bool {
879 self.flags & Self::SAFE_FLAG != 0
880 }
881
882 pub fn safety(self) -> I::Safety {
884 if self.is_safe() { I::Safety::safe() } else { I::Safety::unsafe_mode() }
885 }
886
887 pub fn c_variadic(self) -> bool {
889 self.flags & Self::C_VARIADIC_FLAG != 0
890 }
891}
892
893#[automatically_derived]
impl<I: Interner> ::core::hash::Hash for FnSig<I> where I: Interner {
fn hash<__H: ::core::hash::Hasher>(&self, __state: &mut __H) {
match self {
FnSig {
inputs_and_output: ref __field_inputs_and_output,
fn_sig_kind: ref __field_fn_sig_kind } => {
::core::hash::Hash::hash(__field_inputs_and_output, __state);
::core::hash::Hash::hash(__field_fn_sig_kind, __state);
}
}
}
}#[derive_where(Clone, Copy, PartialEq, Hash; I: Interner)]
894#[cfg_attr(
895 feature = "nightly",
896 derive(const _: () =
{
impl<I: Interner, __E: ::rustc_serialize::Encoder>
::rustc_serialize::Encodable<__E> for FnSig<I> where
I::Tys: ::rustc_serialize::Encodable<__E>,
FnSigKind<I>: ::rustc_serialize::Encodable<__E> {
fn encode(&self, __encoder: &mut __E) {
match *self {
FnSig {
inputs_and_output: ref __binding_0,
fn_sig_kind: ref __binding_1 } => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_1,
__encoder);
}
}
}
}
};Encodable_NoContext, const _: () =
{
impl<I: Interner, __D: ::rustc_serialize::Decoder>
::rustc_serialize::Decodable<__D> for FnSig<I> where
I::Tys: ::rustc_serialize::Decodable<__D>,
FnSigKind<I>: ::rustc_serialize::Decodable<__D> {
fn decode(__decoder: &mut __D) -> Self {
FnSig {
inputs_and_output: ::rustc_serialize::Decodable::decode(__decoder),
fn_sig_kind: ::rustc_serialize::Decodable::decode(__decoder),
}
}
}
};Decodable_NoContext, const _: () =
{
impl<I: Interner> ::rustc_data_structures::stable_hasher::StableHash
for FnSig<I> where
I::Tys: ::rustc_data_structures::stable_hasher::StableHash,
FnSigKind<I>: ::rustc_data_structures::stable_hasher::StableHash {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hasher::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hasher::StableHasher) {
match *self {
FnSig {
inputs_and_output: ref __binding_0,
fn_sig_kind: ref __binding_1 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash_NoContext)
897)]
898#[derive(const _: () =
{
impl<I: Interner> ::rustc_type_ir::TypeVisitable<I> for FnSig<I> where
I: Interner, I::Tys: ::rustc_type_ir::TypeVisitable<I> {
fn visit_with<__V: ::rustc_type_ir::TypeVisitor<I>>(&self,
__visitor: &mut __V) -> __V::Result {
match *self {
FnSig { inputs_and_output: ref __binding_0, .. } => {
{
match ::rustc_type_ir::VisitorResult::branch(::rustc_type_ir::TypeVisitable::visit_with(__binding_0,
__visitor)) {
::core::ops::ControlFlow::Continue(()) => {}
::core::ops::ControlFlow::Break(r) => {
return ::rustc_type_ir::VisitorResult::from_residual(r);
}
}
}
}
}
<__V::Result as ::rustc_type_ir::VisitorResult>::output()
}
}
};TypeVisitable_Generic, GenericTypeVisitable, const _: () =
{
impl<I: Interner> ::rustc_type_ir::TypeFoldable<I> for FnSig<I> where
I: Interner, I::Tys: ::rustc_type_ir::TypeFoldable<I> {
fn try_fold_with<__F: ::rustc_type_ir::FallibleTypeFolder<I>>(self,
__folder: &mut __F) -> Result<Self, __F::Error> {
Ok(match self {
FnSig {
inputs_and_output: __binding_0, fn_sig_kind: __binding_1 }
=> {
FnSig {
inputs_and_output: ::rustc_type_ir::TypeFoldable::try_fold_with(__binding_0,
__folder)?,
fn_sig_kind: __binding_1,
}
}
})
}
fn fold_with<__F: ::rustc_type_ir::TypeFolder<I>>(self,
__folder: &mut __F) -> Self {
match self {
FnSig {
inputs_and_output: __binding_0, fn_sig_kind: __binding_1 }
=> {
FnSig {
inputs_and_output: ::rustc_type_ir::TypeFoldable::fold_with(__binding_0,
__folder),
fn_sig_kind: __binding_1,
}
}
}
}
}
};TypeFoldable_Generic, const _: () =
{
impl<I: Interner, J> ::rustc_type_ir::lift::Lift<J> for FnSig<I> where
I: Interner, J: Interner,
I::Tys: ::rustc_type_ir::lift::Lift<J, Lifted = J::Tys>,
FnSigKind<I>: ::rustc_type_ir::lift::Lift<J, Lifted =
FnSigKind<J>> {
type Lifted = FnSig<J>;
fn lift_to_interner(self, interner: J) -> Self::Lifted {
match self {
FnSig {
inputs_and_output: __binding_0, fn_sig_kind: __binding_1 }
=> {
FnSig {
inputs_and_output: __binding_0.lift_to_interner(interner),
fn_sig_kind: __binding_1.lift_to_interner(interner),
}
}
}
}
}
};Lift_Generic)]
899pub struct FnSig<I: Interner> {
900 pub inputs_and_output: I::Tys,
901 #[type_visitable(ignore)]
902 #[type_foldable(identity)]
903 pub fn_sig_kind: FnSigKind<I>,
904}
905
906impl<I: Interner> Eq for FnSig<I> {}
907
908impl<I: Interner> FnSig<I> {
909 pub fn inputs(self) -> I::FnInputTys {
910 self.inputs_and_output.inputs()
911 }
912
913 pub fn output(self) -> I::Ty {
914 self.inputs_and_output.output()
915 }
916
917 pub fn is_fn_trait_compatible(self) -> bool {
918 !self.c_variadic() && self.safety().is_safe() && self.abi() == ExternAbi::Rust
919 }
920
921 pub fn set_safety(self, safety: I::Safety) -> Self {
922 Self { fn_sig_kind: FnSigKind::new(self.abi(), safety, self.c_variadic()), ..self }
923 }
924
925 pub fn safety(self) -> I::Safety {
926 self.fn_sig_kind.safety()
927 }
928
929 pub fn abi(self) -> ExternAbi {
930 self.fn_sig_kind.abi()
931 }
932
933 pub fn c_variadic(self) -> bool {
934 self.fn_sig_kind.c_variadic()
935 }
936
937 pub fn dummy() -> Self {
938 Self {
939 inputs_and_output: Default::default(),
940 fn_sig_kind: FnSigKind::new(ExternAbi::Rust, I::Safety::safe(), false),
941 }
942 }
943}
944
945impl<I: Interner> ty::Binder<I, FnSig<I>> {
946 #[inline]
947 pub fn inputs(self) -> ty::Binder<I, I::FnInputTys> {
948 self.map_bound(|fn_sig| fn_sig.inputs())
949 }
950
951 #[inline]
952 #[track_caller]
953 pub fn input(self, index: usize) -> ty::Binder<I, I::Ty> {
954 self.map_bound(|fn_sig| fn_sig.inputs().get(index).unwrap())
955 }
956
957 pub fn inputs_and_output(self) -> ty::Binder<I, I::Tys> {
958 self.map_bound(|fn_sig| fn_sig.inputs_and_output)
959 }
960
961 #[inline]
962 pub fn output(self) -> ty::Binder<I, I::Ty> {
963 self.map_bound(|fn_sig| fn_sig.output())
964 }
965
966 pub fn fn_sig_kind(self) -> FnSigKind<I> {
967 self.skip_binder().fn_sig_kind
968 }
969
970 pub fn c_variadic(self) -> bool {
971 self.skip_binder().c_variadic()
972 }
973
974 pub fn safety(self) -> I::Safety {
975 self.skip_binder().safety()
976 }
977
978 pub fn abi(self) -> ExternAbi {
979 self.skip_binder().abi()
980 }
981
982 pub fn is_fn_trait_compatible(&self) -> bool {
983 self.skip_binder().is_fn_trait_compatible()
984 }
985
986 pub fn split(self) -> (ty::Binder<I, FnSigTys<I>>, FnHeader<I>) {
988 let hdr = FnHeader { fn_sig_kind: self.fn_sig_kind() };
989 (self.map_bound(|sig| FnSigTys { inputs_and_output: sig.inputs_and_output }), hdr)
990 }
991}
992
993impl<I: Interner> fmt::Debug for FnSig<I> {
994 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
995 let sig = self;
996 let FnSig { inputs_and_output: _, fn_sig_kind } = sig;
997
998 f.write_fmt(format_args!("{0}", fn_sig_kind.safety().prefix_str()))write!(f, "{}", fn_sig_kind.safety().prefix_str())?;
999 if fn_sig_kind.abi() != ExternAbi::Rust {
1000 f.write_fmt(format_args!("extern \"{0:?}\" ", fn_sig_kind.abi()))write!(f, "extern \"{:?}\" ", fn_sig_kind.abi())?;
1001 }
1002
1003 f.write_fmt(format_args!("fn("))write!(f, "fn(")?;
1004 let inputs = sig.inputs();
1005 for (i, ty) in inputs.iter().enumerate() {
1006 if i > 0 {
1007 f.write_fmt(format_args!(", "))write!(f, ", ")?;
1008 }
1009 f.write_fmt(format_args!("{0:?}", ty))write!(f, "{ty:?}")?;
1010 }
1011 if fn_sig_kind.c_variadic() {
1012 if inputs.is_empty() {
1013 f.write_fmt(format_args!("..."))write!(f, "...")?;
1014 } else {
1015 f.write_fmt(format_args!(", ..."))write!(f, ", ...")?;
1016 }
1017 }
1018 f.write_fmt(format_args!(")"))write!(f, ")")?;
1019
1020 let output = sig.output();
1021 match output.kind() {
1022 Tuple(list) if list.is_empty() => Ok(()),
1023 _ => f.write_fmt(format_args!(" -> {0:?}", sig.output()))write!(f, " -> {:?}", sig.output()),
1024 }
1025 }
1026}
1027
1028#[automatically_derived]
impl<I: Interner> ::core::hash::Hash for UnsafeBinderInner<I> where
I: Interner {
fn hash<__H: ::core::hash::Hasher>(&self, __state: &mut __H) {
match self {
UnsafeBinderInner(ref __field_0) => {
::core::hash::Hash::hash(__field_0, __state);
}
}
}
}#[derive_where(Clone, Copy, PartialEq, Hash; I: Interner)]
1031#[cfg_attr(feature = "nightly", derive(const _: () =
{
impl<I: Interner> ::rustc_data_structures::stable_hasher::StableHash
for UnsafeBinderInner<I> where
ty::Binder<I,
I::Ty>: ::rustc_data_structures::stable_hasher::StableHash {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hasher::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hasher::StableHasher) {
match *self {
UnsafeBinderInner(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash_NoContext))]
1032#[derive(const _: () =
{
impl<I: Interner> ::rustc_type_ir::TypeVisitable<I> for
UnsafeBinderInner<I> where I: Interner,
ty::Binder<I, I::Ty>: ::rustc_type_ir::TypeVisitable<I> {
fn visit_with<__V: ::rustc_type_ir::TypeVisitor<I>>(&self,
__visitor: &mut __V) -> __V::Result {
match *self {
UnsafeBinderInner(ref __binding_0) => {
{
match ::rustc_type_ir::VisitorResult::branch(::rustc_type_ir::TypeVisitable::visit_with(__binding_0,
__visitor)) {
::core::ops::ControlFlow::Continue(()) => {}
::core::ops::ControlFlow::Break(r) => {
return ::rustc_type_ir::VisitorResult::from_residual(r);
}
}
}
}
}
<__V::Result as ::rustc_type_ir::VisitorResult>::output()
}
}
};TypeVisitable_Generic, GenericTypeVisitable, const _: () =
{
impl<I: Interner> ::rustc_type_ir::TypeFoldable<I> for
UnsafeBinderInner<I> where I: Interner,
ty::Binder<I, I::Ty>: ::rustc_type_ir::TypeFoldable<I> {
fn try_fold_with<__F: ::rustc_type_ir::FallibleTypeFolder<I>>(self,
__folder: &mut __F) -> Result<Self, __F::Error> {
Ok(match self {
UnsafeBinderInner(__binding_0) => {
UnsafeBinderInner(::rustc_type_ir::TypeFoldable::try_fold_with(__binding_0,
__folder)?)
}
})
}
fn fold_with<__F: ::rustc_type_ir::TypeFolder<I>>(self,
__folder: &mut __F) -> Self {
match self {
UnsafeBinderInner(__binding_0) => {
UnsafeBinderInner(::rustc_type_ir::TypeFoldable::fold_with(__binding_0,
__folder))
}
}
}
}
};TypeFoldable_Generic, const _: () =
{
impl<I: Interner, J> ::rustc_type_ir::lift::Lift<J> for
UnsafeBinderInner<I> where I: Interner, J: Interner,
ty::Binder<I,
I::Ty>: ::rustc_type_ir::lift::Lift<J, Lifted =
ty::Binder<J, J::Ty>> {
type Lifted = UnsafeBinderInner<J>;
fn lift_to_interner(self, interner: J) -> Self::Lifted {
match self {
UnsafeBinderInner(__binding_0) => {
UnsafeBinderInner(__binding_0.lift_to_interner(interner))
}
}
}
}
};Lift_Generic)]
1033pub struct UnsafeBinderInner<I: Interner>(ty::Binder<I, I::Ty>);
1034
1035impl<I: Interner> Eq for UnsafeBinderInner<I> {}
1036
1037impl<I: Interner> From<ty::Binder<I, I::Ty>> for UnsafeBinderInner<I> {
1038 fn from(value: ty::Binder<I, I::Ty>) -> Self {
1039 UnsafeBinderInner(value)
1040 }
1041}
1042
1043impl<I: Interner> From<UnsafeBinderInner<I>> for ty::Binder<I, I::Ty> {
1044 fn from(value: UnsafeBinderInner<I>) -> Self {
1045 value.0
1046 }
1047}
1048
1049impl<I: Interner> fmt::Debug for UnsafeBinderInner<I> {
1050 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1051 self.0.fmt(f)
1052 }
1053}
1054
1055impl<I: Interner> Deref for UnsafeBinderInner<I> {
1056 type Target = ty::Binder<I, I::Ty>;
1057
1058 fn deref(&self) -> &Self::Target {
1059 &self.0
1060 }
1061}
1062
1063#[cfg(feature = "nightly")]
1064impl<I: Interner, E: rustc_serialize::Encoder> rustc_serialize::Encodable<E>
1065 for UnsafeBinderInner<I>
1066where
1067 I::Ty: rustc_serialize::Encodable<E>,
1068 I::BoundVarKinds: rustc_serialize::Encodable<E>,
1069{
1070 fn encode(&self, e: &mut E) {
1071 self.bound_vars().encode(e);
1072 self.as_ref().skip_binder().encode(e);
1073 }
1074}
1075
1076#[cfg(feature = "nightly")]
1077impl<I: Interner, D: rustc_serialize::Decoder> rustc_serialize::Decodable<D>
1078 for UnsafeBinderInner<I>
1079where
1080 I::Ty: TypeVisitable<I> + rustc_serialize::Decodable<D>,
1081 I::BoundVarKinds: rustc_serialize::Decodable<D>,
1082{
1083 fn decode(decoder: &mut D) -> Self {
1084 let bound_vars = rustc_serialize::Decodable::decode(decoder);
1085 UnsafeBinderInner(ty::Binder::bind_with_vars(
1086 rustc_serialize::Decodable::decode(decoder),
1087 bound_vars,
1088 ))
1089 }
1090}
1091
1092#[automatically_derived]
impl<I: Interner> ::core::hash::Hash for FnSigTys<I> where I: Interner {
fn hash<__H: ::core::hash::Hasher>(&self, __state: &mut __H) {
match self {
FnSigTys { inputs_and_output: ref __field_inputs_and_output } => {
::core::hash::Hash::hash(__field_inputs_and_output, __state);
}
}
}
}#[derive_where(Clone, Copy, Debug, PartialEq, Hash; I: Interner)]
1094#[cfg_attr(
1095 feature = "nightly",
1096 derive(const _: () =
{
impl<I: Interner, __E: ::rustc_serialize::Encoder>
::rustc_serialize::Encodable<__E> for FnSigTys<I> where
I::Tys: ::rustc_serialize::Encodable<__E> {
fn encode(&self, __encoder: &mut __E) {
match *self {
FnSigTys { inputs_and_output: ref __binding_0 } => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
}
}
}
};Encodable_NoContext, const _: () =
{
impl<I: Interner, __D: ::rustc_serialize::Decoder>
::rustc_serialize::Decodable<__D> for FnSigTys<I> where
I::Tys: ::rustc_serialize::Decodable<__D> {
fn decode(__decoder: &mut __D) -> Self {
FnSigTys {
inputs_and_output: ::rustc_serialize::Decodable::decode(__decoder),
}
}
}
};Decodable_NoContext, const _: () =
{
impl<I: Interner> ::rustc_data_structures::stable_hasher::StableHash
for FnSigTys<I> where
I::Tys: ::rustc_data_structures::stable_hasher::StableHash {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hasher::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hasher::StableHasher) {
match *self {
FnSigTys { inputs_and_output: ref __binding_0 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash_NoContext)
1097)]
1098#[derive(const _: () =
{
impl<I: Interner> ::rustc_type_ir::TypeVisitable<I> for FnSigTys<I>
where I: Interner, I::Tys: ::rustc_type_ir::TypeVisitable<I> {
fn visit_with<__V: ::rustc_type_ir::TypeVisitor<I>>(&self,
__visitor: &mut __V) -> __V::Result {
match *self {
FnSigTys { inputs_and_output: ref __binding_0 } => {
{
match ::rustc_type_ir::VisitorResult::branch(::rustc_type_ir::TypeVisitable::visit_with(__binding_0,
__visitor)) {
::core::ops::ControlFlow::Continue(()) => {}
::core::ops::ControlFlow::Break(r) => {
return ::rustc_type_ir::VisitorResult::from_residual(r);
}
}
}
}
}
<__V::Result as ::rustc_type_ir::VisitorResult>::output()
}
}
};TypeVisitable_Generic, GenericTypeVisitable, const _: () =
{
impl<I: Interner> ::rustc_type_ir::TypeFoldable<I> for FnSigTys<I>
where I: Interner, I::Tys: ::rustc_type_ir::TypeFoldable<I> {
fn try_fold_with<__F: ::rustc_type_ir::FallibleTypeFolder<I>>(self,
__folder: &mut __F) -> Result<Self, __F::Error> {
Ok(match self {
FnSigTys { inputs_and_output: __binding_0 } => {
FnSigTys {
inputs_and_output: ::rustc_type_ir::TypeFoldable::try_fold_with(__binding_0,
__folder)?,
}
}
})
}
fn fold_with<__F: ::rustc_type_ir::TypeFolder<I>>(self,
__folder: &mut __F) -> Self {
match self {
FnSigTys { inputs_and_output: __binding_0 } => {
FnSigTys {
inputs_and_output: ::rustc_type_ir::TypeFoldable::fold_with(__binding_0,
__folder),
}
}
}
}
}
};TypeFoldable_Generic, const _: () =
{
impl<I: Interner, J> ::rustc_type_ir::lift::Lift<J> for FnSigTys<I>
where I: Interner, J: Interner,
I::Tys: ::rustc_type_ir::lift::Lift<J, Lifted = J::Tys> {
type Lifted = FnSigTys<J>;
fn lift_to_interner(self, interner: J) -> Self::Lifted {
match self {
FnSigTys { inputs_and_output: __binding_0 } => {
FnSigTys {
inputs_and_output: __binding_0.lift_to_interner(interner),
}
}
}
}
}
};Lift_Generic)]
1099pub struct FnSigTys<I: Interner> {
1100 pub inputs_and_output: I::Tys,
1101}
1102
1103impl<I: Interner> Eq for FnSigTys<I> {}
1104
1105impl<I: Interner> FnSigTys<I> {
1106 pub fn inputs(self) -> I::FnInputTys {
1107 self.inputs_and_output.inputs()
1108 }
1109
1110 pub fn output(self) -> I::Ty {
1111 self.inputs_and_output.output()
1112 }
1113}
1114
1115impl<I: Interner> ty::Binder<I, FnSigTys<I>> {
1116 pub fn with(self, hdr: FnHeader<I>) -> ty::Binder<I, FnSig<I>> {
1118 self.map_bound(|sig_tys| FnSig {
1119 inputs_and_output: sig_tys.inputs_and_output,
1120 fn_sig_kind: hdr.fn_sig_kind,
1121 })
1122 }
1123
1124 #[inline]
1125 pub fn inputs(self) -> ty::Binder<I, I::FnInputTys> {
1126 self.map_bound(|sig_tys| sig_tys.inputs())
1127 }
1128
1129 #[inline]
1130 #[track_caller]
1131 pub fn input(self, index: usize) -> ty::Binder<I, I::Ty> {
1132 self.map_bound(|sig_tys| sig_tys.inputs().get(index).unwrap())
1133 }
1134
1135 pub fn inputs_and_output(self) -> ty::Binder<I, I::Tys> {
1136 self.map_bound(|sig_tys| sig_tys.inputs_and_output)
1137 }
1138
1139 #[inline]
1140 pub fn output(self) -> ty::Binder<I, I::Ty> {
1141 self.map_bound(|sig_tys| sig_tys.output())
1142 }
1143}
1144
1145#[automatically_derived]
impl<I: Interner> ::core::hash::Hash for FnHeader<I> where I: Interner {
fn hash<__H: ::core::hash::Hasher>(&self, __state: &mut __H) {
match self {
FnHeader { fn_sig_kind: ref __field_fn_sig_kind } => {
::core::hash::Hash::hash(__field_fn_sig_kind, __state);
}
}
}
}#[derive_where(Clone, Copy, Debug, PartialEq, Hash; I: Interner)]
1146#[cfg_attr(
1147 feature = "nightly",
1148 derive(const _: () =
{
impl<I: Interner, __E: ::rustc_serialize::Encoder>
::rustc_serialize::Encodable<__E> for FnHeader<I> where
FnSigKind<I>: ::rustc_serialize::Encodable<__E> {
fn encode(&self, __encoder: &mut __E) {
match *self {
FnHeader { fn_sig_kind: ref __binding_0 } => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
}
}
}
};Encodable_NoContext, const _: () =
{
impl<I: Interner, __D: ::rustc_serialize::Decoder>
::rustc_serialize::Decodable<__D> for FnHeader<I> where
FnSigKind<I>: ::rustc_serialize::Decodable<__D> {
fn decode(__decoder: &mut __D) -> Self {
FnHeader {
fn_sig_kind: ::rustc_serialize::Decodable::decode(__decoder),
}
}
}
};Decodable_NoContext, const _: () =
{
impl<I: Interner> ::rustc_data_structures::stable_hasher::StableHash
for FnHeader<I> where
FnSigKind<I>: ::rustc_data_structures::stable_hasher::StableHash {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hasher::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hasher::StableHasher) {
match *self {
FnHeader { fn_sig_kind: ref __binding_0 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash_NoContext)
1149)]
1150#[derive(const _: () =
{
impl<I: Interner> ::rustc_type_ir::TypeVisitable<I> for FnHeader<I>
where I: Interner {
fn visit_with<__V: ::rustc_type_ir::TypeVisitor<I>>(&self,
__visitor: &mut __V) -> __V::Result {
match *self { FnHeader { .. } => {} }
<__V::Result as ::rustc_type_ir::VisitorResult>::output()
}
}
};TypeVisitable_Generic, GenericTypeVisitable, const _: () =
{
impl<I: Interner> ::rustc_type_ir::TypeFoldable<I> for FnHeader<I>
where I: Interner {
fn try_fold_with<__F: ::rustc_type_ir::FallibleTypeFolder<I>>(self,
__folder: &mut __F) -> Result<Self, __F::Error> {
Ok(match self {
FnHeader { fn_sig_kind: __binding_0 } => {
FnHeader { fn_sig_kind: __binding_0 }
}
})
}
fn fold_with<__F: ::rustc_type_ir::TypeFolder<I>>(self,
__folder: &mut __F) -> Self {
match self {
FnHeader { fn_sig_kind: __binding_0 } => {
FnHeader { fn_sig_kind: __binding_0 }
}
}
}
}
};TypeFoldable_Generic, const _: () =
{
impl<I: Interner, J> ::rustc_type_ir::lift::Lift<J> for FnHeader<I>
where I: Interner, J: Interner,
FnSigKind<I>: ::rustc_type_ir::lift::Lift<J, Lifted =
FnSigKind<J>> {
type Lifted = FnHeader<J>;
fn lift_to_interner(self, interner: J) -> Self::Lifted {
match self {
FnHeader { fn_sig_kind: __binding_0 } => {
FnHeader {
fn_sig_kind: __binding_0.lift_to_interner(interner),
}
}
}
}
}
};Lift_Generic)]
1151pub struct FnHeader<I: Interner> {
1152 #[type_visitable(ignore)]
1153 #[type_foldable(identity)]
1154 pub fn_sig_kind: FnSigKind<I>,
1155}
1156
1157impl<I: Interner> FnHeader<I> {
1158 pub fn c_variadic(self) -> bool {
1159 self.fn_sig_kind.c_variadic()
1160 }
1161
1162 pub fn safety(self) -> I::Safety {
1163 self.fn_sig_kind.safety()
1164 }
1165
1166 pub fn abi(self) -> ExternAbi {
1167 self.fn_sig_kind.abi()
1168 }
1169
1170 pub fn dummy() -> Self {
1171 Self { fn_sig_kind: FnSigKind::new(ExternAbi::Rust, I::Safety::safe(), false) }
1172 }
1173}
1174
1175impl<I: Interner> Eq for FnHeader<I> {}
1176
1177#[automatically_derived]
impl<I: Interner> ::core::hash::Hash for CoroutineWitnessTypes<I> where
I: Interner {
fn hash<__H: ::core::hash::Hasher>(&self, __state: &mut __H) {
match self {
CoroutineWitnessTypes {
types: ref __field_types, assumptions: ref __field_assumptions
} => {
::core::hash::Hash::hash(__field_types, __state);
::core::hash::Hash::hash(__field_assumptions, __state);
}
}
}
}#[derive_where(Clone, Copy, Debug, PartialEq, Hash; I: Interner)]
1178#[cfg_attr(
1179 feature = "nightly",
1180 derive(const _: () =
{
impl<I: Interner, __E: ::rustc_serialize::Encoder>
::rustc_serialize::Encodable<__E> for CoroutineWitnessTypes<I>
where I::Tys: ::rustc_serialize::Encodable<__E>,
I::RegionAssumptions: ::rustc_serialize::Encodable<__E> {
fn encode(&self, __encoder: &mut __E) {
match *self {
CoroutineWitnessTypes {
types: ref __binding_0, assumptions: ref __binding_1 } => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_1,
__encoder);
}
}
}
}
};Encodable_NoContext, const _: () =
{
impl<I: Interner, __D: ::rustc_serialize::Decoder>
::rustc_serialize::Decodable<__D> for CoroutineWitnessTypes<I>
where I::Tys: ::rustc_serialize::Decodable<__D>,
I::RegionAssumptions: ::rustc_serialize::Decodable<__D> {
fn decode(__decoder: &mut __D) -> Self {
CoroutineWitnessTypes {
types: ::rustc_serialize::Decodable::decode(__decoder),
assumptions: ::rustc_serialize::Decodable::decode(__decoder),
}
}
}
};Decodable_NoContext, const _: () =
{
impl<I: Interner> ::rustc_data_structures::stable_hasher::StableHash
for CoroutineWitnessTypes<I> where
I::Tys: ::rustc_data_structures::stable_hasher::StableHash,
I::RegionAssumptions: ::rustc_data_structures::stable_hasher::StableHash
{
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hasher::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hasher::StableHasher) {
match *self {
CoroutineWitnessTypes {
types: ref __binding_0, assumptions: ref __binding_1 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash_NoContext)
1181)]
1182#[derive(const _: () =
{
impl<I: Interner> ::rustc_type_ir::TypeVisitable<I> for
CoroutineWitnessTypes<I> where I: Interner,
I::Tys: ::rustc_type_ir::TypeVisitable<I>,
I::RegionAssumptions: ::rustc_type_ir::TypeVisitable<I> {
fn visit_with<__V: ::rustc_type_ir::TypeVisitor<I>>(&self,
__visitor: &mut __V) -> __V::Result {
match *self {
CoroutineWitnessTypes {
types: ref __binding_0, assumptions: ref __binding_1 } => {
{
match ::rustc_type_ir::VisitorResult::branch(::rustc_type_ir::TypeVisitable::visit_with(__binding_0,
__visitor)) {
::core::ops::ControlFlow::Continue(()) => {}
::core::ops::ControlFlow::Break(r) => {
return ::rustc_type_ir::VisitorResult::from_residual(r);
}
}
}
{
match ::rustc_type_ir::VisitorResult::branch(::rustc_type_ir::TypeVisitable::visit_with(__binding_1,
__visitor)) {
::core::ops::ControlFlow::Continue(()) => {}
::core::ops::ControlFlow::Break(r) => {
return ::rustc_type_ir::VisitorResult::from_residual(r);
}
}
}
}
}
<__V::Result as ::rustc_type_ir::VisitorResult>::output()
}
}
};TypeVisitable_Generic, GenericTypeVisitable, const _: () =
{
impl<I: Interner> ::rustc_type_ir::TypeFoldable<I> for
CoroutineWitnessTypes<I> where I: Interner,
I::Tys: ::rustc_type_ir::TypeFoldable<I>,
I::RegionAssumptions: ::rustc_type_ir::TypeFoldable<I> {
fn try_fold_with<__F: ::rustc_type_ir::FallibleTypeFolder<I>>(self,
__folder: &mut __F) -> Result<Self, __F::Error> {
Ok(match self {
CoroutineWitnessTypes {
types: __binding_0, assumptions: __binding_1 } => {
CoroutineWitnessTypes {
types: ::rustc_type_ir::TypeFoldable::try_fold_with(__binding_0,
__folder)?,
assumptions: ::rustc_type_ir::TypeFoldable::try_fold_with(__binding_1,
__folder)?,
}
}
})
}
fn fold_with<__F: ::rustc_type_ir::TypeFolder<I>>(self,
__folder: &mut __F) -> Self {
match self {
CoroutineWitnessTypes {
types: __binding_0, assumptions: __binding_1 } => {
CoroutineWitnessTypes {
types: ::rustc_type_ir::TypeFoldable::fold_with(__binding_0,
__folder),
assumptions: ::rustc_type_ir::TypeFoldable::fold_with(__binding_1,
__folder),
}
}
}
}
}
};TypeFoldable_Generic, const _: () =
{
impl<I: Interner, J> ::rustc_type_ir::lift::Lift<J> for
CoroutineWitnessTypes<I> where I: Interner, J: Interner,
I::Tys: ::rustc_type_ir::lift::Lift<J, Lifted = J::Tys>,
I::RegionAssumptions: ::rustc_type_ir::lift::Lift<J, Lifted =
J::RegionAssumptions> {
type Lifted = CoroutineWitnessTypes<J>;
fn lift_to_interner(self, interner: J) -> Self::Lifted {
match self {
CoroutineWitnessTypes {
types: __binding_0, assumptions: __binding_1 } => {
CoroutineWitnessTypes {
types: __binding_0.lift_to_interner(interner),
assumptions: __binding_1.lift_to_interner(interner),
}
}
}
}
}
};Lift_Generic)]
1183pub struct CoroutineWitnessTypes<I: Interner> {
1184 pub types: I::Tys,
1185 pub assumptions: I::RegionAssumptions,
1186}
1187
1188impl<I: Interner> Eq for CoroutineWitnessTypes<I> {}