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_hash::{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::*;
20use crate::ty::AliasTy;
21#[cfg(feature = "nightly")]
22use crate::visit::TypeVisitable;
23use crate::{
24 self as ty, BoundVarIndexKind, FloatTy, FreeAliasTy, InherentAliasTy, IntTy, Interner,
25 OpaqueAliasTy, ProjectionAliasTy, UintTy, Unnormalized,
26};
27
28mod closure;
29
30#[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, Eq, Debug; I: Interner)]
31#[derive(const _: () =
{
impl<I: Interner> ::rustc_type_ir::TypeVisitable<I> for AliasTyKind<I>
where I: Interner,
I::TraitAssocTyId: ::rustc_type_ir::TypeVisitable<I>,
I::InherentAssocTyId: ::rustc_type_ir::TypeVisitable<I>,
I::OpaqueTyId: ::rustc_type_ir::TypeVisitable<I>,
I::FreeTyAliasId: ::rustc_type_ir::TypeVisitable<I> {
fn visit_with<__V: ::rustc_type_ir::TypeVisitor<I>>(&self,
__visitor: &mut __V) -> __V::Result {
match *self {
AliasTyKind::Projection { def_id: 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);
}
}
}
}
AliasTyKind::Inherent { def_id: 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);
}
}
}
}
AliasTyKind::Opaque { def_id: 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);
}
}
}
}
AliasTyKind::Free { def_id: 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 AliasTyKind<I>
where I: Interner,
I::TraitAssocTyId: ::rustc_type_ir::TypeFoldable<I>,
I::InherentAssocTyId: ::rustc_type_ir::TypeFoldable<I>,
I::OpaqueTyId: ::rustc_type_ir::TypeFoldable<I>,
I::FreeTyAliasId: ::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 {
AliasTyKind::Projection { def_id: __binding_0 } => {
AliasTyKind::Projection {
def_id: ::rustc_type_ir::TypeFoldable::try_fold_with(__binding_0,
__folder)?,
}
}
AliasTyKind::Inherent { def_id: __binding_0 } => {
AliasTyKind::Inherent {
def_id: ::rustc_type_ir::TypeFoldable::try_fold_with(__binding_0,
__folder)?,
}
}
AliasTyKind::Opaque { def_id: __binding_0 } => {
AliasTyKind::Opaque {
def_id: ::rustc_type_ir::TypeFoldable::try_fold_with(__binding_0,
__folder)?,
}
}
AliasTyKind::Free { def_id: __binding_0 } => {
AliasTyKind::Free {
def_id: ::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 {
AliasTyKind::Projection { def_id: __binding_0 } => {
AliasTyKind::Projection {
def_id: ::rustc_type_ir::TypeFoldable::fold_with(__binding_0,
__folder),
}
}
AliasTyKind::Inherent { def_id: __binding_0 } => {
AliasTyKind::Inherent {
def_id: ::rustc_type_ir::TypeFoldable::fold_with(__binding_0,
__folder),
}
}
AliasTyKind::Opaque { def_id: __binding_0 } => {
AliasTyKind::Opaque {
def_id: ::rustc_type_ir::TypeFoldable::fold_with(__binding_0,
__folder),
}
}
AliasTyKind::Free { def_id: __binding_0 } => {
AliasTyKind::Free {
def_id: ::rustc_type_ir::TypeFoldable::fold_with(__binding_0,
__folder),
}
}
}
}
}
};TypeFoldable_Generic, const _: () =
{
impl<I: Interner, J> ::rustc_type_ir::lift::Lift<J> for AliasTyKind<I>
where J: Interner, I: ::rustc_type_ir::LiftInto<J> {
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)]
32#[cfg_attr(
33 feature = "nightly",
34 derive(const _: () =
{
impl<I: Interner, __E: ::rustc_serialize::Encoder>
::rustc_serialize::Encodable<__E> for AliasTyKind<I> where
I::TraitAssocTyId: ::rustc_serialize::Encodable<__E>,
I::InherentAssocTyId: ::rustc_serialize::Encodable<__E>,
I::OpaqueTyId: ::rustc_serialize::Encodable<__E>,
I::FreeTyAliasId: ::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::TraitAssocTyId: ::rustc_serialize::Decodable<__D>,
I::InherentAssocTyId: ::rustc_serialize::Decodable<__D>,
I::OpaqueTyId: ::rustc_serialize::Decodable<__D>,
I::FreeTyAliasId: ::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_hash::StableHash for
AliasTyKind<I> where
I::TraitAssocTyId: ::rustc_data_structures::stable_hash::StableHash,
I::InherentAssocTyId: ::rustc_data_structures::stable_hash::StableHash,
I::OpaqueTyId: ::rustc_data_structures::stable_hash::StableHash,
I::FreeTyAliasId: ::rustc_data_structures::stable_hash::StableHash
{
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::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)
35)]
36pub enum AliasTyKind<I: Interner> {
37 Projection { def_id: I::TraitAssocTyId },
47
48 Inherent { def_id: I::InherentAssocTyId },
52
53 Opaque { def_id: I::OpaqueTyId },
63
64 Free { def_id: I::FreeTyAliasId },
69}
70
71impl<I: Interner> AliasTyKind<I> {
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 try_to_projection(self) -> Option<I::TraitAssocTyId> {
82 match self {
83 AliasTyKind::Projection { def_id } => Some(def_id),
84 _ => None,
85 }
86 }
87
88 pub fn try_to_inherent(self) -> Option<I::InherentAssocTyId> {
89 match self {
90 AliasTyKind::Inherent { def_id } => Some(def_id),
91 _ => None,
92 }
93 }
94
95 pub fn try_to_opaque(self) -> Option<I::OpaqueTyId> {
96 match self {
97 AliasTyKind::Opaque { def_id } => Some(def_id),
98 _ => None,
99 }
100 }
101
102 pub fn try_to_free(self) -> Option<I::FreeTyAliasId> {
103 match self {
104 AliasTyKind::Free { def_id } => Some(def_id),
105 _ => None,
106 }
107 }
108}
109
110#[derive(#[automatically_derived]
impl ::core::fmt::Debug for IsRigid {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self { IsRigid::Yes => "Yes", IsRigid::No => "No", })
}
}Debug, #[automatically_derived]
impl ::core::clone::Clone for IsRigid {
#[inline]
fn clone(&self) -> IsRigid { *self }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for IsRigid { }Copy, #[automatically_derived]
impl ::core::hash::Hash for IsRigid {
#[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)
}
}Hash, #[automatically_derived]
impl ::core::cmp::PartialEq for IsRigid {
#[inline]
fn eq(&self, other: &IsRigid) -> bool {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
__self_discr == __arg1_discr
}
}PartialEq)]
122#[derive(const _: () =
{
impl<I> ::rustc_type_ir::TypeVisitable<I> for IsRigid where
I: Interner {
fn visit_with<__V: ::rustc_type_ir::TypeVisitor<I>>(&self,
__visitor: &mut __V) -> __V::Result {
match *self { IsRigid::Yes => {} IsRigid::No => {} }
<__V::Result as ::rustc_type_ir::VisitorResult>::output()
}
}
};TypeVisitable_Generic, GenericTypeVisitable, const _: () =
{
impl<I> ::rustc_type_ir::TypeFoldable<I> for IsRigid where I: Interner
{
fn try_fold_with<__F: ::rustc_type_ir::FallibleTypeFolder<I>>(self,
__folder: &mut __F) -> Result<Self, __F::Error> {
Ok(match self {
IsRigid::Yes => { IsRigid::Yes }
IsRigid::No => { IsRigid::No }
})
}
fn fold_with<__F: ::rustc_type_ir::TypeFolder<I>>(self,
__folder: &mut __F) -> Self {
match self {
IsRigid::Yes => { IsRigid::Yes }
IsRigid::No => { IsRigid::No }
}
}
}
};TypeFoldable_Generic)]
123#[cfg_attr(
124 feature = "nightly",
125 derive(const _: () =
{
impl<__D: ::rustc_serialize::Decoder>
::rustc_serialize::Decodable<__D> for IsRigid {
fn decode(__decoder: &mut __D) -> Self {
match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
{
0usize => { IsRigid::Yes }
1usize => { IsRigid::No }
n => {
::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `IsRigid`, expected 0..2, actual {0}",
n));
}
}
}
}
};Decodable_NoContext, const _: () =
{
impl<__E: ::rustc_serialize::Encoder>
::rustc_serialize::Encodable<__E> for IsRigid {
fn encode(&self, __encoder: &mut __E) {
let disc =
match *self {
IsRigid::Yes => { 0usize }
IsRigid::No => { 1usize }
};
::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
match *self { IsRigid::Yes => {} IsRigid::No => {} }
}
}
};Encodable_NoContext, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for IsRigid {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
match *self { IsRigid::Yes => {} IsRigid::No => {} }
}
}
};StableHash_NoContext)
126)]
127pub enum IsRigid {
128 Yes,
129 No,
130}
131
132impl IsRigid {
133 pub fn yes_if_next_solver<I: Interner>(interner: I) -> IsRigid {
134 if interner.next_trait_solver_globally() { IsRigid::Yes } else { IsRigid::No }
135 }
136}
137
138#[cfg_attr(feature = "nightly", rustc_diagnostic_item = "IrTyKind")]
143#[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, ref __field_1),
TyKind::Alias(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::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)]
144#[derive(GenericTypeVisitable)]
145#[cfg_attr(
146 feature = "nightly",
147 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, I::GenericArgs>: ::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, ref __binding_1) => {
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, ref __binding_1) => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_1,
__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, I::GenericArgs>: ::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),
::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_hash::StableHash for
TyKind<I> where
I::AdtDef: ::rustc_data_structures::stable_hash::StableHash,
I::GenericArgs: ::rustc_data_structures::stable_hash::StableHash,
I::ForeignId: ::rustc_data_structures::stable_hash::StableHash,
I::Ty: ::rustc_data_structures::stable_hash::StableHash,
I::Const: ::rustc_data_structures::stable_hash::StableHash,
I::Pat: ::rustc_data_structures::stable_hash::StableHash,
I::Region: ::rustc_data_structures::stable_hash::StableHash,
I::FunctionId: ::rustc_data_structures::stable_hash::StableHash,
ty::Binder<I,
I::GenericArgs>: ::rustc_data_structures::stable_hash::StableHash,
ty::Binder<I,
FnSigTys<I>>: ::rustc_data_structures::stable_hash::StableHash,
FnHeader<I>: ::rustc_data_structures::stable_hash::StableHash,
UnsafeBinderInner<I>: ::rustc_data_structures::stable_hash::StableHash,
I::BoundExistentialPredicates: ::rustc_data_structures::stable_hash::StableHash,
I::ClosureId: ::rustc_data_structures::stable_hash::StableHash,
I::CoroutineClosureId: ::rustc_data_structures::stable_hash::StableHash,
I::CoroutineId: ::rustc_data_structures::stable_hash::StableHash,
I::Tys: ::rustc_data_structures::stable_hash::StableHash,
AliasTy<I>: ::rustc_data_structures::stable_hash::StableHash,
I::ParamTy: ::rustc_data_structures::stable_hash::StableHash,
ty::BoundTy<I>: ::rustc_data_structures::stable_hash::StableHash,
ty::PlaceholderType<I>: ::rustc_data_structures::stable_hash::StableHash,
I::ErrorGuaranteed: ::rustc_data_structures::stable_hash::StableHash
{
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::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, ref __binding_1) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.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)
148)]
149pub enum TyKind<I: Interner> {
150 Bool,
152
153 Char,
156
157 Int(IntTy),
159
160 Uint(UintTy),
162
163 Float(FloatTy),
165
166 Adt(I::AdtDef, I::GenericArgs),
174
175 Foreign(I::ForeignId),
177
178 Str,
180
181 Array(I::Ty, I::Const),
183
184 Pat(I::Ty, I::Pat),
192
193 Slice(I::Ty),
195
196 RawPtr(I::Ty, Mutability),
198
199 Ref(I::Region, I::Ty, Mutability),
202
203 FnDef(I::FunctionId, ty::Binder<I, I::GenericArgs>),
216
217 FnPtr(ty::Binder<I, FnSigTys<I>>, FnHeader<I>),
236
237 UnsafeBinder(UnsafeBinderInner<I>),
243
244 Dynamic(I::BoundExistentialPredicates, I::Region),
246
247 Closure(I::ClosureId, I::GenericArgs),
253
254 CoroutineClosure(I::CoroutineClosureId, I::GenericArgs),
260
261 Coroutine(I::CoroutineId, I::GenericArgs),
267
268 CoroutineWitness(I::CoroutineId, I::GenericArgs),
293
294 Never,
296
297 Tuple(I::Tys),
299
300 Alias(IsRigid, AliasTy<I>),
305
306 Param(I::ParamTy),
308
309 Bound(BoundVarIndexKind, ty::BoundTy<I>),
326
327 Placeholder(ty::PlaceholderType<I>),
336
337 Infer(InferTy),
344
345 Error(I::ErrorGuaranteed),
349}
350
351impl<I: Interner> Eq for TyKind<I> {}
352
353impl<I: Interner> TyKind<I> {
354 pub fn fn_sig(self, interner: I) -> ty::Binder<I, ty::FnSig<I>> {
355 self.unnormalized_fn_sig(interner).skip_normalization()
356 }
357
358 pub fn unnormalized_fn_sig(self, interner: I) -> Unnormalized<I, ty::Binder<I, ty::FnSig<I>>> {
359 match self {
360 ty::FnPtr(sig_tys, hdr) => Unnormalized::new_wip(sig_tys.with(hdr)),
361 ty::FnDef(def_id, args) => {
362 interner.fn_sig(def_id).instantiate(interner, args.no_bound_vars().unwrap())
363 }
364 ty::Error(_) => {
365 Unnormalized::dummy(ty::Binder::dummy(ty::FnSig::dummy()))
367 }
368 ty::Closure(..) => {
::core::panicking::panic_fmt(format_args!("to get the signature of a closure, use `args.as_closure().sig()` not `fn_sig()`"));
}panic!(
369 "to get the signature of a closure, use `args.as_closure().sig()` not `fn_sig()`",
370 ),
371 _ => {
::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),
372 }
373 }
374
375 pub fn is_known_rigid(self) -> bool {
383 match self {
384 ty::Bool
385 | ty::Char
386 | ty::Int(_)
387 | ty::Uint(_)
388 | ty::Float(_)
389 | ty::Adt(_, _)
390 | ty::Foreign(_)
391 | ty::Str
392 | ty::Array(_, _)
393 | ty::Pat(_, _)
394 | ty::Slice(_)
395 | ty::RawPtr(_, _)
396 | ty::Ref(_, _, _)
397 | ty::FnDef(_, _)
398 | ty::FnPtr(..)
399 | ty::UnsafeBinder(_)
400 | ty::Dynamic(_, _)
401 | ty::Closure(_, _)
402 | ty::CoroutineClosure(_, _)
403 | ty::Coroutine(_, _)
404 | ty::CoroutineWitness(..)
405 | ty::Never
406 | ty::Tuple(_) => true,
407
408 ty::Error(_)
409 | ty::Infer(_)
410 | ty::Alias(ty::IsRigid::No | ty::IsRigid::Yes, _)
411 | ty::Param(_)
412 | ty::Bound(_, _)
413 | ty::Placeholder(_) => false,
414 }
415 }
416}
417
418impl<I: Interner> fmt::Debug for TyKind<I> {
420 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
421 match self {
422 Bool => f.write_fmt(format_args!("bool"))write!(f, "bool"),
423 Char => f.write_fmt(format_args!("char"))write!(f, "char"),
424 Int(i) => f.write_fmt(format_args!("{0:?}", i))write!(f, "{i:?}"),
425 Uint(u) => f.write_fmt(format_args!("{0:?}", u))write!(f, "{u:?}"),
426 Float(float) => f.write_fmt(format_args!("{0:?}", float))write!(f, "{float:?}"),
427 Adt(d, s) => {
428 f.write_fmt(format_args!("{0:?}", d))write!(f, "{d:?}")?;
429 let mut s = s.iter();
430 let first = s.next();
431 match first {
432 Some(first) => f.write_fmt(format_args!("<{0:?}", first))write!(f, "<{:?}", first)?,
433 None => return Ok(()),
434 };
435
436 for arg in s {
437 f.write_fmt(format_args!(", {0:?}", arg))write!(f, ", {:?}", arg)?;
438 }
439
440 f.write_fmt(format_args!(">"))write!(f, ">")
441 }
442 Foreign(d) => f.debug_tuple("Foreign").field(d).finish(),
443 Str => f.write_fmt(format_args!("str"))write!(f, "str"),
444 Array(t, c) => f.write_fmt(format_args!("[{0:?}; {1:?}]", t, c))write!(f, "[{t:?}; {c:?}]"),
445 Pat(t, p) => f.write_fmt(format_args!("pattern_type!({0:?} is {1:?})", t, p))write!(f, "pattern_type!({t:?} is {p:?})"),
446 Slice(t) => f.write_fmt(format_args!("[{0:?}]", &t))write!(f, "[{:?}]", &t),
447 RawPtr(ty, mutbl) => f.write_fmt(format_args!("*{0} {1:?}", mutbl.ptr_str(), ty))write!(f, "*{} {:?}", mutbl.ptr_str(), ty),
448 Ref(r, t, m) => f.write_fmt(format_args!("&{0:?} {1}{2:?}", r, m.prefix_str(), t))write!(f, "&{:?} {}{:?}", r, m.prefix_str(), t),
449 FnDef(d, s) => f.debug_tuple("FnDef").field(d).field(&s).finish(),
450 FnPtr(sig_tys, hdr) => f.write_fmt(format_args!("{0:?}", sig_tys.with(*hdr)))write!(f, "{:?}", sig_tys.with(*hdr)),
451 UnsafeBinder(binder) => f.write_fmt(format_args!("{0:?}", binder))write!(f, "{:?}", binder),
453 Dynamic(p, r) => f.write_fmt(format_args!("dyn {0:?} + {1:?}", p, r))write!(f, "dyn {p:?} + {r:?}"),
454 Closure(d, s) => f.debug_tuple("Closure").field(d).field(&s).finish(),
455 CoroutineClosure(d, s) => f.debug_tuple("CoroutineClosure").field(d).field(&s).finish(),
456 Coroutine(d, s) => f.debug_tuple("Coroutine").field(d).field(&s).finish(),
457 CoroutineWitness(d, s) => f.debug_tuple("CoroutineWitness").field(d).field(&s).finish(),
458 Never => f.write_fmt(format_args!("!"))write!(f, "!"),
459 Tuple(t) => {
460 f.write_fmt(format_args!("("))write!(f, "(")?;
461 let mut count = 0;
462 for ty in t.iter() {
463 if count > 0 {
464 f.write_fmt(format_args!(", "))write!(f, ", ")?;
465 }
466 f.write_fmt(format_args!("{0:?}", ty))write!(f, "{ty:?}")?;
467 count += 1;
468 }
469 if count == 1 {
471 f.write_fmt(format_args!(","))write!(f, ",")?;
472 }
473 f.write_fmt(format_args!(")"))write!(f, ")")
474 }
475 Alias(is_rigid, a) => f.debug_tuple("Alias").field(&is_rigid).field(&a).finish(),
476 Param(p) => f.write_fmt(format_args!("{0:?}", p))write!(f, "{p:?}"),
477 Bound(d, b) => crate::debug_bound_var(f, *d, b),
478 Placeholder(p) => f.write_fmt(format_args!("{0:?}", p))write!(f, "{p:?}"),
479 Infer(t) => f.write_fmt(format_args!("{0:?}", t))write!(f, "{:?}", t),
480 TyKind::Error(_) => f.write_fmt(format_args!("{{type error}}"))write!(f, "{{type error}}"),
481 }
482 }
483}
484
485impl<I: Interner> AliasTy<I> {
486 pub fn new_from_args(interner: I, kind: AliasTyKind<I>, args: I::GenericArgs) -> AliasTy<I> {
487 if truecfg!(debug_assertions) {
488 let def_id = match kind {
489 AliasTyKind::Projection { def_id } => def_id.into(),
490 AliasTyKind::Inherent { def_id } => def_id.into(),
491 AliasTyKind::Opaque { def_id } => def_id.into(),
492 AliasTyKind::Free { def_id } => def_id.into(),
493 };
494 interner.debug_assert_args_compatible(def_id, args);
495 }
496 AliasTy { kind, args, _use_alias_new_instead: () }
497 }
498
499 pub fn new(
500 interner: I,
501 kind: AliasTyKind<I>,
502 args: impl IntoIterator<Item: Into<I::GenericArg>>,
503 ) -> AliasTy<I> {
504 let args = interner.mk_args_from_iter(args.into_iter().map(Into::into));
505 Self::new_from_args(interner, kind, args)
506 }
507
508 pub fn is_opaque(self) -> bool {
510 #[allow(non_exhaustive_omitted_patterns)] match self.kind {
AliasTyKind::Opaque { .. } => true,
_ => false,
}matches!(self.kind, AliasTyKind::Opaque { .. })
511 }
512
513 pub fn to_ty(self, interner: I, is_rigid: ty::IsRigid) -> I::Ty {
514 Ty::new_alias(interner, is_rigid, self)
515 }
516
517 pub fn try_to_projection(self) -> Option<ProjectionAliasTy<I>> {
518 self.kind.try_to_projection().map(|kind| ty::Alias {
519 kind,
520 args: self.args,
521 _use_alias_new_instead: (),
522 })
523 }
524
525 pub fn try_to_inherent(self) -> Option<InherentAliasTy<I>> {
526 self.kind.try_to_inherent().map(|kind| ty::Alias {
527 kind,
528 args: self.args,
529 _use_alias_new_instead: (),
530 })
531 }
532
533 pub fn try_to_opaque(self) -> Option<OpaqueAliasTy<I>> {
534 self.kind.try_to_opaque().map(|kind| ty::Alias {
535 kind,
536 args: self.args,
537 _use_alias_new_instead: (),
538 })
539 }
540
541 pub fn try_to_free(self) -> Option<FreeAliasTy<I>> {
542 self.kind.try_to_free().map(|kind| ty::Alias {
543 kind,
544 args: self.args,
545 _use_alias_new_instead: (),
546 })
547 }
548}
549
550impl<I: Interner> ProjectionAliasTy<I> {
551 pub fn new_projection_from_args(
552 interner: I,
553 kind: I::TraitAssocTyId,
554 args: I::GenericArgs,
555 ) -> Self {
556 interner.debug_assert_args_compatible(kind.into(), args);
557 Self { kind, args, _use_alias_new_instead: () }
558 }
559
560 pub fn projection_to_alias_ty(self) -> AliasTy<I> {
561 AliasTy {
562 kind: AliasTyKind::Projection { def_id: self.kind },
563 args: self.args,
564 _use_alias_new_instead: (),
565 }
566 }
567
568 #[track_caller]
569 pub fn projection_self_ty(self) -> I::Ty {
570 self.args.type_at(0)
571 }
572}
573
574impl<I: Interner> AliasTy<I> {
578 #[track_caller]
579 pub fn self_ty(self) -> I::Ty {
580 self.args.type_at(0)
581 }
582
583 pub fn with_replaced_self_ty(self, interner: I, self_ty: I::Ty) -> Self {
584 AliasTy::new(
585 interner,
586 self.kind,
587 [self_ty.into()].into_iter().chain(self.args.iter().skip(1)),
588 )
589 }
590
591 pub fn trait_def_id(self, interner: I) -> I::TraitId {
592 let AliasTyKind::Projection { def_id } = self.kind else { { ::core::panicking::panic_fmt(format_args!("expected a projection")); }panic!("expected a projection") };
593
594 interner.projection_parent(def_id.into())
595 }
596
597 pub fn trait_ref_and_own_args(self, interner: I) -> (ty::TraitRef<I>, I::GenericArgsSlice) {
603 let AliasTyKind::Projection { def_id } = self.kind else { { ::core::panicking::panic_fmt(format_args!("expected a projection")); }panic!("expected a projection") };
604
605 interner.trait_ref_and_own_args_for_alias(def_id.into(), self.args)
606 }
607
608 pub fn trait_ref(self, interner: I) -> ty::TraitRef<I> {
617 self.trait_ref_and_own_args(interner).0
618 }
619}
620
621impl<I: Interner> InherentAliasTy<I> {
622 pub fn new_inherent_from_args(
623 interner: I,
624 kind: I::InherentAssocTyId,
625 args: I::GenericArgs,
626 ) -> Self {
627 interner.debug_assert_args_compatible(kind.into(), args);
628 Self { kind, args, _use_alias_new_instead: () }
629 }
630
631 pub fn inherent_to_alias_ty(self) -> AliasTy<I> {
632 AliasTy {
633 kind: AliasTyKind::Inherent { def_id: self.kind },
634 args: self.args,
635 _use_alias_new_instead: (),
636 }
637 }
638}
639
640impl<I: Interner> OpaqueAliasTy<I> {
641 pub fn new_opaque_from_args(interner: I, kind: I::OpaqueTyId, args: I::GenericArgs) -> Self {
642 interner.debug_assert_args_compatible(kind.into(), args);
643 Self { kind, args, _use_alias_new_instead: () }
644 }
645
646 pub fn opaque_to_alias_ty(self) -> AliasTy<I> {
647 AliasTy {
648 kind: AliasTyKind::Opaque { def_id: self.kind },
649 args: self.args,
650 _use_alias_new_instead: (),
651 }
652 }
653}
654
655impl<I: Interner> FreeAliasTy<I> {
656 pub fn new_free_from_args(interner: I, kind: I::FreeTyAliasId, args: I::GenericArgs) -> Self {
657 interner.debug_assert_args_compatible(kind.into(), args);
658 Self { kind, args, _use_alias_new_instead: () }
659 }
660
661 pub fn free_to_alias_ty(self) -> AliasTy<I> {
662 AliasTy {
663 kind: AliasTyKind::Free { def_id: self.kind },
664 args: self.args,
665 _use_alias_new_instead: (),
666 }
667 }
668}
669
670#[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)]
671pub enum IntVarValue {
672 Unknown,
673 IntType(IntTy),
674 UintType(UintTy),
675}
676
677impl IntVarValue {
678 pub fn is_known(self) -> bool {
679 match self {
680 IntVarValue::IntType(_) | IntVarValue::UintType(_) => true,
681 IntVarValue::Unknown => false,
682 }
683 }
684
685 pub fn is_unknown(self) -> bool {
686 !self.is_known()
687 }
688}
689
690#[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)]
691pub enum FloatVarValue {
692 Unknown,
693 Known(FloatTy),
694}
695
696impl FloatVarValue {
697 pub fn is_known(self) -> bool {
698 match self {
699 FloatVarValue::Known(_) => true,
700 FloatVarValue::Unknown => false,
701 }
702 }
703
704 pub fn is_unknown(self) -> bool {
705 !self.is_known()
706 }
707}
708
709impl ::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! {
710 #[encodable]
712 #[orderable]
713 #[debug_format = "?{}t"]
714 #[gate_rustc_only]
715 pub struct TyVid {}
716}
717
718impl ::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! {
719 #[encodable]
721 #[orderable]
722 #[debug_format = "?{}i"]
723 #[gate_rustc_only]
724 pub struct IntVid {}
725}
726
727impl ::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! {
728 #[encodable]
730 #[orderable]
731 #[debug_format = "?{}f"]
732 #[gate_rustc_only]
733 pub struct FloatVid {}
734}
735
736#[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> {
::core::option::Option::Some(::core::cmp::Ord::cmp(self, other))
}
}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)]
742#[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))]
743pub enum InferTy {
744 TyVar(TyVid),
746 IntVar(IntVid),
753 FloatVar(FloatVid),
760
761 FreshTy(u32),
768 FreshIntTy(u32),
770 FreshFloatTy(u32),
772}
773
774impl UnifyValue for IntVarValue {
775 type Error = NoError;
776
777 fn unify_values(value1: &Self, value2: &Self) -> Result<Self, Self::Error> {
778 match (*value1, *value2) {
779 (IntVarValue::Unknown, IntVarValue::Unknown) => Ok(IntVarValue::Unknown),
780 (
781 IntVarValue::Unknown,
782 known @ (IntVarValue::UintType(_) | IntVarValue::IntType(_)),
783 )
784 | (
785 known @ (IntVarValue::UintType(_) | IntVarValue::IntType(_)),
786 IntVarValue::Unknown,
787 ) => Ok(known),
788 _ => {
::core::panicking::panic_fmt(format_args!("differing ints should have been resolved first"));
}panic!("differing ints should have been resolved first"),
789 }
790 }
791}
792
793impl UnifyKey for IntVid {
794 type Value = IntVarValue;
795 #[inline] fn index(&self) -> u32 {
797 self.as_u32()
798 }
799 #[inline]
800 fn from_index(i: u32) -> IntVid {
801 IntVid::from_u32(i)
802 }
803 fn tag() -> &'static str {
804 "IntVid"
805 }
806}
807
808impl UnifyValue for FloatVarValue {
809 type Error = NoError;
810
811 fn unify_values(value1: &Self, value2: &Self) -> Result<Self, Self::Error> {
812 match (*value1, *value2) {
813 (FloatVarValue::Unknown, FloatVarValue::Unknown) => Ok(FloatVarValue::Unknown),
814 (FloatVarValue::Unknown, FloatVarValue::Known(known))
815 | (FloatVarValue::Known(known), FloatVarValue::Unknown) => {
816 Ok(FloatVarValue::Known(known))
817 }
818 (FloatVarValue::Known(_), FloatVarValue::Known(_)) => {
819 {
::core::panicking::panic_fmt(format_args!("differing floats should have been resolved first"));
}panic!("differing floats should have been resolved first")
820 }
821 }
822 }
823}
824
825impl UnifyKey for FloatVid {
826 type Value = FloatVarValue;
827 #[inline]
828 fn index(&self) -> u32 {
829 self.as_u32()
830 }
831 #[inline]
832 fn from_index(i: u32) -> FloatVid {
833 FloatVid::from_u32(i)
834 }
835 fn tag() -> &'static str {
836 "FloatVid"
837 }
838}
839
840#[cfg(feature = "nightly")]
841impl StableHash for InferTy {
842 fn stable_hash<Hcx: StableHashCtxt>(&self, hcx: &mut Hcx, hasher: &mut StableHasher) {
843 use InferTy::*;
844 std::mem::discriminant(self).stable_hash(hcx, hasher);
845 match self {
846 TyVar(_) | IntVar(_) | FloatVar(_) => {
847 {
::core::panicking::panic_fmt(format_args!("type variables should not be hashed: {0:?}",
self));
}panic!("type variables should not be hashed: {self:?}")
848 }
849 FreshTy(v) | FreshIntTy(v) | FreshFloatTy(v) => v.stable_hash(hcx, hasher),
850 }
851 }
852}
853
854impl fmt::Display for InferTy {
855 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
856 use InferTy::*;
857 match *self {
858 TyVar(_) => f.write_fmt(format_args!("_"))write!(f, "_"),
859 IntVar(_) => f.write_fmt(format_args!("{0}", "{integer}"))write!(f, "{}", "{integer}"),
860 FloatVar(_) => f.write_fmt(format_args!("{0}", "{float}"))write!(f, "{}", "{float}"),
861 FreshTy(v) => f.write_fmt(format_args!("FreshTy({0})", v))write!(f, "FreshTy({v})"),
862 FreshIntTy(v) => f.write_fmt(format_args!("FreshIntTy({0})", v))write!(f, "FreshIntTy({v})"),
863 FreshFloatTy(v) => f.write_fmt(format_args!("FreshFloatTy({0})", v))write!(f, "FreshFloatTy({v})"),
864 }
865 }
866}
867
868impl fmt::Debug for InferTy {
869 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
870 use InferTy::*;
871 match *self {
872 TyVar(ref v) => v.fmt(f),
873 IntVar(ref v) => v.fmt(f),
874 FloatVar(ref v) => v.fmt(f),
875 FreshTy(v) => f.write_fmt(format_args!("FreshTy({0:?})", v))write!(f, "FreshTy({v:?})"),
876 FreshIntTy(v) => f.write_fmt(format_args!("FreshIntTy({0:?})", v))write!(f, "FreshIntTy({v:?})"),
877 FreshFloatTy(v) => f.write_fmt(format_args!("FreshFloatTy({0:?})", v))write!(f, "FreshFloatTy({v:?})"),
878 }
879 }
880}
881
882#[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)]
883#[cfg_attr(
884 feature = "nightly",
885 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_hash::StableHash for
TypeAndMut<I> where
I::Ty: ::rustc_data_structures::stable_hash::StableHash {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::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)
886)]
887#[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)]
888pub struct TypeAndMut<I: Interner> {
889 pub ty: I::Ty,
890 pub mutbl: Mutability,
891}
892
893impl<I: Interner> Eq for TypeAndMut<I> {}
894
895#[derive(#[automatically_derived]
impl ::core::fmt::Debug for SplattedArgIndexError {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
SplattedArgIndexError::InvalidIndex { splatted_arg_index: __self_0
} =>
::core::fmt::Formatter::debug_struct_field1_finish(f,
"InvalidIndex", "splatted_arg_index", &__self_0),
SplattedArgIndexError::OutOfBounds {
splatted_arg_index: __self_0, args_len: __self_1 } =>
::core::fmt::Formatter::debug_struct_field2_finish(f,
"OutOfBounds", "splatted_arg_index", __self_0, "args_len",
&__self_1),
}
}
}Debug, #[automatically_derived]
impl ::core::clone::Clone for SplattedArgIndexError {
#[inline]
fn clone(&self) -> SplattedArgIndexError {
let _: ::core::clone::AssertParamIsClone<u8>;
let _: ::core::clone::AssertParamIsClone<u16>;
*self
}
}Clone, #[automatically_derived]
impl ::core::marker::Copy for SplattedArgIndexError { }Copy, #[automatically_derived]
impl ::core::cmp::PartialEq for SplattedArgIndexError {
#[inline]
fn eq(&self, other: &SplattedArgIndexError) -> bool {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
__self_discr == __arg1_discr &&
match (self, other) {
(SplattedArgIndexError::InvalidIndex {
splatted_arg_index: __self_0 },
SplattedArgIndexError::InvalidIndex {
splatted_arg_index: __arg1_0 }) => __self_0 == __arg1_0,
(SplattedArgIndexError::OutOfBounds {
splatted_arg_index: __self_0, args_len: __self_1 },
SplattedArgIndexError::OutOfBounds {
splatted_arg_index: __arg1_0, args_len: __arg1_1 }) =>
__self_0 == __arg1_0 && __self_1 == __arg1_1,
_ => unsafe { ::core::intrinsics::unreachable() }
}
}
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for SplattedArgIndexError {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<u8>;
let _: ::core::cmp::AssertParamIsEq<u16>;
}
}Eq)]
897pub enum SplattedArgIndexError {
898 InvalidIndex { splatted_arg_index: u8 },
902
903 OutOfBounds { splatted_arg_index: u8, args_len: u16 },
905}
906
907#[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,
splatted: ref __field_splatted,
_marker: ref __field__marker } => {
::core::hash::Hash::hash(__field_flags, __state);
::core::hash::Hash::hash(__field_splatted, __state);
::core::hash::Hash::hash(__field__marker, __state);
}
}
}
}#[derive_where(Copy, Clone, PartialEq, Eq, Hash; I: Interner)]
909#[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,
splatted: __binding_1,
_marker: __binding_2 } => {
FnSigKind {
flags: __binding_0,
splatted: __binding_1,
_marker: __binding_2,
}
}
})
}
fn fold_with<__F: ::rustc_type_ir::TypeFolder<I>>(self,
__folder: &mut __F) -> Self {
match self {
FnSigKind {
flags: __binding_0,
splatted: __binding_1,
_marker: __binding_2 } => {
FnSigKind {
flags: __binding_0,
splatted: __binding_1,
_marker: __binding_2,
}
}
}
}
}
};TypeFoldable_Generic, const _: () =
{
impl<I: Interner, J> ::rustc_type_ir::lift::Lift<J> for FnSigKind<I>
where J: Interner, I: ::rustc_type_ir::LiftInto<J> {
type Lifted = FnSigKind<J>;
fn lift_to_interner(self, interner: J) -> Self::Lifted {
match self {
FnSigKind {
flags: __binding_0,
splatted: __binding_1,
_marker: __binding_2 } => {
FnSigKind {
flags: __binding_0,
splatted: __binding_1,
_marker: PhantomData,
}
}
}
}
}
};Lift_Generic)]
910#[cfg_attr(
911 feature = "nightly",
912 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,
splatted: ref __binding_1,
_marker: 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, __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),
splatted: ::rustc_serialize::Decodable::decode(__decoder),
_marker: ::rustc_serialize::Decodable::decode(__decoder),
}
}
}
};Decodable_NoContext, const _: () =
{
impl<I: Interner> ::rustc_data_structures::stable_hash::StableHash for
FnSigKind<I> where
PhantomData<fn()
-> I>: ::rustc_data_structures::stable_hash::StableHash {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
FnSigKind {
flags: ref __binding_0,
splatted: ref __binding_1,
_marker: ref __binding_2 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash_NoContext)
913)]
914pub struct FnSigKind<I: Interner> {
915 #[lift(identity)]
918 #[type_visitable(ignore)]
919 #[type_foldable(identity)]
920 flags: u8,
921
922 #[lift(identity)]
926 #[type_visitable(ignore)]
927 #[type_foldable(identity)]
928 splatted: u8,
929
930 #[type_visitable(ignore)]
931 #[type_foldable(identity)]
932 _marker: PhantomData<fn() -> I>,
933}
934
935impl<I: Interner> fmt::Debug for FnSigKind<I> {
936 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
937 let mut f = f.debug_tuple("FnSigKind");
938
939 if self.is_safe() {
940 f.field(&"Safe");
941 } else {
942 f.field(&"Unsafe");
943 }
944
945 f.field(&self.abi());
946
947 if self.c_variadic() {
948 f.field(&"CVariadic");
949 }
950
951 if let Some(index) = self.splatted() {
952 f.field(&::alloc::__export::must_use({
::alloc::fmt::format(format_args!("Splatted({0})", index))
})format!("Splatted({})", index));
953 }
954
955 f.finish()
956 }
957}
958
959impl<I: Interner> Default for FnSigKind<I> {
960 fn default() -> Self {
963 Self { flags: 0, splatted: 0, _marker: PhantomData }
964 .set_abi(ExternAbi::Rust)
965 .set_safety(I::Safety::unsafe_mode())
966 .set_c_variadic(false)
967 .set_no_splatted_args()
968 }
969}
970
971impl<I: Interner> FnSigKind<I> {
972 const EXTERN_ABI_MASK: u8 = 0b111111;
974
975 const SAFE_FLAG: u8 = 1 << 6;
977
978 const C_VARIADIC_FLAG: u8 = 1 << 7;
980
981 pub const NO_SPLATTED_ARG_INDEX: u8 = u8::MAX;
989
990 pub fn new(
993 abi: ExternAbi,
994 safety: I::Safety,
995 c_variadic: bool,
996 splatted: Option<u8>,
997 args_len: usize,
998 ) -> Result<Self, SplattedArgIndexError> {
999 Self::default()
1000 .set_abi(abi)
1001 .set_safety(safety)
1002 .set_c_variadic(c_variadic)
1003 .set_splatted(splatted, args_len)
1004 }
1005
1006 pub fn dummy() -> Self {
1008 Self::default().set_safety(I::Safety::safe())
1009 }
1010
1011 #[must_use = "this method does not modify the receiver"]
1013 pub fn set_abi(mut self, abi: ExternAbi) -> Self {
1014 let abi_index = abi.as_packed();
1015 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);
1016
1017 self.flags &= !Self::EXTERN_ABI_MASK;
1018 self.flags |= abi_index;
1019
1020 self
1021 }
1022
1023 #[must_use = "this method does not modify the receiver"]
1025 pub fn set_safety(mut self, safety: I::Safety) -> Self {
1026 if safety.is_safe() {
1027 self.flags |= Self::SAFE_FLAG;
1028 } else {
1029 self.flags &= !Self::SAFE_FLAG;
1030 }
1031
1032 self
1033 }
1034
1035 #[must_use = "this method does not modify the receiver"]
1037 pub fn set_c_variadic(mut self, c_variadic: bool) -> Self {
1038 if c_variadic {
1039 self.flags |= Self::C_VARIADIC_FLAG;
1040 } else {
1041 self.flags &= !Self::C_VARIADIC_FLAG;
1042 }
1043
1044 self
1045 }
1046
1047 #[must_use = "this method does not modify the receiver"]
1050 pub fn set_splatted(
1051 mut self,
1052 splatted: Option<u8>,
1053 args_len: usize,
1054 ) -> Result<Self, SplattedArgIndexError> {
1055 if let Some(splatted_arg_index) = splatted {
1056 if splatted_arg_index == Self::NO_SPLATTED_ARG_INDEX {
1057 return Err(SplattedArgIndexError::InvalidIndex { splatted_arg_index });
1060 } else if usize::from(splatted_arg_index) >= args_len {
1061 return Err(SplattedArgIndexError::OutOfBounds {
1062 splatted_arg_index,
1063 args_len: args_len as u16,
1064 });
1065 }
1066
1067 self.splatted = splatted_arg_index;
1068 } else {
1069 self.splatted = Self::NO_SPLATTED_ARG_INDEX;
1070 }
1071
1072 Ok(self)
1073 }
1074
1075 #[must_use = "this method does not modify the receiver"]
1077 pub fn set_no_splatted_args(mut self) -> Self {
1078 self.splatted = Self::NO_SPLATTED_ARG_INDEX;
1079 self
1080 }
1081
1082 pub fn abi(self) -> ExternAbi {
1084 let abi_index = self.flags & Self::EXTERN_ABI_MASK;
1085 ExternAbi::from_packed(abi_index)
1086 }
1087
1088 pub fn is_safe(self) -> bool {
1090 self.flags & Self::SAFE_FLAG != 0
1091 }
1092
1093 pub fn safety(self) -> I::Safety {
1095 if self.is_safe() { I::Safety::safe() } else { I::Safety::unsafe_mode() }
1096 }
1097
1098 pub fn c_variadic(self) -> bool {
1100 self.flags & Self::C_VARIADIC_FLAG != 0
1101 }
1102
1103 pub fn splatted(self) -> Option<u8> {
1105 if self.splatted == Self::NO_SPLATTED_ARG_INDEX { None } else { Some(self.splatted) }
1106 }
1107}
1108
1109#[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)]
1110#[cfg_attr(
1111 feature = "nightly",
1112 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_hash::StableHash for
FnSig<I> where
I::Tys: ::rustc_data_structures::stable_hash::StableHash,
FnSigKind<I>: ::rustc_data_structures::stable_hash::StableHash {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::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)
1113)]
1114#[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
J: Interner, I: ::rustc_type_ir::LiftInto<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)]
1115pub struct FnSig<I: Interner> {
1116 pub inputs_and_output: I::Tys,
1117 #[type_visitable(ignore)]
1118 #[type_foldable(identity)]
1119 pub fn_sig_kind: FnSigKind<I>,
1120}
1121
1122impl<I: Interner> Eq for FnSig<I> {}
1123
1124impl<I: Interner> FnSig<I> {
1125 pub fn inputs(self) -> I::FnInputTys {
1126 self.inputs_and_output.inputs()
1127 }
1128
1129 pub fn output(self) -> I::Ty {
1130 self.inputs_and_output.output()
1131 }
1132
1133 pub fn is_fn_trait_compatible(self) -> bool {
1134 !self.c_variadic() && self.safety().is_safe() && self.abi() == ExternAbi::Rust
1135 }
1136
1137 #[must_use = "this method does not modify the receiver"]
1139 pub fn set_safety(self, safety: I::Safety) -> Self {
1140 Self { fn_sig_kind: self.fn_sig_kind.set_safety(safety), ..self }
1141 }
1142
1143 #[must_use = "this method does not modify the receiver"]
1146 pub fn set_splatted(
1147 self,
1148 splatted: Option<u8>,
1149 args_len: usize,
1150 ) -> Result<Self, SplattedArgIndexError> {
1151 Ok(Self { fn_sig_kind: self.fn_sig_kind.set_splatted(splatted, args_len)?, ..self })
1152 }
1153
1154 pub fn safety(self) -> I::Safety {
1155 self.fn_sig_kind.safety()
1156 }
1157
1158 pub fn abi(self) -> ExternAbi {
1159 self.fn_sig_kind.abi()
1160 }
1161
1162 pub fn c_variadic(self) -> bool {
1163 self.fn_sig_kind.c_variadic()
1164 }
1165
1166 pub fn splatted(self) -> Option<u8> {
1167 self.fn_sig_kind.splatted()
1168 }
1169
1170 pub fn dummy() -> Self {
1173 Self { inputs_and_output: Default::default(), fn_sig_kind: FnSigKind::dummy() }
1174 }
1175}
1176
1177impl<I: Interner> ty::Binder<I, FnSig<I>> {
1178 #[inline]
1179 pub fn inputs(self) -> ty::Binder<I, I::FnInputTys> {
1180 self.map_bound(|fn_sig| fn_sig.inputs())
1181 }
1182
1183 #[inline]
1184 #[track_caller]
1185 pub fn input(self, index: usize) -> ty::Binder<I, I::Ty> {
1186 self.map_bound(|fn_sig| fn_sig.inputs().get(index).unwrap())
1187 }
1188
1189 pub fn inputs_and_output(self) -> ty::Binder<I, I::Tys> {
1190 self.map_bound(|fn_sig| fn_sig.inputs_and_output)
1191 }
1192
1193 #[inline]
1194 pub fn output(self) -> ty::Binder<I, I::Ty> {
1195 self.map_bound(|fn_sig| fn_sig.output())
1196 }
1197
1198 pub fn fn_sig_kind(self) -> FnSigKind<I> {
1199 self.skip_binder().fn_sig_kind
1200 }
1201
1202 pub fn c_variadic(self) -> bool {
1203 self.skip_binder().c_variadic()
1204 }
1205
1206 pub fn splatted(self) -> Option<u8> {
1207 self.skip_binder().splatted()
1208 }
1209
1210 pub fn safety(self) -> I::Safety {
1211 self.skip_binder().safety()
1212 }
1213
1214 pub fn abi(self) -> ExternAbi {
1215 self.skip_binder().abi()
1216 }
1217
1218 pub fn is_fn_trait_compatible(&self) -> bool {
1219 self.skip_binder().is_fn_trait_compatible()
1220 }
1221
1222 pub fn split(self) -> (ty::Binder<I, FnSigTys<I>>, FnHeader<I>) {
1224 let hdr = FnHeader { fn_sig_kind: self.fn_sig_kind() };
1225 (self.map_bound(|sig| FnSigTys { inputs_and_output: sig.inputs_and_output }), hdr)
1226 }
1227}
1228
1229impl<I: Interner> fmt::Debug for FnSig<I> {
1230 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1231 let sig = self;
1232 let FnSig { inputs_and_output: _, fn_sig_kind } = sig;
1233
1234 f.write_fmt(format_args!("{0}", fn_sig_kind.safety().prefix_str()))write!(f, "{}", fn_sig_kind.safety().prefix_str())?;
1235 if fn_sig_kind.abi() != ExternAbi::Rust {
1236 f.write_fmt(format_args!("extern \"{0:?}\" ", fn_sig_kind.abi()))write!(f, "extern \"{:?}\" ", fn_sig_kind.abi())?;
1237 }
1238
1239 f.write_fmt(format_args!("fn("))write!(f, "fn(")?;
1240 let inputs = sig.inputs();
1241 for (i, ty) in inputs.iter().enumerate() {
1242 if i > 0 {
1243 f.write_fmt(format_args!(", "))write!(f, ", ")?;
1244 }
1245 if Some(i) == fn_sig_kind.splatted().map(usize::from) {
1246 f.write_fmt(format_args!("#[splat] "))write!(f, "#[splat] ")?;
1247 }
1248 f.write_fmt(format_args!("{0:?}", ty))write!(f, "{ty:?}")?;
1249 }
1250 if fn_sig_kind.c_variadic() {
1251 if inputs.is_empty() {
1252 f.write_fmt(format_args!("..."))write!(f, "...")?;
1253 } else {
1254 f.write_fmt(format_args!(", ..."))write!(f, ", ...")?;
1255 }
1256 }
1257 f.write_fmt(format_args!(")"))write!(f, ")")?;
1258
1259 let output = sig.output();
1260 match output.kind() {
1261 Tuple(list) if list.is_empty() => Ok(()),
1262 _ => f.write_fmt(format_args!(" -> {0:?}", sig.output()))write!(f, " -> {:?}", sig.output()),
1263 }
1264 }
1265}
1266
1267#[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)]
1270#[cfg_attr(feature = "nightly", derive(const _: () =
{
impl<I: Interner> ::rustc_data_structures::stable_hash::StableHash for
UnsafeBinderInner<I> where
ty::Binder<I,
I::Ty>: ::rustc_data_structures::stable_hash::StableHash {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
UnsafeBinderInner(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash_NoContext))]
1271#[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 J: Interner,
I: ::rustc_type_ir::LiftInto<J> {
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)]
1272pub struct UnsafeBinderInner<I: Interner>(ty::Binder<I, I::Ty>);
1273
1274impl<I: Interner> Eq for UnsafeBinderInner<I> {}
1275
1276impl<I: Interner> From<ty::Binder<I, I::Ty>> for UnsafeBinderInner<I> {
1277 fn from(value: ty::Binder<I, I::Ty>) -> Self {
1278 UnsafeBinderInner(value)
1279 }
1280}
1281
1282impl<I: Interner> From<UnsafeBinderInner<I>> for ty::Binder<I, I::Ty> {
1283 fn from(value: UnsafeBinderInner<I>) -> Self {
1284 value.0
1285 }
1286}
1287
1288impl<I: Interner> fmt::Debug for UnsafeBinderInner<I> {
1289 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1290 self.0.fmt(f)
1291 }
1292}
1293
1294impl<I: Interner> Deref for UnsafeBinderInner<I> {
1295 type Target = ty::Binder<I, I::Ty>;
1296
1297 fn deref(&self) -> &Self::Target {
1298 &self.0
1299 }
1300}
1301
1302#[cfg(feature = "nightly")]
1303impl<I: Interner, E: rustc_serialize::Encoder> rustc_serialize::Encodable<E>
1304 for UnsafeBinderInner<I>
1305where
1306 I::Ty: rustc_serialize::Encodable<E>,
1307 I::BoundVarKinds: rustc_serialize::Encodable<E>,
1308{
1309 fn encode(&self, e: &mut E) {
1310 self.bound_vars().encode(e);
1311 self.as_ref().skip_binder().encode(e);
1312 }
1313}
1314
1315#[cfg(feature = "nightly")]
1316impl<I: Interner, D: rustc_serialize::Decoder> rustc_serialize::Decodable<D>
1317 for UnsafeBinderInner<I>
1318where
1319 I::Ty: TypeVisitable<I> + rustc_serialize::Decodable<D>,
1320 I::BoundVarKinds: rustc_serialize::Decodable<D>,
1321{
1322 fn decode(decoder: &mut D) -> Self {
1323 let bound_vars = rustc_serialize::Decodable::decode(decoder);
1324 UnsafeBinderInner(ty::Binder::bind_with_vars(
1325 rustc_serialize::Decodable::decode(decoder),
1326 bound_vars,
1327 ))
1328 }
1329}
1330
1331#[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)]
1333#[cfg_attr(
1334 feature = "nightly",
1335 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_hash::StableHash for
FnSigTys<I> where
I::Tys: ::rustc_data_structures::stable_hash::StableHash {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
FnSigTys { inputs_and_output: ref __binding_0 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash_NoContext)
1336)]
1337#[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 J: Interner, I: ::rustc_type_ir::LiftInto<J> {
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)]
1338pub struct FnSigTys<I: Interner> {
1339 pub inputs_and_output: I::Tys,
1340}
1341
1342impl<I: Interner> Eq for FnSigTys<I> {}
1343
1344impl<I: Interner> FnSigTys<I> {
1345 pub fn inputs(self) -> I::FnInputTys {
1346 self.inputs_and_output.inputs()
1347 }
1348
1349 pub fn output(self) -> I::Ty {
1350 self.inputs_and_output.output()
1351 }
1352}
1353
1354impl<I: Interner> ty::Binder<I, FnSigTys<I>> {
1355 pub fn with(self, hdr: FnHeader<I>) -> ty::Binder<I, FnSig<I>> {
1357 self.map_bound(|sig_tys| FnSig {
1358 inputs_and_output: sig_tys.inputs_and_output,
1359 fn_sig_kind: hdr.fn_sig_kind,
1360 })
1361 }
1362
1363 #[inline]
1364 pub fn inputs(self) -> ty::Binder<I, I::FnInputTys> {
1365 self.map_bound(|sig_tys| sig_tys.inputs())
1366 }
1367
1368 #[inline]
1369 #[track_caller]
1370 pub fn input(self, index: usize) -> ty::Binder<I, I::Ty> {
1371 self.map_bound(|sig_tys| sig_tys.inputs().get(index).unwrap())
1372 }
1373
1374 pub fn inputs_and_output(self) -> ty::Binder<I, I::Tys> {
1375 self.map_bound(|sig_tys| sig_tys.inputs_and_output)
1376 }
1377
1378 #[inline]
1379 pub fn output(self) -> ty::Binder<I, I::Ty> {
1380 self.map_bound(|sig_tys| sig_tys.output())
1381 }
1382}
1383
1384#[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)]
1385#[cfg_attr(
1386 feature = "nightly",
1387 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_hash::StableHash for
FnHeader<I> where
FnSigKind<I>: ::rustc_data_structures::stable_hash::StableHash {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
FnHeader { fn_sig_kind: ref __binding_0 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash_NoContext)
1388)]
1389#[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 J: Interner, I: ::rustc_type_ir::LiftInto<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)]
1390pub struct FnHeader<I: Interner> {
1391 #[type_visitable(ignore)]
1392 #[type_foldable(identity)]
1393 pub fn_sig_kind: FnSigKind<I>,
1394}
1395
1396impl<I: Interner> FnHeader<I> {
1397 pub fn c_variadic(self) -> bool {
1398 self.fn_sig_kind.c_variadic()
1399 }
1400
1401 pub fn safety(self) -> I::Safety {
1402 self.fn_sig_kind.safety()
1403 }
1404
1405 pub fn abi(self) -> ExternAbi {
1406 self.fn_sig_kind.abi()
1407 }
1408
1409 pub fn dummy() -> Self {
1411 Self { fn_sig_kind: FnSigKind::dummy() }
1412 }
1413}
1414
1415impl<I: Interner> Eq for FnHeader<I> {}
1416
1417#[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)]
1418#[cfg_attr(
1419 feature = "nightly",
1420 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_hash::StableHash for
CoroutineWitnessTypes<I> where
I::Tys: ::rustc_data_structures::stable_hash::StableHash,
I::RegionAssumptions: ::rustc_data_structures::stable_hash::StableHash
{
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::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)
1421)]
1422#[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 J: Interner,
I: ::rustc_type_ir::LiftInto<J> {
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)]
1423pub struct CoroutineWitnessTypes<I: Interner> {
1424 pub types: I::Tys,
1425 pub assumptions: I::RegionAssumptions,
1426}
1427
1428impl<I: Interner> Eq for CoroutineWitnessTypes<I> {}