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;
21use crate::{
22 self as ty, BoundVarIndexKind, Const, FloatTy, FreeAliasTy, InherentAliasTy, IntTy, Interner,
23 OpaqueAliasTy, ProjectionAliasTy, Region, UintTy, Unnormalized,
24};
25
26mod closure;
27
28#[automatically_derived]
impl<I: Interner> ::core::clone::Clone for AliasTyKind<I> where I: Interner {
#[inline]
fn clone(&self) -> Self { *self }
}
#[automatically_derived]
impl<I: Interner> ::core::marker::Copy for AliasTyKind<I> where I: Interner {
}
#[automatically_derived]
impl<I: Interner> ::core::hash::Hash for AliasTyKind<I> where I: Interner {
fn hash<__H: ::core::hash::Hasher>(&self, __state: &mut __H) {
match self {
AliasTyKind::Projection { def_id: ref __field_def_id } => {
::core::hash::Hash::hash(&::core::mem::discriminant(self),
__state);
::core::hash::Hash::hash(__field_def_id, __state);
}
AliasTyKind::Inherent { def_id: ref __field_def_id } => {
::core::hash::Hash::hash(&::core::mem::discriminant(self),
__state);
::core::hash::Hash::hash(__field_def_id, __state);
}
AliasTyKind::Opaque { def_id: ref __field_def_id } => {
::core::hash::Hash::hash(&::core::mem::discriminant(self),
__state);
::core::hash::Hash::hash(__field_def_id, __state);
}
AliasTyKind::Free { def_id: ref __field_def_id } => {
::core::hash::Hash::hash(&::core::mem::discriminant(self),
__state);
::core::hash::Hash::hash(__field_def_id, __state);
}
}
}
}
#[automatically_derived]
impl<I: Interner> ::core::cmp::PartialEq for AliasTyKind<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) {
(AliasTyKind::Projection { def_id: ref __field_def_id },
AliasTyKind::Projection { def_id: ref __other_field_def_id
}) =>
true &&
::core::cmp::PartialEq::eq(__field_def_id,
__other_field_def_id),
(AliasTyKind::Inherent { def_id: ref __field_def_id },
AliasTyKind::Inherent { def_id: ref __other_field_def_id })
=>
true &&
::core::cmp::PartialEq::eq(__field_def_id,
__other_field_def_id),
(AliasTyKind::Opaque { def_id: ref __field_def_id },
AliasTyKind::Opaque { def_id: ref __other_field_def_id }) =>
true &&
::core::cmp::PartialEq::eq(__field_def_id,
__other_field_def_id),
(AliasTyKind::Free { def_id: ref __field_def_id },
AliasTyKind::Free { def_id: ref __other_field_def_id }) =>
true &&
::core::cmp::PartialEq::eq(__field_def_id,
__other_field_def_id),
_ => unsafe { ::core::hint::unreachable_unchecked() },
}
} else { false }
}
}
const _: () =
{
trait DeriveWhereAssertEq {
fn assert(&self);
}
impl<I: Interner> DeriveWhereAssertEq for AliasTyKind<I> where
I: Interner {
fn assert(&self) {
struct __AssertEq<__T: ::core::cmp::Eq +
?::core::marker::Sized>(::core::marker::PhantomData<__T>);
let _: __AssertEq<I::TraitAssocTyId>;
let _: __AssertEq<I::InherentAssocTyId>;
let _: __AssertEq<I::OpaqueTyId>;
let _: __AssertEq<I::FreeTyAliasId>;
}
}
};
#[automatically_derived]
impl<I: Interner> ::core::cmp::Eq for AliasTyKind<I> where I: Interner { }
#[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)]
29#[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, const _: () =
{
unsafe impl<I: Interner, __V>
::rustc_type_ir::GenericTypeVisitable<__V> for AliasTyKind<I>
where
I::TraitAssocTyId: ::rustc_type_ir::GenericTypeVisitable<__V>,
I::InherentAssocTyId: ::rustc_type_ir::GenericTypeVisitable<__V>,
I::OpaqueTyId: ::rustc_type_ir::GenericTypeVisitable<__V>,
I::FreeTyAliasId: ::rustc_type_ir::GenericTypeVisitable<__V> {
fn generic_visit_with(&self, __visitor: &mut __V) {
match *self {
AliasTyKind::Projection { def_id: ref __binding_0 } => {
{
::rustc_type_ir::GenericTypeVisitable::<__V>::generic_visit_with(__binding_0,
__visitor);
}
}
AliasTyKind::Inherent { def_id: ref __binding_0 } => {
{
::rustc_type_ir::GenericTypeVisitable::<__V>::generic_visit_with(__binding_0,
__visitor);
}
}
AliasTyKind::Opaque { def_id: ref __binding_0 } => {
{
::rustc_type_ir::GenericTypeVisitable::<__V>::generic_visit_with(__binding_0,
__visitor);
}
}
AliasTyKind::Free { def_id: ref __binding_0 } => {
{
::rustc_type_ir::GenericTypeVisitable::<__V>::generic_visit_with(__binding_0,
__visitor);
}
}
}
}
}
};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)]
30#[cfg_attr(
31 feature = "nightly",
32 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)
33)]
34pub enum AliasTyKind<I: Interner> {
35 Projection { def_id: I::TraitAssocTyId },
45
46 Inherent { def_id: I::InherentAssocTyId },
50
51 Opaque { def_id: I::OpaqueTyId },
61
62 Free { def_id: I::FreeTyAliasId },
67}
68
69impl<I: Interner> AliasTyKind<I> {
70 pub fn descr(self) -> &'static str {
71 match self {
72 AliasTyKind::Projection { .. } => "associated type",
73 AliasTyKind::Inherent { .. } => "inherent associated type",
74 AliasTyKind::Opaque { .. } => "opaque type",
75 AliasTyKind::Free { .. } => "type alias",
76 }
77 }
78
79 pub fn try_to_projection(self) -> Option<I::TraitAssocTyId> {
80 match self {
81 AliasTyKind::Projection { def_id } => Some(def_id),
82 _ => None,
83 }
84 }
85
86 pub fn try_to_inherent(self) -> Option<I::InherentAssocTyId> {
87 match self {
88 AliasTyKind::Inherent { def_id } => Some(def_id),
89 _ => None,
90 }
91 }
92
93 pub fn try_to_opaque(self) -> Option<I::OpaqueTyId> {
94 match self {
95 AliasTyKind::Opaque { def_id } => Some(def_id),
96 _ => None,
97 }
98 }
99
100 pub fn try_to_free(self) -> Option<I::FreeTyAliasId> {
101 match self {
102 AliasTyKind::Free { def_id } => Some(def_id),
103 _ => None,
104 }
105 }
106}
107
108#[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]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for IsRigid { }
#[automatically_derived]
impl ::core::clone::Clone for IsRigid {
#[inline]
fn clone(&self) -> Self { *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) {
::core::hash::Hash::hash(&::core::intrinsics::discriminant_value(self),
state)
}
}Hash, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for IsRigid { }
#[automatically_derived]
impl ::core::cmp::PartialEq for IsRigid {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other)
}
}PartialEq)]
130#[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, const _: () =
{
unsafe impl<__V> ::rustc_type_ir::GenericTypeVisitable<__V> for
IsRigid {
fn generic_visit_with(&self, __visitor: &mut __V) {
match *self { IsRigid::Yes => {} IsRigid::No => {} }
}
}
};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)]
131#[cfg_attr(
132 feature = "nightly",
133 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);
}
}
};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)
134)]
135pub enum IsRigid {
136 Yes,
137 No,
138}
139
140impl IsRigid {
141 pub fn yes_if_next_solver<I: Interner>(interner: I) -> IsRigid {
142 if interner.next_trait_solver_globally() { IsRigid::Yes } else { IsRigid::No }
143 }
144}
145
146#[cfg_attr(feature = "nightly", rustc_diagnostic_item = "IrTyKind")]
151#[automatically_derived]
impl<I: Interner> ::core::clone::Clone for TyKind<I> where I: Interner {
#[inline]
fn clone(&self) -> Self { *self }
}
#[automatically_derived]
impl<I: Interner> ::core::marker::Copy for TyKind<I> where I: Interner { }
#[automatically_derived]
impl<I: Interner> ::core::hash::Hash for TyKind<I> where I: Interner {
fn hash<__H: ::core::hash::Hasher>(&self, __state: &mut __H) {
match self {
TyKind::Bool => {
::core::hash::Hash::hash(&::core::mem::discriminant(self),
__state);
}
TyKind::Char => {
::core::hash::Hash::hash(&::core::mem::discriminant(self),
__state);
}
TyKind::Int(ref __field_0) => {
::core::hash::Hash::hash(&::core::mem::discriminant(self),
__state);
::core::hash::Hash::hash(__field_0, __state);
}
TyKind::Uint(ref __field_0) => {
::core::hash::Hash::hash(&::core::mem::discriminant(self),
__state);
::core::hash::Hash::hash(__field_0, __state);
}
TyKind::Float(ref __field_0) => {
::core::hash::Hash::hash(&::core::mem::discriminant(self),
__state);
::core::hash::Hash::hash(__field_0, __state);
}
TyKind::Adt(ref __field_0, ref __field_1) => {
::core::hash::Hash::hash(&::core::mem::discriminant(self),
__state);
::core::hash::Hash::hash(__field_0, __state);
::core::hash::Hash::hash(__field_1, __state);
}
TyKind::Foreign(ref __field_0) => {
::core::hash::Hash::hash(&::core::mem::discriminant(self),
__state);
::core::hash::Hash::hash(__field_0, __state);
}
TyKind::Str => {
::core::hash::Hash::hash(&::core::mem::discriminant(self),
__state);
}
TyKind::Array(ref __field_0, ref __field_1) => {
::core::hash::Hash::hash(&::core::mem::discriminant(self),
__state);
::core::hash::Hash::hash(__field_0, __state);
::core::hash::Hash::hash(__field_1, __state);
}
TyKind::Pat(ref __field_0, ref __field_1) => {
::core::hash::Hash::hash(&::core::mem::discriminant(self),
__state);
::core::hash::Hash::hash(__field_0, __state);
::core::hash::Hash::hash(__field_1, __state);
}
TyKind::Slice(ref __field_0) => {
::core::hash::Hash::hash(&::core::mem::discriminant(self),
__state);
::core::hash::Hash::hash(__field_0, __state);
}
TyKind::RawPtr(ref __field_0, ref __field_1) => {
::core::hash::Hash::hash(&::core::mem::discriminant(self),
__state);
::core::hash::Hash::hash(__field_0, __state);
::core::hash::Hash::hash(__field_1, __state);
}
TyKind::Ref(ref __field_0, ref __field_1, ref __field_2) => {
::core::hash::Hash::hash(&::core::mem::discriminant(self),
__state);
::core::hash::Hash::hash(__field_0, __state);
::core::hash::Hash::hash(__field_1, __state);
::core::hash::Hash::hash(__field_2, __state);
}
TyKind::FnDef(ref __field_0, ref __field_1) => {
::core::hash::Hash::hash(&::core::mem::discriminant(self),
__state);
::core::hash::Hash::hash(__field_0, __state);
::core::hash::Hash::hash(__field_1, __state);
}
TyKind::FnPtr(ref __field_0, ref __field_1) => {
::core::hash::Hash::hash(&::core::mem::discriminant(self),
__state);
::core::hash::Hash::hash(__field_0, __state);
::core::hash::Hash::hash(__field_1, __state);
}
TyKind::UnsafeBinder(ref __field_0) => {
::core::hash::Hash::hash(&::core::mem::discriminant(self),
__state);
::core::hash::Hash::hash(__field_0, __state);
}
TyKind::Dynamic(ref __field_0, ref __field_1) => {
::core::hash::Hash::hash(&::core::mem::discriminant(self),
__state);
::core::hash::Hash::hash(__field_0, __state);
::core::hash::Hash::hash(__field_1, __state);
}
TyKind::Closure(ref __field_0, ref __field_1) => {
::core::hash::Hash::hash(&::core::mem::discriminant(self),
__state);
::core::hash::Hash::hash(__field_0, __state);
::core::hash::Hash::hash(__field_1, __state);
}
TyKind::CoroutineClosure(ref __field_0, ref __field_1) => {
::core::hash::Hash::hash(&::core::mem::discriminant(self),
__state);
::core::hash::Hash::hash(__field_0, __state);
::core::hash::Hash::hash(__field_1, __state);
}
TyKind::Coroutine(ref __field_0, ref __field_1) => {
::core::hash::Hash::hash(&::core::mem::discriminant(self),
__state);
::core::hash::Hash::hash(__field_0, __state);
::core::hash::Hash::hash(__field_1, __state);
}
TyKind::CoroutineWitness(ref __field_0, ref __field_1) => {
::core::hash::Hash::hash(&::core::mem::discriminant(self),
__state);
::core::hash::Hash::hash(__field_0, __state);
::core::hash::Hash::hash(__field_1, __state);
}
TyKind::Never => {
::core::hash::Hash::hash(&::core::mem::discriminant(self),
__state);
}
TyKind::Tuple(ref __field_0) => {
::core::hash::Hash::hash(&::core::mem::discriminant(self),
__state);
::core::hash::Hash::hash(__field_0, __state);
}
TyKind::Alias(ref __field_0, ref __field_1) => {
::core::hash::Hash::hash(&::core::mem::discriminant(self),
__state);
::core::hash::Hash::hash(__field_0, __state);
::core::hash::Hash::hash(__field_1, __state);
}
TyKind::Param(ref __field_0) => {
::core::hash::Hash::hash(&::core::mem::discriminant(self),
__state);
::core::hash::Hash::hash(__field_0, __state);
}
TyKind::Bound(ref __field_0, ref __field_1) => {
::core::hash::Hash::hash(&::core::mem::discriminant(self),
__state);
::core::hash::Hash::hash(__field_0, __state);
::core::hash::Hash::hash(__field_1, __state);
}
TyKind::Placeholder(ref __field_0) => {
::core::hash::Hash::hash(&::core::mem::discriminant(self),
__state);
::core::hash::Hash::hash(__field_0, __state);
}
TyKind::Infer(ref __field_0) => {
::core::hash::Hash::hash(&::core::mem::discriminant(self),
__state);
::core::hash::Hash::hash(__field_0, __state);
}
TyKind::Error(ref __field_0) => {
::core::hash::Hash::hash(&::core::mem::discriminant(self),
__state);
::core::hash::Hash::hash(__field_0, __state);
}
}
}
}
#[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)]
152#[derive(const _: () =
{
unsafe impl<I: Interner, __V>
::rustc_type_ir::GenericTypeVisitable<__V> for TyKind<I> where
IntTy: ::rustc_type_ir::GenericTypeVisitable<__V>,
UintTy: ::rustc_type_ir::GenericTypeVisitable<__V>,
FloatTy: ::rustc_type_ir::GenericTypeVisitable<__V>,
I::AdtDef: ::rustc_type_ir::GenericTypeVisitable<__V>,
I::GenericArgs: ::rustc_type_ir::GenericTypeVisitable<__V>,
I::ForeignId: ::rustc_type_ir::GenericTypeVisitable<__V>,
I::Ty: ::rustc_type_ir::GenericTypeVisitable<__V>,
Const<I>: ::rustc_type_ir::GenericTypeVisitable<__V>,
I::Ty: ::rustc_type_ir::GenericTypeVisitable<__V>,
I::Pat: ::rustc_type_ir::GenericTypeVisitable<__V>,
I::Ty: ::rustc_type_ir::GenericTypeVisitable<__V>,
I::Ty: ::rustc_type_ir::GenericTypeVisitable<__V>,
Mutability: ::rustc_type_ir::GenericTypeVisitable<__V>,
Region<I>: ::rustc_type_ir::GenericTypeVisitable<__V>,
I::Ty: ::rustc_type_ir::GenericTypeVisitable<__V>,
Mutability: ::rustc_type_ir::GenericTypeVisitable<__V>,
I::FunctionId: ::rustc_type_ir::GenericTypeVisitable<__V>,
ty::Binder<I,
I::GenericArgs>: ::rustc_type_ir::GenericTypeVisitable<__V>,
ty::Binder<I,
FnSigTys<I>>: ::rustc_type_ir::GenericTypeVisitable<__V>,
FnHeader<I>: ::rustc_type_ir::GenericTypeVisitable<__V>,
UnsafeBinderInner<I>: ::rustc_type_ir::GenericTypeVisitable<__V>,
I::BoundExistentialPredicates: ::rustc_type_ir::GenericTypeVisitable<__V>,
Region<I>: ::rustc_type_ir::GenericTypeVisitable<__V>,
I::ClosureId: ::rustc_type_ir::GenericTypeVisitable<__V>,
I::GenericArgs: ::rustc_type_ir::GenericTypeVisitable<__V>,
I::CoroutineClosureId: ::rustc_type_ir::GenericTypeVisitable<__V>,
I::GenericArgs: ::rustc_type_ir::GenericTypeVisitable<__V>,
I::CoroutineId: ::rustc_type_ir::GenericTypeVisitable<__V>,
I::GenericArgs: ::rustc_type_ir::GenericTypeVisitable<__V>,
I::CoroutineId: ::rustc_type_ir::GenericTypeVisitable<__V>,
I::GenericArgs: ::rustc_type_ir::GenericTypeVisitable<__V>,
I::Tys: ::rustc_type_ir::GenericTypeVisitable<__V>,
IsRigid: ::rustc_type_ir::GenericTypeVisitable<__V>,
AliasTy<I>: ::rustc_type_ir::GenericTypeVisitable<__V>,
I::ParamTy: ::rustc_type_ir::GenericTypeVisitable<__V>,
BoundVarIndexKind: ::rustc_type_ir::GenericTypeVisitable<__V>,
ty::BoundTy<I>: ::rustc_type_ir::GenericTypeVisitable<__V>,
ty::PlaceholderType<I>: ::rustc_type_ir::GenericTypeVisitable<__V>,
InferTy: ::rustc_type_ir::GenericTypeVisitable<__V>,
I::ErrorGuaranteed: ::rustc_type_ir::GenericTypeVisitable<__V> {
fn generic_visit_with(&self, __visitor: &mut __V) {
match *self {
TyKind::Bool => {}
TyKind::Char => {}
TyKind::Int(ref __binding_0) => {
{
::rustc_type_ir::GenericTypeVisitable::<__V>::generic_visit_with(__binding_0,
__visitor);
}
}
TyKind::Uint(ref __binding_0) => {
{
::rustc_type_ir::GenericTypeVisitable::<__V>::generic_visit_with(__binding_0,
__visitor);
}
}
TyKind::Float(ref __binding_0) => {
{
::rustc_type_ir::GenericTypeVisitable::<__V>::generic_visit_with(__binding_0,
__visitor);
}
}
TyKind::Adt(ref __binding_0, ref __binding_1) => {
{
::rustc_type_ir::GenericTypeVisitable::<__V>::generic_visit_with(__binding_0,
__visitor);
}
{
::rustc_type_ir::GenericTypeVisitable::<__V>::generic_visit_with(__binding_1,
__visitor);
}
}
TyKind::Foreign(ref __binding_0) => {
{
::rustc_type_ir::GenericTypeVisitable::<__V>::generic_visit_with(__binding_0,
__visitor);
}
}
TyKind::Str => {}
TyKind::Array(ref __binding_0, ref __binding_1) => {
{
::rustc_type_ir::GenericTypeVisitable::<__V>::generic_visit_with(__binding_0,
__visitor);
}
{
::rustc_type_ir::GenericTypeVisitable::<__V>::generic_visit_with(__binding_1,
__visitor);
}
}
TyKind::Pat(ref __binding_0, ref __binding_1) => {
{
::rustc_type_ir::GenericTypeVisitable::<__V>::generic_visit_with(__binding_0,
__visitor);
}
{
::rustc_type_ir::GenericTypeVisitable::<__V>::generic_visit_with(__binding_1,
__visitor);
}
}
TyKind::Slice(ref __binding_0) => {
{
::rustc_type_ir::GenericTypeVisitable::<__V>::generic_visit_with(__binding_0,
__visitor);
}
}
TyKind::RawPtr(ref __binding_0, ref __binding_1) => {
{
::rustc_type_ir::GenericTypeVisitable::<__V>::generic_visit_with(__binding_0,
__visitor);
}
{
::rustc_type_ir::GenericTypeVisitable::<__V>::generic_visit_with(__binding_1,
__visitor);
}
}
TyKind::Ref(ref __binding_0, ref __binding_1,
ref __binding_2) => {
{
::rustc_type_ir::GenericTypeVisitable::<__V>::generic_visit_with(__binding_0,
__visitor);
}
{
::rustc_type_ir::GenericTypeVisitable::<__V>::generic_visit_with(__binding_1,
__visitor);
}
{
::rustc_type_ir::GenericTypeVisitable::<__V>::generic_visit_with(__binding_2,
__visitor);
}
}
TyKind::FnDef(ref __binding_0, ref __binding_1) => {
{
::rustc_type_ir::GenericTypeVisitable::<__V>::generic_visit_with(__binding_0,
__visitor);
}
{
::rustc_type_ir::GenericTypeVisitable::<__V>::generic_visit_with(__binding_1,
__visitor);
}
}
TyKind::FnPtr(ref __binding_0, ref __binding_1) => {
{
::rustc_type_ir::GenericTypeVisitable::<__V>::generic_visit_with(__binding_0,
__visitor);
}
{
::rustc_type_ir::GenericTypeVisitable::<__V>::generic_visit_with(__binding_1,
__visitor);
}
}
TyKind::UnsafeBinder(ref __binding_0) => {
{
::rustc_type_ir::GenericTypeVisitable::<__V>::generic_visit_with(__binding_0,
__visitor);
}
}
TyKind::Dynamic(ref __binding_0, ref __binding_1) => {
{
::rustc_type_ir::GenericTypeVisitable::<__V>::generic_visit_with(__binding_0,
__visitor);
}
{
::rustc_type_ir::GenericTypeVisitable::<__V>::generic_visit_with(__binding_1,
__visitor);
}
}
TyKind::Closure(ref __binding_0, ref __binding_1) => {
{
::rustc_type_ir::GenericTypeVisitable::<__V>::generic_visit_with(__binding_0,
__visitor);
}
{
::rustc_type_ir::GenericTypeVisitable::<__V>::generic_visit_with(__binding_1,
__visitor);
}
}
TyKind::CoroutineClosure(ref __binding_0, ref __binding_1)
=> {
{
::rustc_type_ir::GenericTypeVisitable::<__V>::generic_visit_with(__binding_0,
__visitor);
}
{
::rustc_type_ir::GenericTypeVisitable::<__V>::generic_visit_with(__binding_1,
__visitor);
}
}
TyKind::Coroutine(ref __binding_0, ref __binding_1) => {
{
::rustc_type_ir::GenericTypeVisitable::<__V>::generic_visit_with(__binding_0,
__visitor);
}
{
::rustc_type_ir::GenericTypeVisitable::<__V>::generic_visit_with(__binding_1,
__visitor);
}
}
TyKind::CoroutineWitness(ref __binding_0, ref __binding_1)
=> {
{
::rustc_type_ir::GenericTypeVisitable::<__V>::generic_visit_with(__binding_0,
__visitor);
}
{
::rustc_type_ir::GenericTypeVisitable::<__V>::generic_visit_with(__binding_1,
__visitor);
}
}
TyKind::Never => {}
TyKind::Tuple(ref __binding_0) => {
{
::rustc_type_ir::GenericTypeVisitable::<__V>::generic_visit_with(__binding_0,
__visitor);
}
}
TyKind::Alias(ref __binding_0, ref __binding_1) => {
{
::rustc_type_ir::GenericTypeVisitable::<__V>::generic_visit_with(__binding_0,
__visitor);
}
{
::rustc_type_ir::GenericTypeVisitable::<__V>::generic_visit_with(__binding_1,
__visitor);
}
}
TyKind::Param(ref __binding_0) => {
{
::rustc_type_ir::GenericTypeVisitable::<__V>::generic_visit_with(__binding_0,
__visitor);
}
}
TyKind::Bound(ref __binding_0, ref __binding_1) => {
{
::rustc_type_ir::GenericTypeVisitable::<__V>::generic_visit_with(__binding_0,
__visitor);
}
{
::rustc_type_ir::GenericTypeVisitable::<__V>::generic_visit_with(__binding_1,
__visitor);
}
}
TyKind::Placeholder(ref __binding_0) => {
{
::rustc_type_ir::GenericTypeVisitable::<__V>::generic_visit_with(__binding_0,
__visitor);
}
}
TyKind::Infer(ref __binding_0) => {
{
::rustc_type_ir::GenericTypeVisitable::<__V>::generic_visit_with(__binding_0,
__visitor);
}
}
TyKind::Error(ref __binding_0) => {
{
::rustc_type_ir::GenericTypeVisitable::<__V>::generic_visit_with(__binding_0,
__visitor);
}
}
}
}
}
};GenericTypeVisitable)]
153#[cfg_attr(
154 feature = "nightly",
155 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>,
Const<I>: ::rustc_serialize::Encodable<__E>,
I::Pat: ::rustc_serialize::Encodable<__E>,
Region<I>: ::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>,
Const<I>: ::rustc_serialize::Decodable<__D>,
I::Pat: ::rustc_serialize::Decodable<__D>,
Region<I>: ::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,
Const<I>: ::rustc_data_structures::stable_hash::StableHash,
I::Pat: ::rustc_data_structures::stable_hash::StableHash,
Region<I>: ::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)
156)]
157pub enum TyKind<I: Interner> {
158 Bool,
160
161 Char,
164
165 Int(IntTy),
167
168 Uint(UintTy),
170
171 Float(FloatTy),
173
174 Adt(I::AdtDef, I::GenericArgs),
182
183 Foreign(I::ForeignId),
185
186 Str,
188
189 Array(I::Ty, Const<I>),
191
192 Pat(I::Ty, I::Pat),
200
201 Slice(I::Ty),
203
204 RawPtr(I::Ty, Mutability),
206
207 Ref(Region<I>, I::Ty, Mutability),
210
211 FnDef(I::FunctionId, ty::Binder<I, I::GenericArgs>),
224
225 FnPtr(ty::Binder<I, FnSigTys<I>>, FnHeader<I>),
244
245 UnsafeBinder(UnsafeBinderInner<I>),
251
252 Dynamic(I::BoundExistentialPredicates, Region<I>),
254
255 Closure(I::ClosureId, I::GenericArgs),
261
262 CoroutineClosure(I::CoroutineClosureId, I::GenericArgs),
270
271 Coroutine(I::CoroutineId, I::GenericArgs),
277
278 CoroutineWitness(I::CoroutineId, I::GenericArgs),
303
304 Never,
306
307 Tuple(I::Tys),
309
310 Alias(IsRigid, AliasTy<I>),
315
316 Param(I::ParamTy),
318
319 Bound(BoundVarIndexKind, ty::BoundTy<I>),
336
337 Placeholder(ty::PlaceholderType<I>),
346
347 Infer(InferTy),
354
355 Error(I::ErrorGuaranteed),
359}
360
361impl<I: Interner> Eq for TyKind<I> {}
362
363impl<I: Interner> TyKind<I> {
364 pub fn fn_sig(self, interner: I) -> ty::Binder<I, ty::FnSig<I>> {
365 self.unnormalized_fn_sig(interner).skip_normalization()
366 }
367
368 pub fn unnormalized_fn_sig(self, interner: I) -> Unnormalized<I, ty::Binder<I, ty::FnSig<I>>> {
369 match self {
370 ty::FnPtr(sig_tys, hdr) => Unnormalized::new_wip(sig_tys.with(hdr)),
371 ty::FnDef(def_id, args) => {
372 interner.fn_sig(def_id).instantiate(interner, args.no_bound_vars().unwrap())
373 }
374 ty::Error(_) => {
375 Unnormalized::dummy(ty::Binder::dummy(ty::FnSig::dummy()))
377 }
378 ty::Closure(..) => {
::core::panicking::panic_fmt(format_args!("to get the signature of a closure, use `args.as_closure().sig()` not `fn_sig()`"));
}panic!(
379 "to get the signature of a closure, use `args.as_closure().sig()` not `fn_sig()`",
380 ),
381 _ => {
::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),
382 }
383 }
384
385 pub fn is_known_rigid(self) -> bool {
393 match self {
394 ty::Bool
395 | ty::Char
396 | ty::Int(_)
397 | ty::Uint(_)
398 | ty::Float(_)
399 | ty::Adt(_, _)
400 | ty::Foreign(_)
401 | ty::Str
402 | ty::Array(_, _)
403 | ty::Pat(_, _)
404 | ty::Slice(_)
405 | ty::RawPtr(_, _)
406 | ty::Ref(_, _, _)
407 | ty::FnDef(_, _)
408 | ty::FnPtr(..)
409 | ty::UnsafeBinder(_)
410 | ty::Dynamic(_, _)
411 | ty::Closure(_, _)
412 | ty::CoroutineClosure(_, _)
413 | ty::Coroutine(_, _)
414 | ty::CoroutineWitness(..)
415 | ty::Never
416 | ty::Tuple(_) => true,
417
418 ty::Error(_)
419 | ty::Infer(_)
420 | ty::Alias(ty::IsRigid::No | ty::IsRigid::Yes, _)
421 | ty::Param(_)
422 | ty::Bound(_, _)
423 | ty::Placeholder(_) => false,
424 }
425 }
426}
427
428impl<I: Interner> fmt::Debug for TyKind<I> {
430 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
431 match self {
432 Bool => f.write_fmt(format_args!("bool"))write!(f, "bool"),
433 Char => f.write_fmt(format_args!("char"))write!(f, "char"),
434 Int(i) => f.write_fmt(format_args!("{0:?}", i))write!(f, "{i:?}"),
435 Uint(u) => f.write_fmt(format_args!("{0:?}", u))write!(f, "{u:?}"),
436 Float(float) => f.write_fmt(format_args!("{0:?}", float))write!(f, "{float:?}"),
437 Adt(d, s) => {
438 f.write_fmt(format_args!("{0:?}", d))write!(f, "{d:?}")?;
439 let mut s = s.iter();
440 let first = s.next();
441 match first {
442 Some(first) => f.write_fmt(format_args!("<{0:?}", first))write!(f, "<{:?}", first)?,
443 None => return Ok(()),
444 };
445
446 for arg in s {
447 f.write_fmt(format_args!(", {0:?}", arg))write!(f, ", {:?}", arg)?;
448 }
449
450 f.write_fmt(format_args!(">"))write!(f, ">")
451 }
452 Foreign(d) => f.debug_tuple("Foreign").field(d).finish(),
453 Str => f.write_fmt(format_args!("str"))write!(f, "str"),
454 Array(t, c) => f.write_fmt(format_args!("[{0:?}; {1:?}]", t, c))write!(f, "[{t:?}; {c:?}]"),
455 Pat(t, p) => f.write_fmt(format_args!("pattern_type!({0:?} is {1:?})", t, p))write!(f, "pattern_type!({t:?} is {p:?})"),
456 Slice(t) => f.write_fmt(format_args!("[{0:?}]", &t))write!(f, "[{:?}]", &t),
457 RawPtr(ty, mutbl) => f.write_fmt(format_args!("*{0} {1:?}", mutbl.ptr_str(), ty))write!(f, "*{} {:?}", mutbl.ptr_str(), ty),
458 Ref(r, t, m) => f.write_fmt(format_args!("&{0:?} {1}{2:?}", r, m.prefix_str(), t))write!(f, "&{:?} {}{:?}", r, m.prefix_str(), t),
459 FnDef(d, s) => f.debug_tuple("FnDef").field(d).field(&s).finish(),
460 FnPtr(sig_tys, hdr) => f.write_fmt(format_args!("{0:?}", sig_tys.with(*hdr)))write!(f, "{:?}", sig_tys.with(*hdr)),
461 UnsafeBinder(binder) => f.write_fmt(format_args!("{0:?}", binder))write!(f, "{:?}", binder),
463 Dynamic(p, r) => f.write_fmt(format_args!("dyn {0:?} + {1:?}", p, r))write!(f, "dyn {p:?} + {r:?}"),
464 Closure(d, s) => f.debug_tuple("Closure").field(d).field(&s).finish(),
465 CoroutineClosure(d, s) => f.debug_tuple("CoroutineClosure").field(d).field(&s).finish(),
466 Coroutine(d, s) => f.debug_tuple("Coroutine").field(d).field(&s).finish(),
467 CoroutineWitness(d, s) => f.debug_tuple("CoroutineWitness").field(d).field(&s).finish(),
468 Never => f.write_fmt(format_args!("!"))write!(f, "!"),
469 Tuple(t) => {
470 f.write_fmt(format_args!("("))write!(f, "(")?;
471 let mut count = 0;
472 for ty in t.iter() {
473 if count > 0 {
474 f.write_fmt(format_args!(", "))write!(f, ", ")?;
475 }
476 f.write_fmt(format_args!("{0:?}", ty))write!(f, "{ty:?}")?;
477 count += 1;
478 }
479 if count == 1 {
481 f.write_fmt(format_args!(","))write!(f, ",")?;
482 }
483 f.write_fmt(format_args!(")"))write!(f, ")")
484 }
485 Alias(is_rigid, a) => f.debug_tuple("Alias").field(&is_rigid).field(&a).finish(),
486 Param(p) => f.write_fmt(format_args!("{0:?}", p))write!(f, "{p:?}"),
487 Bound(d, b) => crate::debug_bound_var(f, *d, b),
488 Placeholder(p) => f.write_fmt(format_args!("{0:?}", p))write!(f, "{p:?}"),
489 Infer(t) => f.write_fmt(format_args!("{0:?}", t))write!(f, "{:?}", t),
490 TyKind::Error(_) => f.write_fmt(format_args!("{{type error}}"))write!(f, "{{type error}}"),
491 }
492 }
493}
494
495impl<I: Interner> AliasTy<I> {
496 pub fn new_from_args(interner: I, kind: AliasTyKind<I>, args: I::GenericArgs) -> AliasTy<I> {
497 if truecfg!(debug_assertions) {
498 interner.debug_assert_alias_term_args_compatible(kind.into(), args);
499 }
500 AliasTy { kind, args, _use_alias_new_instead: () }
501 }
502
503 pub fn new(
504 interner: I,
505 kind: AliasTyKind<I>,
506 args: impl IntoIterator<Item: Into<I::GenericArg>>,
507 ) -> AliasTy<I> {
508 let args = interner.mk_args_from_iter(args.into_iter().map(Into::into));
509 Self::new_from_args(interner, kind, args)
510 }
511
512 pub fn is_opaque(self) -> bool {
514 #[allow(non_exhaustive_omitted_patterns)] match self.kind {
AliasTyKind::Opaque { .. } => true,
_ => false,
}matches!(self.kind, AliasTyKind::Opaque { .. })
515 }
516
517 pub fn to_ty(self, interner: I, is_rigid: ty::IsRigid) -> I::Ty {
518 Ty::new_alias(interner, is_rigid, self)
519 }
520
521 pub fn try_to_projection(self) -> Option<ProjectionAliasTy<I>> {
522 self.kind.try_to_projection().map(|kind| ty::Alias {
523 kind,
524 args: self.args,
525 _use_alias_new_instead: (),
526 })
527 }
528
529 pub fn try_to_inherent(self) -> Option<InherentAliasTy<I>> {
530 self.kind.try_to_inherent().map(|kind| ty::Alias {
531 kind,
532 args: self.args,
533 _use_alias_new_instead: (),
534 })
535 }
536
537 pub fn try_to_opaque(self) -> Option<OpaqueAliasTy<I>> {
538 self.kind.try_to_opaque().map(|kind| ty::Alias {
539 kind,
540 args: self.args,
541 _use_alias_new_instead: (),
542 })
543 }
544
545 pub fn try_to_free(self) -> Option<FreeAliasTy<I>> {
546 self.kind.try_to_free().map(|kind| ty::Alias {
547 kind,
548 args: self.args,
549 _use_alias_new_instead: (),
550 })
551 }
552}
553
554impl<I: Interner> ProjectionAliasTy<I> {
555 pub fn new_projection_from_args(
556 interner: I,
557 kind: I::TraitAssocTyId,
558 args: I::GenericArgs,
559 ) -> Self {
560 interner.debug_assert_alias_term_args_compatible(
561 ty::AliasTermKind::ProjectionTy { def_id: kind },
562 args,
563 );
564 Self { kind, args, _use_alias_new_instead: () }
565 }
566
567 pub fn projection_to_alias_ty(self) -> AliasTy<I> {
568 AliasTy {
569 kind: AliasTyKind::Projection { def_id: self.kind },
570 args: self.args,
571 _use_alias_new_instead: (),
572 }
573 }
574
575 #[track_caller]
576 pub fn projection_self_ty(self) -> I::Ty {
577 self.args.type_at(0)
578 }
579}
580
581impl<I: Interner> AliasTy<I> {
585 #[track_caller]
586 pub fn self_ty(self) -> I::Ty {
587 self.args.type_at(0)
588 }
589
590 pub fn with_replaced_self_ty(self, interner: I, self_ty: I::Ty) -> Self {
591 AliasTy::new(
592 interner,
593 self.kind,
594 [self_ty.into()].into_iter().chain(self.args.iter().skip(1)),
595 )
596 }
597
598 pub fn trait_def_id(self, interner: I) -> I::TraitId {
599 let AliasTyKind::Projection { def_id } = self.kind else { { ::core::panicking::panic_fmt(format_args!("expected a projection")); }panic!("expected a projection") };
600
601 interner.projection_parent(def_id.into())
602 }
603
604 pub fn trait_ref_and_own_args(self, interner: I) -> (ty::TraitRef<I>, I::GenericArgsSlice) {
610 let AliasTyKind::Projection { def_id } = self.kind else { { ::core::panicking::panic_fmt(format_args!("expected a projection")); }panic!("expected a projection") };
611
612 interner.trait_ref_and_own_args_for_alias(def_id.into(), self.args)
613 }
614
615 pub fn trait_ref(self, interner: I) -> ty::TraitRef<I> {
624 self.trait_ref_and_own_args(interner).0
625 }
626}
627
628impl<I: Interner> InherentAliasTy<I> {
629 pub fn new_inherent_from_args(
630 interner: I,
631 kind: I::InherentAssocTyId,
632 args: I::GenericArgs,
633 ) -> Self {
634 interner.debug_assert_alias_term_args_compatible(
635 ty::AliasTermKind::InherentTy { def_id: kind },
636 args,
637 );
638 Self { kind, args, _use_alias_new_instead: () }
639 }
640
641 pub fn inherent_to_alias_ty(self) -> AliasTy<I> {
642 AliasTy {
643 kind: AliasTyKind::Inherent { def_id: self.kind },
644 args: self.args,
645 _use_alias_new_instead: (),
646 }
647 }
648}
649
650impl<I: Interner> OpaqueAliasTy<I> {
651 pub fn new_opaque_from_args(interner: I, kind: I::OpaqueTyId, args: I::GenericArgs) -> Self {
652 interner.debug_assert_alias_term_args_compatible(
653 ty::AliasTermKind::OpaqueTy { def_id: kind },
654 args,
655 );
656 Self { kind, args, _use_alias_new_instead: () }
657 }
658
659 pub fn opaque_to_alias_ty(self) -> AliasTy<I> {
660 AliasTy {
661 kind: AliasTyKind::Opaque { def_id: self.kind },
662 args: self.args,
663 _use_alias_new_instead: (),
664 }
665 }
666}
667
668impl<I: Interner> FreeAliasTy<I> {
669 pub fn new_free_from_args(interner: I, kind: I::FreeTyAliasId, args: I::GenericArgs) -> Self {
670 interner.debug_assert_alias_term_args_compatible(
671 ty::AliasTermKind::FreeTy { def_id: kind },
672 args,
673 );
674 Self { kind, args, _use_alias_new_instead: () }
675 }
676
677 pub fn free_to_alias_ty(self) -> AliasTy<I> {
678 AliasTy {
679 kind: AliasTyKind::Free { def_id: self.kind },
680 args: self.args,
681 _use_alias_new_instead: (),
682 }
683 }
684}
685
686#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for IntVarValue { }
#[automatically_derived]
impl ::core::clone::Clone for IntVarValue {
#[inline]
fn clone(&self) -> Self {
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::marker::StructuralPartialEq for IntVarValue { }
#[automatically_derived]
impl ::core::cmp::PartialEq for IntVarValue {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other) &&
match (self, other) {
(Self::IntType(__self_0), Self::IntType(__arg1_0)) =>
__self_0 == __arg1_0,
(Self::UintType(__self_0), Self::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 {
Self::Unknown => ::core::fmt::Formatter::write_str(f, "Unknown"),
Self::IntType(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"IntType", &__self_0),
Self::UintType(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"UintType", &__self_0),
}
}
}Debug)]
687pub enum IntVarValue {
688 Unknown,
689 IntType(IntTy),
690 UintType(UintTy),
691}
692
693impl IntVarValue {
694 pub fn is_known(self) -> bool {
695 match self {
696 IntVarValue::IntType(_) | IntVarValue::UintType(_) => true,
697 IntVarValue::Unknown => false,
698 }
699 }
700
701 pub fn is_unknown(self) -> bool {
702 !self.is_known()
703 }
704}
705
706#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for FloatVarValue { }
#[automatically_derived]
impl ::core::clone::Clone for FloatVarValue {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<FloatTy>;
*self
}
}Clone, #[automatically_derived]
impl ::core::marker::Copy for FloatVarValue { }Copy, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for FloatVarValue { }
#[automatically_derived]
impl ::core::cmp::PartialEq for FloatVarValue {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other) &&
match (self, other) {
(Self::Known(__self_0), Self::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 {
Self::Unknown => ::core::fmt::Formatter::write_str(f, "Unknown"),
Self::Known(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Known",
&__self_0),
}
}
}Debug)]
707pub enum FloatVarValue {
708 Unknown,
709 Known(FloatTy),
710}
711
712impl FloatVarValue {
713 pub fn is_known(self) -> bool {
714 match self {
715 FloatVarValue::Known(_) => true,
716 FloatVarValue::Unknown => false,
717 }
718 }
719
720 pub fn is_unknown(self) -> bool {
721 !self.is_known()
722 }
723}
724
725#[automatically_derived]
impl ::core::marker::Copy for TyVid { }
impl TyVid {
#[doc = r" Maximum value the index can take, as a `u32`."]
pub const MAX_AS_U32: u32 = 0xFFFF_FF00;
#[doc = r" Maximum value the index can take."]
pub const MAX: Self = Self::from_u32(0xFFFF_FF00);
#[doc = r" Zero value of the index."]
pub const ZERO: Self = Self::from_u32(0);
#[doc = r" Creates a new index from a given `usize`."]
#[doc = r""]
#[doc = r" # Panics"]
#[doc = r""]
#[doc = r" Will panic if `value` exceeds `MAX`."]
#[inline]
pub const fn from_usize(value: usize) -> Self {
if !(value <= (0xFFFF_FF00 as usize)) {
::core::panicking::panic("assertion failed: value <= (0xFFFF_FF00 as usize)")
};
unsafe { Self::from_u32_unchecked(value as u32) }
}
#[doc = r" Creates a new index from a given `u32`."]
#[doc = r""]
#[doc = r" # Panics"]
#[doc = r""]
#[doc = r" Will panic if `value` exceeds `MAX`."]
#[inline]
pub const fn from_u32(value: u32) -> Self {
if !(value <= 0xFFFF_FF00) {
::core::panicking::panic("assertion failed: value <= 0xFFFF_FF00")
};
unsafe { Self::from_u32_unchecked(value) }
}
#[doc = r" Creates a new index from a given `u16`."]
#[doc = r""]
#[doc = r" # Panics"]
#[doc = r""]
#[doc = r" Will panic if `value` exceeds `MAX`."]
#[inline]
pub const fn from_u16(value: u16) -> Self {
let value = value as u32;
if !(value <= 0xFFFF_FF00) {
::core::panicking::panic("assertion failed: value <= 0xFFFF_FF00")
};
unsafe { Self::from_u32_unchecked(value) }
}
#[doc = r" Creates a new index from a given `u32`."]
#[doc = r""]
#[doc = r" # Safety"]
#[doc = r""]
#[doc =
r" The provided value must be less than or equal to the maximum value for the newtype."]
#[doc =
r" Providing a value outside this range is undefined due to layout restrictions."]
#[doc = r""]
#[doc = r" Prefer using `from_u32`."]
#[inline]
pub const unsafe fn from_u32_unchecked(value: u32) -> Self {
Self {
private_use_as_methods_instead: unsafe {
std::mem::transmute(value)
},
}
}
#[doc = r" Extracts the value of this index as a `usize`."]
#[inline]
pub const fn index(self) -> usize { self.as_usize() }
#[doc = r" Extracts the value of this index as a `u32`."]
#[inline]
pub const fn as_u32(self) -> u32 {
unsafe { std::mem::transmute(self.private_use_as_methods_instead) }
}
#[doc = r" Extracts the value of this index as a `usize`."]
#[inline]
pub const fn as_usize(self) -> usize { self.as_u32() as usize }
}
impl std::ops::Add<usize> for TyVid {
type Output = Self;
#[inline]
fn add(self, other: usize) -> Self {
Self::from_usize(self.index() + other)
}
}
impl std::ops::AddAssign<usize> for TyVid {
#[inline]
fn add_assign(&mut self, other: usize) { *self = *self + other; }
}
impl rustc_index::Idx for TyVid {
#[inline]
fn new(value: usize) -> Self { Self::from_usize(value) }
#[inline]
fn index(self) -> usize { self.as_usize() }
}
impl ::std::iter::Step for TyVid {
#[inline]
fn steps_between(start: &Self, end: &Self) -> (usize, Option<usize>) {
<usize as
::std::iter::Step>::steps_between(&Self::index(*start),
&Self::index(*end))
}
#[inline]
fn forward_checked(start: Self, u: usize) -> Option<Self> {
Self::index(start).checked_add(u).map(Self::from_usize)
}
#[inline]
fn backward_checked(start: Self, u: usize) -> Option<Self> {
Self::index(start).checked_sub(u).map(Self::from_usize)
}
#[inline]
fn forward_overflowing(start: Self, u: usize) -> (Self, bool) {
let (s, o) = Self::index(start).overflowing_add(u);
(Self::from_usize(s), o)
}
#[inline]
fn backward_overflowing(start: Self, u: usize) -> (Self, bool) {
let (s, o) = Self::index(start).overflowing_sub(u);
(Self::from_usize(s), o)
}
}
impl ::std::cmp::Ord for TyVid {
#[inline]
fn cmp(&self, other: &Self) -> std::cmp::Ordering {
self.as_u32().cmp(&other.as_u32())
}
}
impl ::std::cmp::PartialOrd for TyVid {
#[inline]
fn partial_cmp(&self, other: &Self) -> Option<std::cmp::Ordering> {
Some(self.cmp(other))
}
}
impl From<TyVid> for u32 {
#[inline]
fn from(v: TyVid) -> u32 { v.as_u32() }
}
impl From<TyVid> for usize {
#[inline]
fn from(v: TyVid) -> usize { v.as_usize() }
}
impl From<usize> for TyVid {
#[inline]
fn from(value: usize) -> Self { Self::from_usize(value) }
}
impl From<u32> for TyVid {
#[inline]
fn from(value: u32) -> Self { Self::from_u32(value) }
}
impl ::std::cmp::Eq for TyVid {}
impl ::std::cmp::PartialEq for TyVid {
fn eq(&self, other: &Self) -> bool { self.as_u32().eq(&other.as_u32()) }
}
impl ::std::marker::StructuralPartialEq for TyVid { }
impl ::std::hash::Hash for TyVid {
fn hash<H: ::std::hash::Hasher>(&self, state: &mut H) {
self.as_u32().hash(state)
}
}
impl<D: ::rustc_serialize::Decoder> ::rustc_serialize::Decodable<D> for TyVid
{
fn decode(d: &mut D) -> Self { Self::from_u32(d.read_u32()) }
}
impl<E: ::rustc_serialize::Encoder> ::rustc_serialize::Encodable<E> for TyVid
{
fn encode(&self, e: &mut E) { e.emit_u32(self.as_u32()); }
}
impl ::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! {
726 #[encodable]
728 #[orderable]
729 #[debug_format = "?{}t"]
730 #[gate_rustc_only]
731 pub struct TyVid {}
732}
733
734#[automatically_derived]
impl ::core::marker::Copy for IntVid { }
impl IntVid {
#[doc = r" Maximum value the index can take, as a `u32`."]
pub const MAX_AS_U32: u32 = 0xFFFF_FF00;
#[doc = r" Maximum value the index can take."]
pub const MAX: Self = Self::from_u32(0xFFFF_FF00);
#[doc = r" Zero value of the index."]
pub const ZERO: Self = Self::from_u32(0);
#[doc = r" Creates a new index from a given `usize`."]
#[doc = r""]
#[doc = r" # Panics"]
#[doc = r""]
#[doc = r" Will panic if `value` exceeds `MAX`."]
#[inline]
pub const fn from_usize(value: usize) -> Self {
if !(value <= (0xFFFF_FF00 as usize)) {
::core::panicking::panic("assertion failed: value <= (0xFFFF_FF00 as usize)")
};
unsafe { Self::from_u32_unchecked(value as u32) }
}
#[doc = r" Creates a new index from a given `u32`."]
#[doc = r""]
#[doc = r" # Panics"]
#[doc = r""]
#[doc = r" Will panic if `value` exceeds `MAX`."]
#[inline]
pub const fn from_u32(value: u32) -> Self {
if !(value <= 0xFFFF_FF00) {
::core::panicking::panic("assertion failed: value <= 0xFFFF_FF00")
};
unsafe { Self::from_u32_unchecked(value) }
}
#[doc = r" Creates a new index from a given `u16`."]
#[doc = r""]
#[doc = r" # Panics"]
#[doc = r""]
#[doc = r" Will panic if `value` exceeds `MAX`."]
#[inline]
pub const fn from_u16(value: u16) -> Self {
let value = value as u32;
if !(value <= 0xFFFF_FF00) {
::core::panicking::panic("assertion failed: value <= 0xFFFF_FF00")
};
unsafe { Self::from_u32_unchecked(value) }
}
#[doc = r" Creates a new index from a given `u32`."]
#[doc = r""]
#[doc = r" # Safety"]
#[doc = r""]
#[doc =
r" The provided value must be less than or equal to the maximum value for the newtype."]
#[doc =
r" Providing a value outside this range is undefined due to layout restrictions."]
#[doc = r""]
#[doc = r" Prefer using `from_u32`."]
#[inline]
pub const unsafe fn from_u32_unchecked(value: u32) -> Self {
Self {
private_use_as_methods_instead: unsafe {
std::mem::transmute(value)
},
}
}
#[doc = r" Extracts the value of this index as a `usize`."]
#[inline]
pub const fn index(self) -> usize { self.as_usize() }
#[doc = r" Extracts the value of this index as a `u32`."]
#[inline]
pub const fn as_u32(self) -> u32 {
unsafe { std::mem::transmute(self.private_use_as_methods_instead) }
}
#[doc = r" Extracts the value of this index as a `usize`."]
#[inline]
pub const fn as_usize(self) -> usize { self.as_u32() as usize }
}
impl std::ops::Add<usize> for IntVid {
type Output = Self;
#[inline]
fn add(self, other: usize) -> Self {
Self::from_usize(self.index() + other)
}
}
impl std::ops::AddAssign<usize> for IntVid {
#[inline]
fn add_assign(&mut self, other: usize) { *self = *self + other; }
}
impl rustc_index::Idx for IntVid {
#[inline]
fn new(value: usize) -> Self { Self::from_usize(value) }
#[inline]
fn index(self) -> usize { self.as_usize() }
}
impl ::std::iter::Step for IntVid {
#[inline]
fn steps_between(start: &Self, end: &Self) -> (usize, Option<usize>) {
<usize as
::std::iter::Step>::steps_between(&Self::index(*start),
&Self::index(*end))
}
#[inline]
fn forward_checked(start: Self, u: usize) -> Option<Self> {
Self::index(start).checked_add(u).map(Self::from_usize)
}
#[inline]
fn backward_checked(start: Self, u: usize) -> Option<Self> {
Self::index(start).checked_sub(u).map(Self::from_usize)
}
#[inline]
fn forward_overflowing(start: Self, u: usize) -> (Self, bool) {
let (s, o) = Self::index(start).overflowing_add(u);
(Self::from_usize(s), o)
}
#[inline]
fn backward_overflowing(start: Self, u: usize) -> (Self, bool) {
let (s, o) = Self::index(start).overflowing_sub(u);
(Self::from_usize(s), o)
}
}
impl ::std::cmp::Ord for IntVid {
#[inline]
fn cmp(&self, other: &Self) -> std::cmp::Ordering {
self.as_u32().cmp(&other.as_u32())
}
}
impl ::std::cmp::PartialOrd for IntVid {
#[inline]
fn partial_cmp(&self, other: &Self) -> Option<std::cmp::Ordering> {
Some(self.cmp(other))
}
}
impl From<IntVid> for u32 {
#[inline]
fn from(v: IntVid) -> u32 { v.as_u32() }
}
impl From<IntVid> for usize {
#[inline]
fn from(v: IntVid) -> usize { v.as_usize() }
}
impl From<usize> for IntVid {
#[inline]
fn from(value: usize) -> Self { Self::from_usize(value) }
}
impl From<u32> for IntVid {
#[inline]
fn from(value: u32) -> Self { Self::from_u32(value) }
}
impl ::std::cmp::Eq for IntVid {}
impl ::std::cmp::PartialEq for IntVid {
fn eq(&self, other: &Self) -> bool { self.as_u32().eq(&other.as_u32()) }
}
impl ::std::marker::StructuralPartialEq for IntVid { }
impl ::std::hash::Hash for IntVid {
fn hash<H: ::std::hash::Hasher>(&self, state: &mut H) {
self.as_u32().hash(state)
}
}
impl<D: ::rustc_serialize::Decoder> ::rustc_serialize::Decodable<D> for IntVid
{
fn decode(d: &mut D) -> Self { Self::from_u32(d.read_u32()) }
}
impl<E: ::rustc_serialize::Encoder> ::rustc_serialize::Encodable<E> for IntVid
{
fn encode(&self, e: &mut E) { e.emit_u32(self.as_u32()); }
}
impl ::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! {
735 #[encodable]
737 #[orderable]
738 #[debug_format = "?{}i"]
739 #[gate_rustc_only]
740 pub struct IntVid {}
741}
742
743#[automatically_derived]
impl ::core::marker::Copy for FloatVid { }
impl FloatVid {
#[doc = r" Maximum value the index can take, as a `u32`."]
pub const MAX_AS_U32: u32 = 0xFFFF_FF00;
#[doc = r" Maximum value the index can take."]
pub const MAX: Self = Self::from_u32(0xFFFF_FF00);
#[doc = r" Zero value of the index."]
pub const ZERO: Self = Self::from_u32(0);
#[doc = r" Creates a new index from a given `usize`."]
#[doc = r""]
#[doc = r" # Panics"]
#[doc = r""]
#[doc = r" Will panic if `value` exceeds `MAX`."]
#[inline]
pub const fn from_usize(value: usize) -> Self {
if !(value <= (0xFFFF_FF00 as usize)) {
::core::panicking::panic("assertion failed: value <= (0xFFFF_FF00 as usize)")
};
unsafe { Self::from_u32_unchecked(value as u32) }
}
#[doc = r" Creates a new index from a given `u32`."]
#[doc = r""]
#[doc = r" # Panics"]
#[doc = r""]
#[doc = r" Will panic if `value` exceeds `MAX`."]
#[inline]
pub const fn from_u32(value: u32) -> Self {
if !(value <= 0xFFFF_FF00) {
::core::panicking::panic("assertion failed: value <= 0xFFFF_FF00")
};
unsafe { Self::from_u32_unchecked(value) }
}
#[doc = r" Creates a new index from a given `u16`."]
#[doc = r""]
#[doc = r" # Panics"]
#[doc = r""]
#[doc = r" Will panic if `value` exceeds `MAX`."]
#[inline]
pub const fn from_u16(value: u16) -> Self {
let value = value as u32;
if !(value <= 0xFFFF_FF00) {
::core::panicking::panic("assertion failed: value <= 0xFFFF_FF00")
};
unsafe { Self::from_u32_unchecked(value) }
}
#[doc = r" Creates a new index from a given `u32`."]
#[doc = r""]
#[doc = r" # Safety"]
#[doc = r""]
#[doc =
r" The provided value must be less than or equal to the maximum value for the newtype."]
#[doc =
r" Providing a value outside this range is undefined due to layout restrictions."]
#[doc = r""]
#[doc = r" Prefer using `from_u32`."]
#[inline]
pub const unsafe fn from_u32_unchecked(value: u32) -> Self {
Self {
private_use_as_methods_instead: unsafe {
std::mem::transmute(value)
},
}
}
#[doc = r" Extracts the value of this index as a `usize`."]
#[inline]
pub const fn index(self) -> usize { self.as_usize() }
#[doc = r" Extracts the value of this index as a `u32`."]
#[inline]
pub const fn as_u32(self) -> u32 {
unsafe { std::mem::transmute(self.private_use_as_methods_instead) }
}
#[doc = r" Extracts the value of this index as a `usize`."]
#[inline]
pub const fn as_usize(self) -> usize { self.as_u32() as usize }
}
impl std::ops::Add<usize> for FloatVid {
type Output = Self;
#[inline]
fn add(self, other: usize) -> Self {
Self::from_usize(self.index() + other)
}
}
impl std::ops::AddAssign<usize> for FloatVid {
#[inline]
fn add_assign(&mut self, other: usize) { *self = *self + other; }
}
impl rustc_index::Idx for FloatVid {
#[inline]
fn new(value: usize) -> Self { Self::from_usize(value) }
#[inline]
fn index(self) -> usize { self.as_usize() }
}
impl ::std::iter::Step for FloatVid {
#[inline]
fn steps_between(start: &Self, end: &Self) -> (usize, Option<usize>) {
<usize as
::std::iter::Step>::steps_between(&Self::index(*start),
&Self::index(*end))
}
#[inline]
fn forward_checked(start: Self, u: usize) -> Option<Self> {
Self::index(start).checked_add(u).map(Self::from_usize)
}
#[inline]
fn backward_checked(start: Self, u: usize) -> Option<Self> {
Self::index(start).checked_sub(u).map(Self::from_usize)
}
#[inline]
fn forward_overflowing(start: Self, u: usize) -> (Self, bool) {
let (s, o) = Self::index(start).overflowing_add(u);
(Self::from_usize(s), o)
}
#[inline]
fn backward_overflowing(start: Self, u: usize) -> (Self, bool) {
let (s, o) = Self::index(start).overflowing_sub(u);
(Self::from_usize(s), o)
}
}
impl ::std::cmp::Ord for FloatVid {
#[inline]
fn cmp(&self, other: &Self) -> std::cmp::Ordering {
self.as_u32().cmp(&other.as_u32())
}
}
impl ::std::cmp::PartialOrd for FloatVid {
#[inline]
fn partial_cmp(&self, other: &Self) -> Option<std::cmp::Ordering> {
Some(self.cmp(other))
}
}
impl From<FloatVid> for u32 {
#[inline]
fn from(v: FloatVid) -> u32 { v.as_u32() }
}
impl From<FloatVid> for usize {
#[inline]
fn from(v: FloatVid) -> usize { v.as_usize() }
}
impl From<usize> for FloatVid {
#[inline]
fn from(value: usize) -> Self { Self::from_usize(value) }
}
impl From<u32> for FloatVid {
#[inline]
fn from(value: u32) -> Self { Self::from_u32(value) }
}
impl ::std::cmp::Eq for FloatVid {}
impl ::std::cmp::PartialEq for FloatVid {
fn eq(&self, other: &Self) -> bool { self.as_u32().eq(&other.as_u32()) }
}
impl ::std::marker::StructuralPartialEq for FloatVid { }
impl ::std::hash::Hash for FloatVid {
fn hash<H: ::std::hash::Hasher>(&self, state: &mut H) {
self.as_u32().hash(state)
}
}
impl<D: ::rustc_serialize::Decoder> ::rustc_serialize::Decodable<D> for
FloatVid {
fn decode(d: &mut D) -> Self { Self::from_u32(d.read_u32()) }
}
impl<E: ::rustc_serialize::Encoder> ::rustc_serialize::Encodable<E> for
FloatVid {
fn encode(&self, e: &mut E) { e.emit_u32(self.as_u32()); }
}
impl ::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! {
744 #[encodable]
746 #[orderable]
747 #[debug_format = "?{}f"]
748 #[gate_rustc_only]
749 pub struct FloatVid {}
750}
751
752#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for InferTy { }
#[automatically_derived]
impl ::core::clone::Clone for InferTy {
#[inline]
fn clone(&self) -> Self {
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::marker::StructuralPartialEq for InferTy { }
#[automatically_derived]
impl ::core::cmp::PartialEq for InferTy {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other) &&
match (self, other) {
(Self::TyVar(__self_0), Self::TyVar(__arg1_0)) =>
__self_0 == __arg1_0,
(Self::IntVar(__self_0), Self::IntVar(__arg1_0)) =>
__self_0 == __arg1_0,
(Self::FloatVar(__self_0), Self::FloatVar(__arg1_0)) =>
__self_0 == __arg1_0,
(Self::FreshTy(__self_0), Self::FreshTy(__arg1_0)) =>
__self_0 == __arg1_0,
(Self::FreshIntTy(__self_0), Self::FreshIntTy(__arg1_0)) =>
__self_0 == __arg1_0,
(Self::FreshFloatTy(__self_0), Self::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: &Self)
-> ::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: &Self) -> ::core::cmp::Ordering {
match (self, other) {
(Self::TyVar(__self_0), Self::TyVar(__arg1_0)) =>
::core::cmp::Ord::cmp(__self_0, __arg1_0),
(Self::IntVar(__self_0), Self::IntVar(__arg1_0)) =>
::core::cmp::Ord::cmp(__self_0, __arg1_0),
(Self::FloatVar(__self_0), Self::FloatVar(__arg1_0)) =>
::core::cmp::Ord::cmp(__self_0, __arg1_0),
(Self::FreshTy(__self_0), Self::FreshTy(__arg1_0)) =>
::core::cmp::Ord::cmp(__self_0, __arg1_0),
(Self::FreshIntTy(__self_0), Self::FreshIntTy(__arg1_0)) =>
::core::cmp::Ord::cmp(__self_0, __arg1_0),
(Self::FreshFloatTy(__self_0), Self::FreshFloatTy(__arg1_0)) =>
::core::cmp::Ord::cmp(__self_0, __arg1_0),
_ =>
::core::cmp::Ord::cmp(&::core::intrinsics::discriminant_value(self),
&::core::intrinsics::discriminant_value(other)),
}
}
}Ord, #[automatically_derived]
impl ::core::hash::Hash for InferTy {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&::core::intrinsics::discriminant_value(self),
state);
match self {
Self::TyVar(__self_0) =>
::core::hash::Hash::hash(__self_0, state),
Self::IntVar(__self_0) =>
::core::hash::Hash::hash(__self_0, state),
Self::FloatVar(__self_0) =>
::core::hash::Hash::hash(__self_0, state),
Self::FreshTy(__self_0) =>
::core::hash::Hash::hash(__self_0, state),
Self::FreshIntTy(__self_0) =>
::core::hash::Hash::hash(__self_0, state),
Self::FreshFloatTy(__self_0) =>
::core::hash::Hash::hash(__self_0, state),
}
}
}Hash)]
758#[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))]
759pub enum InferTy {
760 TyVar(TyVid),
762 IntVar(IntVid),
769 FloatVar(FloatVid),
776
777 FreshTy(u32),
784 FreshIntTy(u32),
786 FreshFloatTy(u32),
788}
789
790impl UnifyValue for IntVarValue {
791 type Error = NoError;
792
793 fn unify_values(value1: &Self, value2: &Self) -> Result<Self, Self::Error> {
794 match (*value1, *value2) {
795 (IntVarValue::Unknown, IntVarValue::Unknown) => Ok(IntVarValue::Unknown),
796 (
797 IntVarValue::Unknown,
798 known @ (IntVarValue::UintType(_) | IntVarValue::IntType(_)),
799 )
800 | (
801 known @ (IntVarValue::UintType(_) | IntVarValue::IntType(_)),
802 IntVarValue::Unknown,
803 ) => Ok(known),
804 _ => {
::core::panicking::panic_fmt(format_args!("differing ints should have been resolved first"));
}panic!("differing ints should have been resolved first"),
805 }
806 }
807}
808
809impl UnifyKey for IntVid {
810 type Value = IntVarValue;
811 #[inline] fn index(&self) -> u32 {
813 self.as_u32()
814 }
815 #[inline]
816 fn from_index(i: u32) -> IntVid {
817 IntVid::from_u32(i)
818 }
819 fn tag() -> &'static str {
820 "IntVid"
821 }
822}
823
824impl UnifyValue for FloatVarValue {
825 type Error = NoError;
826
827 fn unify_values(value1: &Self, value2: &Self) -> Result<Self, Self::Error> {
828 match (*value1, *value2) {
829 (FloatVarValue::Unknown, FloatVarValue::Unknown) => Ok(FloatVarValue::Unknown),
830 (FloatVarValue::Unknown, FloatVarValue::Known(known))
831 | (FloatVarValue::Known(known), FloatVarValue::Unknown) => {
832 Ok(FloatVarValue::Known(known))
833 }
834 (FloatVarValue::Known(_), FloatVarValue::Known(_)) => {
835 {
::core::panicking::panic_fmt(format_args!("differing floats should have been resolved first"));
}panic!("differing floats should have been resolved first")
836 }
837 }
838 }
839}
840
841impl UnifyKey for FloatVid {
842 type Value = FloatVarValue;
843 #[inline]
844 fn index(&self) -> u32 {
845 self.as_u32()
846 }
847 #[inline]
848 fn from_index(i: u32) -> FloatVid {
849 FloatVid::from_u32(i)
850 }
851 fn tag() -> &'static str {
852 "FloatVid"
853 }
854}
855
856#[cfg(feature = "nightly")]
857impl StableHash for InferTy {
858 fn stable_hash<Hcx: StableHashCtxt>(&self, hcx: &mut Hcx, hasher: &mut StableHasher) {
859 use InferTy::*;
860 std::mem::discriminant(self).stable_hash(hcx, hasher);
861 match self {
862 TyVar(_) | IntVar(_) | FloatVar(_) => {
863 {
::core::panicking::panic_fmt(format_args!("type variables should not be hashed: {0:?}",
self));
}panic!("type variables should not be hashed: {self:?}")
864 }
865 FreshTy(v) | FreshIntTy(v) | FreshFloatTy(v) => v.stable_hash(hcx, hasher),
866 }
867 }
868}
869
870impl fmt::Display for InferTy {
871 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
872 use InferTy::*;
873 match *self {
874 TyVar(_) => f.write_fmt(format_args!("_"))write!(f, "_"),
875 IntVar(_) => f.write_fmt(format_args!("{0}", "{integer}"))write!(f, "{}", "{integer}"),
876 FloatVar(_) => f.write_fmt(format_args!("{0}", "{float}"))write!(f, "{}", "{float}"),
877 FreshTy(v) => f.write_fmt(format_args!("FreshTy({0})", v))write!(f, "FreshTy({v})"),
878 FreshIntTy(v) => f.write_fmt(format_args!("FreshIntTy({0})", v))write!(f, "FreshIntTy({v})"),
879 FreshFloatTy(v) => f.write_fmt(format_args!("FreshFloatTy({0})", v))write!(f, "FreshFloatTy({v})"),
880 }
881 }
882}
883
884impl fmt::Debug for InferTy {
885 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
886 use InferTy::*;
887 match *self {
888 TyVar(ref v) => v.fmt(f),
889 IntVar(ref v) => v.fmt(f),
890 FloatVar(ref v) => v.fmt(f),
891 FreshTy(v) => f.write_fmt(format_args!("FreshTy({0:?})", v))write!(f, "FreshTy({v:?})"),
892 FreshIntTy(v) => f.write_fmt(format_args!("FreshIntTy({0:?})", v))write!(f, "FreshIntTy({v:?})"),
893 FreshFloatTy(v) => f.write_fmt(format_args!("FreshFloatTy({0:?})", v))write!(f, "FreshFloatTy({v:?})"),
894 }
895 }
896}
897
898#[automatically_derived]
impl<I: Interner> ::core::clone::Clone for TypeAndMut<I> where I: Interner {
#[inline]
fn clone(&self) -> Self { *self }
}
#[automatically_derived]
impl<I: Interner> ::core::marker::Copy for TypeAndMut<I> where I: Interner { }
#[automatically_derived]
impl<I: Interner> ::core::cmp::PartialEq for TypeAndMut<I> where I: Interner {
#[inline]
fn eq(&self, __other: &Self) -> ::core::primitive::bool {
match (self, __other) {
(TypeAndMut { ty: ref __field_ty, mutbl: ref __field_mutbl },
TypeAndMut {
ty: ref __other_field_ty, mutbl: ref __other_field_mutbl }) =>
true &&
::core::cmp::PartialEq::eq(__field_ty, __other_field_ty) &&
::core::cmp::PartialEq::eq(__field_mutbl,
__other_field_mutbl),
}
}
}
#[automatically_derived]
impl<I: Interner> ::core::hash::Hash for TypeAndMut<I> where I: Interner {
fn hash<__H: ::core::hash::Hasher>(&self, __state: &mut __H) {
match self {
TypeAndMut { ty: ref __field_ty, mutbl: ref __field_mutbl } => {
::core::hash::Hash::hash(__field_ty, __state);
::core::hash::Hash::hash(__field_mutbl, __state);
}
}
}
}
#[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)]
899#[cfg_attr(
900 feature = "nightly",
901 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) {
let TypeAndMut { ty: ref __binding_0, mutbl: ref __binding_1
} = *self;
::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)
902)]
903#[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, const _: () =
{
unsafe impl<I: Interner, __V>
::rustc_type_ir::GenericTypeVisitable<__V> for TypeAndMut<I> where
I::Ty: ::rustc_type_ir::GenericTypeVisitable<__V>,
Mutability: ::rustc_type_ir::GenericTypeVisitable<__V> {
fn generic_visit_with(&self, __visitor: &mut __V) {
match *self {
TypeAndMut { ty: ref __binding_0, mutbl: ref __binding_1 }
=> {
{
::rustc_type_ir::GenericTypeVisitable::<__V>::generic_visit_with(__binding_0,
__visitor);
}
{
::rustc_type_ir::GenericTypeVisitable::<__V>::generic_visit_with(__binding_1,
__visitor);
}
}
}
}
}
};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)]
904pub struct TypeAndMut<I: Interner> {
905 pub ty: I::Ty,
906 pub mutbl: Mutability,
907}
908
909impl<I: Interner> Eq for TypeAndMut<I> {}
910
911#[derive(#[automatically_derived]
impl ::core::fmt::Debug for SplattedArgIndexError {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::InvalidIndex { splatted_arg_index: __self_0 } =>
::core::fmt::Formatter::debug_struct_field1_finish(f,
"InvalidIndex", "splatted_arg_index", &__self_0),
Self::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]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for SplattedArgIndexError { }
#[automatically_derived]
impl ::core::clone::Clone for SplattedArgIndexError {
#[inline]
fn clone(&self) -> Self {
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::marker::StructuralPartialEq for SplattedArgIndexError { }
#[automatically_derived]
impl ::core::cmp::PartialEq for SplattedArgIndexError {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other) &&
match (self, other) {
(Self::InvalidIndex { splatted_arg_index: __self_0 },
Self::InvalidIndex { splatted_arg_index: __arg1_0 }) =>
__self_0 == __arg1_0,
(Self::OutOfBounds {
splatted_arg_index: __self_0, args_len: __self_1 },
Self::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)]
913pub enum SplattedArgIndexError {
914 InvalidIndex { splatted_arg_index: u8 },
918
919 OutOfBounds { splatted_arg_index: u8, args_len: u16 },
921}
922
923#[automatically_derived]
impl<I: Interner> ::core::marker::Copy for FnSigKind<I> where I: Interner { }
#[automatically_derived]
impl<I: Interner> ::core::clone::Clone for FnSigKind<I> where I: Interner {
#[inline]
fn clone(&self) -> Self { *self }
}
#[automatically_derived]
impl<I: Interner> ::core::cmp::PartialEq for FnSigKind<I> where I: Interner {
#[inline]
fn eq(&self, __other: &Self) -> ::core::primitive::bool {
match (self, __other) {
(FnSigKind {
flags: ref __field_flags,
splatted: ref __field_splatted,
_marker: ref __field__marker }, FnSigKind {
flags: ref __other_field_flags,
splatted: ref __other_field_splatted,
_marker: ref __other_field__marker }) =>
true &&
::core::cmp::PartialEq::eq(__field_flags,
__other_field_flags) &&
::core::cmp::PartialEq::eq(__field_splatted,
__other_field_splatted) &&
::core::cmp::PartialEq::eq(__field__marker,
__other_field__marker),
}
}
}
const _: () =
{
trait DeriveWhereAssertEq {
fn assert(&self);
}
impl<I: Interner> DeriveWhereAssertEq for FnSigKind<I> where
I: Interner {
fn assert(&self) {
struct __AssertEq<__T: ::core::cmp::Eq +
?::core::marker::Sized>(::core::marker::PhantomData<__T>);
let _: __AssertEq<u8>;
let _: __AssertEq<u8>;
let _: __AssertEq<PhantomData<fn() -> I>>;
}
}
};
#[automatically_derived]
impl<I: Interner> ::core::cmp::Eq for FnSigKind<I> where I: Interner { }
#[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)]
925#[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)]
926#[cfg_attr(
927 feature = "nightly",
928 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) {
let FnSigKind {
flags: ref __binding_0,
splatted: ref __binding_1,
_marker: ref __binding_2 } = *self;
::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)
929)]
930pub struct FnSigKind<I: Interner> {
931 #[lift(identity)]
934 #[type_visitable(ignore)]
935 #[type_foldable(identity)]
936 flags: u8,
937
938 #[lift(identity)]
942 #[type_visitable(ignore)]
943 #[type_foldable(identity)]
944 splatted: u8,
945
946 #[type_visitable(ignore)]
947 #[type_foldable(identity)]
948 _marker: PhantomData<fn() -> I>,
949}
950
951impl<I: Interner> fmt::Debug for FnSigKind<I> {
952 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
953 let mut f = f.debug_tuple("FnSigKind");
954
955 if self.is_safe() {
956 f.field(&"Safe");
957 } else {
958 f.field(&"Unsafe");
959 }
960
961 f.field(&self.abi());
962
963 if self.c_variadic() {
964 f.field(&"CVariadic");
965 }
966
967 if let Some(index) = self.splatted() {
968 f.field(&::alloc::__export::must_use({
::alloc::fmt::format(format_args!("Splatted({0})", index))
})format!("Splatted({})", index));
969 }
970
971 f.finish()
972 }
973}
974
975impl<I: Interner> Default for FnSigKind<I> {
976 fn default() -> Self {
979 Self { flags: 0, splatted: 0, _marker: PhantomData }
980 .set_abi(ExternAbi::Rust)
981 .set_safety(I::Safety::unsafe_mode())
982 .set_c_variadic(false)
983 .set_no_splatted_args()
984 }
985}
986
987impl<I: Interner> FnSigKind<I> {
988 const EXTERN_ABI_MASK: u8 = 0b111111;
990
991 const SAFE_FLAG: u8 = 1 << 6;
993
994 const C_VARIADIC_FLAG: u8 = 1 << 7;
996
997 pub const NO_SPLATTED_ARG_INDEX: u8 = u8::MAX;
1005
1006 pub fn new(
1009 abi: ExternAbi,
1010 safety: I::Safety,
1011 c_variadic: bool,
1012 splatted: Option<u8>,
1013 args_len: usize,
1014 ) -> Result<Self, SplattedArgIndexError> {
1015 Self::default()
1016 .set_abi(abi)
1017 .set_safety(safety)
1018 .set_c_variadic(c_variadic)
1019 .set_splatted(splatted, args_len)
1020 }
1021
1022 pub fn dummy() -> Self {
1024 Self::default().set_safety(I::Safety::safe())
1025 }
1026
1027 #[must_use = "this method does not modify the receiver"]
1029 pub fn set_abi(mut self, abi: ExternAbi) -> Self {
1030 let abi_index = abi.as_packed();
1031 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);
1032
1033 self.flags &= !Self::EXTERN_ABI_MASK;
1034 self.flags |= abi_index;
1035
1036 self
1037 }
1038
1039 #[must_use = "this method does not modify the receiver"]
1041 pub fn set_safety(mut self, safety: I::Safety) -> Self {
1042 if safety.is_safe() {
1043 self.flags |= Self::SAFE_FLAG;
1044 } else {
1045 self.flags &= !Self::SAFE_FLAG;
1046 }
1047
1048 self
1049 }
1050
1051 #[must_use = "this method does not modify the receiver"]
1053 pub fn set_c_variadic(mut self, c_variadic: bool) -> Self {
1054 if c_variadic {
1055 self.flags |= Self::C_VARIADIC_FLAG;
1056 } else {
1057 self.flags &= !Self::C_VARIADIC_FLAG;
1058 }
1059
1060 self
1061 }
1062
1063 #[must_use = "this method does not modify the receiver"]
1066 pub fn set_splatted(
1067 mut self,
1068 splatted: Option<u8>,
1069 args_len: usize,
1070 ) -> Result<Self, SplattedArgIndexError> {
1071 if let Some(splatted_arg_index) = splatted {
1072 if splatted_arg_index == Self::NO_SPLATTED_ARG_INDEX {
1073 return Err(SplattedArgIndexError::InvalidIndex { splatted_arg_index });
1076 } else if usize::from(splatted_arg_index) >= args_len {
1077 return Err(SplattedArgIndexError::OutOfBounds {
1078 splatted_arg_index,
1079 args_len: args_len as u16,
1080 });
1081 }
1082
1083 self.splatted = splatted_arg_index;
1084 } else {
1085 self.splatted = Self::NO_SPLATTED_ARG_INDEX;
1086 }
1087
1088 Ok(self)
1089 }
1090
1091 #[must_use = "this method does not modify the receiver"]
1093 pub fn set_no_splatted_args(mut self) -> Self {
1094 self.splatted = Self::NO_SPLATTED_ARG_INDEX;
1095 self
1096 }
1097
1098 pub fn abi(self) -> ExternAbi {
1100 let abi_index = self.flags & Self::EXTERN_ABI_MASK;
1101 ExternAbi::from_packed(abi_index)
1102 }
1103
1104 pub fn is_safe(self) -> bool {
1106 self.flags & Self::SAFE_FLAG != 0
1107 }
1108
1109 pub fn safety(self) -> I::Safety {
1111 if self.is_safe() { I::Safety::safe() } else { I::Safety::unsafe_mode() }
1112 }
1113
1114 pub fn c_variadic(self) -> bool {
1116 self.flags & Self::C_VARIADIC_FLAG != 0
1117 }
1118
1119 pub fn splatted(self) -> Option<u8> {
1121 if self.splatted == Self::NO_SPLATTED_ARG_INDEX { None } else { Some(self.splatted) }
1122 }
1123}
1124
1125#[automatically_derived]
impl<I: Interner> ::core::clone::Clone for FnSig<I> where I: Interner {
#[inline]
fn clone(&self) -> Self { *self }
}
#[automatically_derived]
impl<I: Interner> ::core::marker::Copy for FnSig<I> where I: Interner { }
#[automatically_derived]
impl<I: Interner> ::core::cmp::PartialEq for FnSig<I> where I: Interner {
#[inline]
fn eq(&self, __other: &Self) -> ::core::primitive::bool {
match (self, __other) {
(FnSig {
inputs_and_output: ref __field_inputs_and_output,
fn_sig_kind: ref __field_fn_sig_kind }, FnSig {
inputs_and_output: ref __other_field_inputs_and_output,
fn_sig_kind: ref __other_field_fn_sig_kind }) =>
true &&
::core::cmp::PartialEq::eq(__field_inputs_and_output,
__other_field_inputs_and_output) &&
::core::cmp::PartialEq::eq(__field_fn_sig_kind,
__other_field_fn_sig_kind),
}
}
}
#[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)]
1126#[cfg_attr(
1127 feature = "nightly",
1128 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) {
let FnSig {
inputs_and_output: ref __binding_0,
fn_sig_kind: ref __binding_1 } = *self;
::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)
1129)]
1130#[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, const _: () =
{
unsafe impl<I: Interner, __V>
::rustc_type_ir::GenericTypeVisitable<__V> for FnSig<I> where
I::Tys: ::rustc_type_ir::GenericTypeVisitable<__V>,
FnSigKind<I>: ::rustc_type_ir::GenericTypeVisitable<__V> {
fn generic_visit_with(&self, __visitor: &mut __V) {
match *self {
FnSig {
inputs_and_output: ref __binding_0,
fn_sig_kind: ref __binding_1 } => {
{
::rustc_type_ir::GenericTypeVisitable::<__V>::generic_visit_with(__binding_0,
__visitor);
}
{
::rustc_type_ir::GenericTypeVisitable::<__V>::generic_visit_with(__binding_1,
__visitor);
}
}
}
}
}
};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)]
1131pub struct FnSig<I: Interner> {
1132 pub inputs_and_output: I::Tys,
1133 #[type_visitable(ignore)]
1134 #[type_foldable(identity)]
1135 pub fn_sig_kind: FnSigKind<I>,
1136}
1137
1138impl<I: Interner> Eq for FnSig<I> {}
1139
1140impl<I: Interner> FnSig<I> {
1141 pub fn inputs(self) -> I::FnInputTys {
1142 self.inputs_and_output.inputs()
1143 }
1144
1145 pub fn output(self) -> I::Ty {
1146 self.inputs_and_output.output()
1147 }
1148
1149 pub fn is_fn_trait_compatible(self) -> bool {
1150 !self.c_variadic() && self.safety().is_safe() && self.abi() == ExternAbi::Rust
1151 }
1152
1153 #[must_use = "this method does not modify the receiver"]
1155 pub fn set_safety(self, safety: I::Safety) -> Self {
1156 Self { fn_sig_kind: self.fn_sig_kind.set_safety(safety), ..self }
1157 }
1158
1159 #[must_use = "this method does not modify the receiver"]
1162 pub fn set_splatted(
1163 self,
1164 splatted: Option<u8>,
1165 args_len: usize,
1166 ) -> Result<Self, SplattedArgIndexError> {
1167 Ok(Self { fn_sig_kind: self.fn_sig_kind.set_splatted(splatted, args_len)?, ..self })
1168 }
1169
1170 pub fn safety(self) -> I::Safety {
1171 self.fn_sig_kind.safety()
1172 }
1173
1174 pub fn abi(self) -> ExternAbi {
1175 self.fn_sig_kind.abi()
1176 }
1177
1178 pub fn c_variadic(self) -> bool {
1179 self.fn_sig_kind.c_variadic()
1180 }
1181
1182 pub fn splatted(self) -> Option<u8> {
1183 self.fn_sig_kind.splatted()
1184 }
1185
1186 pub fn dummy() -> Self {
1189 Self { inputs_and_output: Default::default(), fn_sig_kind: FnSigKind::dummy() }
1190 }
1191}
1192
1193impl<I: Interner> ty::Binder<I, FnSig<I>> {
1194 #[inline]
1195 pub fn inputs(self) -> ty::Binder<I, I::FnInputTys> {
1196 self.map_bound(|fn_sig| fn_sig.inputs())
1197 }
1198
1199 #[inline]
1200 #[track_caller]
1201 pub fn input(self, index: usize) -> ty::Binder<I, I::Ty> {
1202 self.map_bound(|fn_sig| fn_sig.inputs().get(index).unwrap())
1203 }
1204
1205 pub fn inputs_and_output(self) -> ty::Binder<I, I::Tys> {
1206 self.map_bound(|fn_sig| fn_sig.inputs_and_output)
1207 }
1208
1209 #[inline]
1210 pub fn output(self) -> ty::Binder<I, I::Ty> {
1211 self.map_bound(|fn_sig| fn_sig.output())
1212 }
1213
1214 pub fn fn_sig_kind(self) -> FnSigKind<I> {
1215 self.skip_binder().fn_sig_kind
1216 }
1217
1218 pub fn c_variadic(self) -> bool {
1219 self.skip_binder().c_variadic()
1220 }
1221
1222 pub fn splatted(self) -> Option<u8> {
1223 self.skip_binder().splatted()
1224 }
1225
1226 pub fn safety(self) -> I::Safety {
1227 self.skip_binder().safety()
1228 }
1229
1230 pub fn abi(self) -> ExternAbi {
1231 self.skip_binder().abi()
1232 }
1233
1234 pub fn is_fn_trait_compatible(&self) -> bool {
1235 self.skip_binder().is_fn_trait_compatible()
1236 }
1237
1238 pub fn split(self) -> (ty::Binder<I, FnSigTys<I>>, FnHeader<I>) {
1240 let hdr = FnHeader { fn_sig_kind: self.fn_sig_kind() };
1241 (self.map_bound(|sig| FnSigTys { inputs_and_output: sig.inputs_and_output }), hdr)
1242 }
1243}
1244
1245impl<I: Interner> fmt::Debug for FnSig<I> {
1246 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1247 let sig = self;
1248 let FnSig { inputs_and_output: _, fn_sig_kind } = sig;
1249
1250 f.write_fmt(format_args!("{0}", fn_sig_kind.safety().prefix_str()))write!(f, "{}", fn_sig_kind.safety().prefix_str())?;
1251 if fn_sig_kind.abi() != ExternAbi::Rust {
1252 f.write_fmt(format_args!("extern \"{0:?}\" ", fn_sig_kind.abi()))write!(f, "extern \"{:?}\" ", fn_sig_kind.abi())?;
1253 }
1254
1255 f.write_fmt(format_args!("fn("))write!(f, "fn(")?;
1256 let inputs = sig.inputs();
1257 for (i, ty) in inputs.iter().enumerate() {
1258 if i > 0 {
1259 f.write_fmt(format_args!(", "))write!(f, ", ")?;
1260 }
1261 if Some(i) == fn_sig_kind.splatted().map(usize::from) {
1262 f.write_fmt(format_args!("#[rustc_splat] "))write!(f, "#[rustc_splat] ")?;
1263 }
1264 f.write_fmt(format_args!("{0:?}", ty))write!(f, "{ty:?}")?;
1265 }
1266 if fn_sig_kind.c_variadic() {
1267 if inputs.is_empty() {
1268 f.write_fmt(format_args!("..."))write!(f, "...")?;
1269 } else {
1270 f.write_fmt(format_args!(", ..."))write!(f, ", ...")?;
1271 }
1272 }
1273 f.write_fmt(format_args!(")"))write!(f, ")")?;
1274
1275 let output = sig.output();
1276 match output.kind() {
1277 Tuple(list) if list.is_empty() => Ok(()),
1278 _ => f.write_fmt(format_args!(" -> {0:?}", sig.output()))write!(f, " -> {:?}", sig.output()),
1279 }
1280 }
1281}
1282
1283#[automatically_derived]
impl<I: Interner> ::core::clone::Clone for UnsafeBinderInner<I> where
I: Interner {
#[inline]
fn clone(&self) -> Self { *self }
}
#[automatically_derived]
impl<I: Interner> ::core::marker::Copy for UnsafeBinderInner<I> where
I: Interner {
}
#[automatically_derived]
impl<I: Interner> ::core::cmp::PartialEq for UnsafeBinderInner<I> where
I: Interner {
#[inline]
fn eq(&self, __other: &Self) -> ::core::primitive::bool {
match (self, __other) {
(UnsafeBinderInner(ref __field_0),
UnsafeBinderInner(ref __other_field_0)) =>
true &&
::core::cmp::PartialEq::eq(__field_0, __other_field_0),
}
}
}
#[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)]
1286#[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))]
1287#[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, const _: () =
{
unsafe impl<I: Interner, __V>
::rustc_type_ir::GenericTypeVisitable<__V> for
UnsafeBinderInner<I> where
ty::Binder<I, I::Ty>: ::rustc_type_ir::GenericTypeVisitable<__V> {
fn generic_visit_with(&self, __visitor: &mut __V) {
match *self {
UnsafeBinderInner(ref __binding_0) => {
{
::rustc_type_ir::GenericTypeVisitable::<__V>::generic_visit_with(__binding_0,
__visitor);
}
}
}
}
}
};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)]
1288pub struct UnsafeBinderInner<I: Interner>(ty::Binder<I, I::Ty>);
1289
1290impl<I: Interner> Eq for UnsafeBinderInner<I> {}
1291
1292impl<I: Interner> From<ty::Binder<I, I::Ty>> for UnsafeBinderInner<I> {
1293 fn from(value: ty::Binder<I, I::Ty>) -> Self {
1294 UnsafeBinderInner(value)
1295 }
1296}
1297
1298impl<I: Interner> From<UnsafeBinderInner<I>> for ty::Binder<I, I::Ty> {
1299 fn from(value: UnsafeBinderInner<I>) -> Self {
1300 value.0
1301 }
1302}
1303
1304impl<I: Interner> fmt::Debug for UnsafeBinderInner<I> {
1305 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1306 self.0.fmt(f)
1307 }
1308}
1309
1310impl<I: Interner> Deref for UnsafeBinderInner<I> {
1311 type Target = ty::Binder<I, I::Ty>;
1312
1313 fn deref(&self) -> &Self::Target {
1314 &self.0
1315 }
1316}
1317
1318#[automatically_derived]
impl<I: Interner> ::core::clone::Clone for FnSigTys<I> where I: Interner {
#[inline]
fn clone(&self) -> Self { *self }
}
#[automatically_derived]
impl<I: Interner> ::core::marker::Copy for FnSigTys<I> where I: Interner { }
#[automatically_derived]
impl<I: Interner> ::core::fmt::Debug for FnSigTys<I> where I: Interner {
fn fmt(&self, __f: &mut ::core::fmt::Formatter<'_>)
-> ::core::fmt::Result {
match self {
FnSigTys { inputs_and_output: ref __field_inputs_and_output } => {
let mut __builder =
::core::fmt::Formatter::debug_struct(__f, "FnSigTys");
::core::fmt::DebugStruct::field(&mut __builder,
"inputs_and_output", __field_inputs_and_output);
::core::fmt::DebugStruct::finish(&mut __builder)
}
}
}
}
#[automatically_derived]
impl<I: Interner> ::core::cmp::PartialEq for FnSigTys<I> where I: Interner {
#[inline]
fn eq(&self, __other: &Self) -> ::core::primitive::bool {
match (self, __other) {
(FnSigTys { inputs_and_output: ref __field_inputs_and_output },
FnSigTys {
inputs_and_output: ref __other_field_inputs_and_output }) =>
true &&
::core::cmp::PartialEq::eq(__field_inputs_and_output,
__other_field_inputs_and_output),
}
}
}
#[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)]
1320#[cfg_attr(
1321 feature = "nightly",
1322 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) {
let FnSigTys { inputs_and_output: ref __binding_0 } = *self;
::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)
1323)]
1324#[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, const _: () =
{
unsafe impl<I: Interner, __V>
::rustc_type_ir::GenericTypeVisitable<__V> for FnSigTys<I> where
I::Tys: ::rustc_type_ir::GenericTypeVisitable<__V> {
fn generic_visit_with(&self, __visitor: &mut __V) {
match *self {
FnSigTys { inputs_and_output: ref __binding_0 } => {
{
::rustc_type_ir::GenericTypeVisitable::<__V>::generic_visit_with(__binding_0,
__visitor);
}
}
}
}
}
};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)]
1325pub struct FnSigTys<I: Interner> {
1326 pub inputs_and_output: I::Tys,
1327}
1328
1329impl<I: Interner> Eq for FnSigTys<I> {}
1330
1331impl<I: Interner> FnSigTys<I> {
1332 pub fn inputs(self) -> I::FnInputTys {
1333 self.inputs_and_output.inputs()
1334 }
1335
1336 pub fn output(self) -> I::Ty {
1337 self.inputs_and_output.output()
1338 }
1339}
1340
1341impl<I: Interner> ty::Binder<I, FnSigTys<I>> {
1342 pub fn with(self, hdr: FnHeader<I>) -> ty::Binder<I, FnSig<I>> {
1344 self.map_bound(|sig_tys| FnSig {
1345 inputs_and_output: sig_tys.inputs_and_output,
1346 fn_sig_kind: hdr.fn_sig_kind,
1347 })
1348 }
1349
1350 #[inline]
1351 pub fn inputs(self) -> ty::Binder<I, I::FnInputTys> {
1352 self.map_bound(|sig_tys| sig_tys.inputs())
1353 }
1354
1355 #[inline]
1356 #[track_caller]
1357 pub fn input(self, index: usize) -> ty::Binder<I, I::Ty> {
1358 self.map_bound(|sig_tys| sig_tys.inputs().get(index).unwrap())
1359 }
1360
1361 pub fn inputs_and_output(self) -> ty::Binder<I, I::Tys> {
1362 self.map_bound(|sig_tys| sig_tys.inputs_and_output)
1363 }
1364
1365 #[inline]
1366 pub fn output(self) -> ty::Binder<I, I::Ty> {
1367 self.map_bound(|sig_tys| sig_tys.output())
1368 }
1369}
1370
1371#[automatically_derived]
impl<I: Interner> ::core::clone::Clone for FnHeader<I> where I: Interner {
#[inline]
fn clone(&self) -> Self { *self }
}
#[automatically_derived]
impl<I: Interner> ::core::marker::Copy for FnHeader<I> where I: Interner { }
#[automatically_derived]
impl<I: Interner> ::core::fmt::Debug for FnHeader<I> where I: Interner {
fn fmt(&self, __f: &mut ::core::fmt::Formatter<'_>)
-> ::core::fmt::Result {
match self {
FnHeader { fn_sig_kind: ref __field_fn_sig_kind } => {
let mut __builder =
::core::fmt::Formatter::debug_struct(__f, "FnHeader");
::core::fmt::DebugStruct::field(&mut __builder, "fn_sig_kind",
__field_fn_sig_kind);
::core::fmt::DebugStruct::finish(&mut __builder)
}
}
}
}
#[automatically_derived]
impl<I: Interner> ::core::cmp::PartialEq for FnHeader<I> where I: Interner {
#[inline]
fn eq(&self, __other: &Self) -> ::core::primitive::bool {
match (self, __other) {
(FnHeader { fn_sig_kind: ref __field_fn_sig_kind }, FnHeader {
fn_sig_kind: ref __other_field_fn_sig_kind }) =>
true &&
::core::cmp::PartialEq::eq(__field_fn_sig_kind,
__other_field_fn_sig_kind),
}
}
}
#[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)]
1372#[cfg_attr(
1373 feature = "nightly",
1374 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) {
let FnHeader { fn_sig_kind: ref __binding_0 } = *self;
::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)
1375)]
1376#[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, const _: () =
{
unsafe impl<I: Interner, __V>
::rustc_type_ir::GenericTypeVisitable<__V> for FnHeader<I> where
FnSigKind<I>: ::rustc_type_ir::GenericTypeVisitable<__V> {
fn generic_visit_with(&self, __visitor: &mut __V) {
match *self {
FnHeader { fn_sig_kind: ref __binding_0 } => {
{
::rustc_type_ir::GenericTypeVisitable::<__V>::generic_visit_with(__binding_0,
__visitor);
}
}
}
}
}
};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)]
1377pub struct FnHeader<I: Interner> {
1378 #[type_visitable(ignore)]
1379 #[type_foldable(identity)]
1380 pub fn_sig_kind: FnSigKind<I>,
1381}
1382
1383impl<I: Interner> FnHeader<I> {
1384 pub fn c_variadic(self) -> bool {
1385 self.fn_sig_kind.c_variadic()
1386 }
1387
1388 pub fn safety(self) -> I::Safety {
1389 self.fn_sig_kind.safety()
1390 }
1391
1392 pub fn abi(self) -> ExternAbi {
1393 self.fn_sig_kind.abi()
1394 }
1395
1396 pub fn splatted(self) -> Option<u8> {
1397 self.fn_sig_kind.splatted()
1398 }
1399
1400 pub fn dummy() -> Self {
1402 Self { fn_sig_kind: FnSigKind::dummy() }
1403 }
1404}
1405
1406impl<I: Interner> Eq for FnHeader<I> {}
1407
1408#[automatically_derived]
impl<I: Interner> ::core::clone::Clone for CoroutineWitnessTypes<I> where
I: Interner {
#[inline]
fn clone(&self) -> Self { *self }
}
#[automatically_derived]
impl<I: Interner> ::core::marker::Copy for CoroutineWitnessTypes<I> where
I: Interner {
}
#[automatically_derived]
impl<I: Interner> ::core::fmt::Debug for CoroutineWitnessTypes<I> where
I: Interner {
fn fmt(&self, __f: &mut ::core::fmt::Formatter<'_>)
-> ::core::fmt::Result {
match self {
CoroutineWitnessTypes {
types: ref __field_types, assumptions: ref __field_assumptions
} => {
let mut __builder =
::core::fmt::Formatter::debug_struct(__f,
"CoroutineWitnessTypes");
::core::fmt::DebugStruct::field(&mut __builder, "types",
__field_types);
::core::fmt::DebugStruct::field(&mut __builder, "assumptions",
__field_assumptions);
::core::fmt::DebugStruct::finish(&mut __builder)
}
}
}
}
#[automatically_derived]
impl<I: Interner> ::core::cmp::PartialEq for CoroutineWitnessTypes<I> where
I: Interner {
#[inline]
fn eq(&self, __other: &Self) -> ::core::primitive::bool {
match (self, __other) {
(CoroutineWitnessTypes {
types: ref __field_types, assumptions: ref __field_assumptions
}, CoroutineWitnessTypes {
types: ref __other_field_types,
assumptions: ref __other_field_assumptions }) =>
true &&
::core::cmp::PartialEq::eq(__field_types,
__other_field_types) &&
::core::cmp::PartialEq::eq(__field_assumptions,
__other_field_assumptions),
}
}
}
#[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)]
1409#[cfg_attr(
1410 feature = "nightly",
1411 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) {
let CoroutineWitnessTypes {
types: ref __binding_0, assumptions: ref __binding_1 } =
*self;
::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)
1412)]
1413#[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, const _: () =
{
unsafe impl<I: Interner, __V>
::rustc_type_ir::GenericTypeVisitable<__V> for
CoroutineWitnessTypes<I> where
I::Tys: ::rustc_type_ir::GenericTypeVisitable<__V>,
I::RegionAssumptions: ::rustc_type_ir::GenericTypeVisitable<__V> {
fn generic_visit_with(&self, __visitor: &mut __V) {
match *self {
CoroutineWitnessTypes {
types: ref __binding_0, assumptions: ref __binding_1 } => {
{
::rustc_type_ir::GenericTypeVisitable::<__V>::generic_visit_with(__binding_0,
__visitor);
}
{
::rustc_type_ir::GenericTypeVisitable::<__V>::generic_visit_with(__binding_1,
__visitor);
}
}
}
}
}
};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)]
1414pub struct CoroutineWitnessTypes<I: Interner> {
1415 pub types: I::Tys,
1416 pub assumptions: I::RegionAssumptions,
1417}
1418
1419impl<I: Interner> Eq for CoroutineWitnessTypes<I> {}