1use std::cmp::Ordering;
12use std::fmt;
13use std::ops::Index;
14use std::sync::Arc;
15
16use rustc_abi::{FieldIdx, Integer, Size, VariantIdx};
17use rustc_ast::{AsmMacro, InlineAsmOptions, InlineAsmTemplatePiece, Mutability};
18use rustc_data_structures::fx::FxIndexMap;
19use rustc_data_structures::thin_vec::ThinVec;
20use rustc_hir as hir;
21use rustc_hir::attrs::AttributeKind;
22use rustc_hir::def_id::DefId;
23use rustc_hir::{BindingMode, ByRef, HirId, MatchSource, RangeEnd};
24use rustc_index::{IndexVec, newtype_index};
25use rustc_macros::{StableHash, TyDecodable, TyEncodable, TypeVisitable};
26use rustc_span::def_id::LocalDefId;
27use rustc_span::{ErrorGuaranteed, Span, Symbol};
28use rustc_target::asm::InlineAsmRegOrRegClass;
29use tracing::instrument;
30
31use crate::middle::region;
32use crate::mir::interpret::AllocId;
33use crate::mir::{self, AssignOp, BinOp, BorrowKind, FakeReadCause, UnOp};
34use crate::thir::visit::for_each_immediate_subpat;
35use crate::ty::adjustment::PointerCoercion;
36use crate::ty::layout::IntegerExt;
37use crate::ty::{
38 self, AdtDef, CanonicalUserType, CanonicalUserTypeAnnotation, FnSig, GenericArgsRef, Ty,
39 TyCtxt, UpvarArgs,
40};
41
42pub mod visit;
43
44macro_rules! thir_with_elements {
45 (
46 $($name:ident: $id:ty => $value:ty => $format:literal,)*
47 ) => {
48 $(
49 newtype_index! {
50 #[stable_hash]
51 #[debug_format = $format]
52 pub struct $id {}
53 }
54 )*
55
56 #[derive(Debug, StableHash, Clone)]
63 pub struct Thir<'tcx> {
64 pub body_type: BodyTy<'tcx>,
65 pub attributes: FxIndexMap<ExprId, ThinVec<AttributeKind>>,
66 $(
67 pub $name: IndexVec<$id, $value>,
68 )*
69 }
70
71 impl<'tcx> Thir<'tcx> {
72 pub fn new(body_type: BodyTy<'tcx>) -> Thir<'tcx> {
73 Thir {
74 body_type,
75 attributes: FxIndexMap::default(),
76 $(
77 $name: IndexVec::new(),
78 )*
79 }
80 }
81 }
82
83 $(
84 impl<'tcx> Index<$id> for Thir<'tcx> {
85 type Output = $value;
86 fn index(&self, index: $id) -> &Self::Output {
87 &self.$name[index]
88 }
89 }
90 )*
91 }
92}
93
94impl ::std::fmt::Debug for ParamId {
fn fmt(&self, fmt: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
fmt.write_fmt(format_args!("p{0}", self.as_u32()))
}
}
pub struct Thir<'tcx> {
pub body_type: BodyTy<'tcx>,
pub attributes: FxIndexMap<ExprId, ThinVec<AttributeKind>>,
pub arms: IndexVec<ArmId, Arm<'tcx>>,
pub blocks: IndexVec<BlockId, Block>,
pub exprs: IndexVec<ExprId, Expr<'tcx>>,
pub stmts: IndexVec<StmtId, Stmt<'tcx>>,
pub params: IndexVec<ParamId, Param<'tcx>>,
}
#[automatically_derived]
impl<'tcx> ::core::fmt::Debug for Thir<'tcx> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
let names: &'static _ =
&["body_type", "attributes", "arms", "blocks", "exprs", "stmts",
"params"];
let values: &[&dyn ::core::fmt::Debug] =
&[&self.body_type, &self.attributes, &self.arms, &self.blocks,
&self.exprs, &self.stmts, &&self.params];
::core::fmt::Formatter::debug_struct_fields_finish(f, "Thir", names,
values)
}
}
const _: () =
{
impl<'tcx> ::rustc_data_structures::stable_hash::StableHash for
Thir<'tcx> {
#[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 {
Thir {
body_type: ref __binding_0,
attributes: ref __binding_1,
arms: ref __binding_2,
blocks: ref __binding_3,
exprs: ref __binding_4,
stmts: ref __binding_5,
params: ref __binding_6 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
{ __binding_3.stable_hash(__hcx, __hasher); }
{ __binding_4.stable_hash(__hcx, __hasher); }
{ __binding_5.stable_hash(__hcx, __hasher); }
{ __binding_6.stable_hash(__hcx, __hasher); }
}
}
}
}
};
#[automatically_derived]
impl<'tcx> ::core::clone::Clone for Thir<'tcx> {
#[inline]
fn clone(&self) -> Thir<'tcx> {
Thir {
body_type: ::core::clone::Clone::clone(&self.body_type),
attributes: ::core::clone::Clone::clone(&self.attributes),
arms: ::core::clone::Clone::clone(&self.arms),
blocks: ::core::clone::Clone::clone(&self.blocks),
exprs: ::core::clone::Clone::clone(&self.exprs),
stmts: ::core::clone::Clone::clone(&self.stmts),
params: ::core::clone::Clone::clone(&self.params),
}
}
}
impl<'tcx> Thir<'tcx> {
pub fn new(body_type: BodyTy<'tcx>) -> Thir<'tcx> {
Thir {
body_type,
attributes: FxIndexMap::default(),
arms: IndexVec::new(),
blocks: IndexVec::new(),
exprs: IndexVec::new(),
stmts: IndexVec::new(),
params: IndexVec::new(),
}
}
}
impl<'tcx> Index<ArmId> for Thir<'tcx> {
type Output = Arm<'tcx>;
fn index(&self, index: ArmId) -> &Self::Output { &self.arms[index] }
}
impl<'tcx> Index<BlockId> for Thir<'tcx> {
type Output = Block;
fn index(&self, index: BlockId) -> &Self::Output { &self.blocks[index] }
}
impl<'tcx> Index<ExprId> for Thir<'tcx> {
type Output = Expr<'tcx>;
fn index(&self, index: ExprId) -> &Self::Output { &self.exprs[index] }
}
impl<'tcx> Index<StmtId> for Thir<'tcx> {
type Output = Stmt<'tcx>;
fn index(&self, index: StmtId) -> &Self::Output { &self.stmts[index] }
}
impl<'tcx> Index<ParamId> for Thir<'tcx> {
type Output = Param<'tcx>;
fn index(&self, index: ParamId) -> &Self::Output { &self.params[index] }
}thir_with_elements! {
95 arms: ArmId => Arm<'tcx> => "a{}",
96 blocks: BlockId => Block => "b{}",
97 exprs: ExprId => Expr<'tcx> => "e{}",
98 stmts: StmtId => Stmt<'tcx> => "s{}",
99 params: ParamId => Param<'tcx> => "p{}",
100}
101
102#[derive(#[automatically_derived]
impl<'tcx> ::core::fmt::Debug for BodyTy<'tcx> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
BodyTy::Const(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Const",
&__self_0),
BodyTy::Fn(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Fn",
&__self_0),
BodyTy::GlobalAsm(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"GlobalAsm", &__self_0),
}
}
}Debug, const _: () =
{
impl<'tcx> ::rustc_data_structures::stable_hash::StableHash for
BodyTy<'tcx> {
#[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 {
BodyTy::Const(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
BodyTy::Fn(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
BodyTy::GlobalAsm(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash, #[automatically_derived]
impl<'tcx> ::core::clone::Clone for BodyTy<'tcx> {
#[inline]
fn clone(&self) -> BodyTy<'tcx> {
match self {
BodyTy::Const(__self_0) =>
BodyTy::Const(::core::clone::Clone::clone(__self_0)),
BodyTy::Fn(__self_0) =>
BodyTy::Fn(::core::clone::Clone::clone(__self_0)),
BodyTy::GlobalAsm(__self_0) =>
BodyTy::GlobalAsm(::core::clone::Clone::clone(__self_0)),
}
}
}Clone)]
103pub enum BodyTy<'tcx> {
104 Const(Ty<'tcx>),
105 Fn(FnSig<'tcx>),
106 GlobalAsm(Ty<'tcx>),
107}
108
109#[derive(#[automatically_derived]
impl<'tcx> ::core::clone::Clone for Param<'tcx> {
#[inline]
fn clone(&self) -> Param<'tcx> {
Param {
pat: ::core::clone::Clone::clone(&self.pat),
ty: ::core::clone::Clone::clone(&self.ty),
ty_span: ::core::clone::Clone::clone(&self.ty_span),
self_kind: ::core::clone::Clone::clone(&self.self_kind),
hir_id: ::core::clone::Clone::clone(&self.hir_id),
}
}
}Clone, #[automatically_derived]
impl<'tcx> ::core::fmt::Debug for Param<'tcx> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field5_finish(f, "Param", "pat",
&self.pat, "ty", &self.ty, "ty_span", &self.ty_span, "self_kind",
&self.self_kind, "hir_id", &&self.hir_id)
}
}Debug, const _: () =
{
impl<'tcx> ::rustc_data_structures::stable_hash::StableHash for
Param<'tcx> {
#[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 {
Param {
pat: ref __binding_0,
ty: ref __binding_1,
ty_span: ref __binding_2,
self_kind: ref __binding_3,
hir_id: ref __binding_4 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
{ __binding_3.stable_hash(__hcx, __hasher); }
{ __binding_4.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
111pub struct Param<'tcx> {
112 pub pat: Option<Box<Pat<'tcx>>>,
114 pub ty: Ty<'tcx>,
116 pub ty_span: Option<Span>,
118 pub self_kind: Option<hir::ImplicitSelfKind>,
120 pub hir_id: Option<HirId>,
122}
123
124#[derive(#[automatically_derived]
impl ::core::clone::Clone for Block {
#[inline]
fn clone(&self) -> Block {
Block {
targeted_by_break: ::core::clone::Clone::clone(&self.targeted_by_break),
region_scope: ::core::clone::Clone::clone(&self.region_scope),
span: ::core::clone::Clone::clone(&self.span),
stmts: ::core::clone::Clone::clone(&self.stmts),
expr: ::core::clone::Clone::clone(&self.expr),
safety_mode: ::core::clone::Clone::clone(&self.safety_mode),
}
}
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for Block {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
let names: &'static _ =
&["targeted_by_break", "region_scope", "span", "stmts", "expr",
"safety_mode"];
let values: &[&dyn ::core::fmt::Debug] =
&[&self.targeted_by_break, &self.region_scope, &self.span,
&self.stmts, &self.expr, &&self.safety_mode];
::core::fmt::Formatter::debug_struct_fields_finish(f, "Block", names,
values)
}
}Debug, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for Block {
#[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 {
Block {
targeted_by_break: ref __binding_0,
region_scope: ref __binding_1,
span: ref __binding_2,
stmts: ref __binding_3,
expr: ref __binding_4,
safety_mode: ref __binding_5 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
{ __binding_3.stable_hash(__hcx, __hasher); }
{ __binding_4.stable_hash(__hcx, __hasher); }
{ __binding_5.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
125pub struct Block {
126 pub targeted_by_break: bool,
131 pub region_scope: region::Scope,
132 pub span: Span,
135 pub stmts: Box<[StmtId]>,
137 pub expr: Option<ExprId>,
139 pub safety_mode: BlockSafety,
140}
141
142type UserTy<'tcx> = Option<Box<CanonicalUserType<'tcx>>>;
143
144#[derive(#[automatically_derived]
impl<'tcx> ::core::clone::Clone for AdtExpr<'tcx> {
#[inline]
fn clone(&self) -> AdtExpr<'tcx> {
AdtExpr {
adt_def: ::core::clone::Clone::clone(&self.adt_def),
variant_index: ::core::clone::Clone::clone(&self.variant_index),
args: ::core::clone::Clone::clone(&self.args),
user_ty: ::core::clone::Clone::clone(&self.user_ty),
fields: ::core::clone::Clone::clone(&self.fields),
base: ::core::clone::Clone::clone(&self.base),
}
}
}Clone, #[automatically_derived]
impl<'tcx> ::core::fmt::Debug for AdtExpr<'tcx> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
let names: &'static _ =
&["adt_def", "variant_index", "args", "user_ty", "fields",
"base"];
let values: &[&dyn ::core::fmt::Debug] =
&[&self.adt_def, &self.variant_index, &self.args, &self.user_ty,
&self.fields, &&self.base];
::core::fmt::Formatter::debug_struct_fields_finish(f, "AdtExpr",
names, values)
}
}Debug, const _: () =
{
impl<'tcx> ::rustc_data_structures::stable_hash::StableHash for
AdtExpr<'tcx> {
#[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 {
AdtExpr {
adt_def: ref __binding_0,
variant_index: ref __binding_1,
args: ref __binding_2,
user_ty: ref __binding_3,
fields: ref __binding_4,
base: ref __binding_5 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
{ __binding_3.stable_hash(__hcx, __hasher); }
{ __binding_4.stable_hash(__hcx, __hasher); }
{ __binding_5.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
145pub struct AdtExpr<'tcx> {
146 pub adt_def: AdtDef<'tcx>,
148 pub variant_index: VariantIdx,
150 pub args: GenericArgsRef<'tcx>,
151
152 pub user_ty: UserTy<'tcx>,
155
156 pub fields: Box<[FieldExpr]>,
157 pub base: AdtExprBase<'tcx>,
159}
160
161#[derive(#[automatically_derived]
impl<'tcx> ::core::clone::Clone for AdtExprBase<'tcx> {
#[inline]
fn clone(&self) -> AdtExprBase<'tcx> {
match self {
AdtExprBase::None => AdtExprBase::None,
AdtExprBase::Base(__self_0) =>
AdtExprBase::Base(::core::clone::Clone::clone(__self_0)),
AdtExprBase::DefaultFields(__self_0) =>
AdtExprBase::DefaultFields(::core::clone::Clone::clone(__self_0)),
}
}
}Clone, #[automatically_derived]
impl<'tcx> ::core::fmt::Debug for AdtExprBase<'tcx> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
AdtExprBase::None => ::core::fmt::Formatter::write_str(f, "None"),
AdtExprBase::Base(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Base",
&__self_0),
AdtExprBase::DefaultFields(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"DefaultFields", &__self_0),
}
}
}Debug, const _: () =
{
impl<'tcx> ::rustc_data_structures::stable_hash::StableHash for
AdtExprBase<'tcx> {
#[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 {
AdtExprBase::None => {}
AdtExprBase::Base(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
AdtExprBase::DefaultFields(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
162pub enum AdtExprBase<'tcx> {
163 None,
165 Base(FruInfo<'tcx>),
168 DefaultFields(Box<[Ty<'tcx>]>),
172}
173
174#[derive(#[automatically_derived]
impl<'tcx> ::core::clone::Clone for ClosureExpr<'tcx> {
#[inline]
fn clone(&self) -> ClosureExpr<'tcx> {
ClosureExpr {
closure_id: ::core::clone::Clone::clone(&self.closure_id),
args: ::core::clone::Clone::clone(&self.args),
upvars: ::core::clone::Clone::clone(&self.upvars),
movability: ::core::clone::Clone::clone(&self.movability),
fake_reads: ::core::clone::Clone::clone(&self.fake_reads),
}
}
}Clone, #[automatically_derived]
impl<'tcx> ::core::fmt::Debug for ClosureExpr<'tcx> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field5_finish(f, "ClosureExpr",
"closure_id", &self.closure_id, "args", &self.args, "upvars",
&self.upvars, "movability", &self.movability, "fake_reads",
&&self.fake_reads)
}
}Debug, const _: () =
{
impl<'tcx> ::rustc_data_structures::stable_hash::StableHash for
ClosureExpr<'tcx> {
#[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 {
ClosureExpr {
closure_id: ref __binding_0,
args: ref __binding_1,
upvars: ref __binding_2,
movability: ref __binding_3,
fake_reads: ref __binding_4 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
{ __binding_3.stable_hash(__hcx, __hasher); }
{ __binding_4.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
175pub struct ClosureExpr<'tcx> {
176 pub closure_id: LocalDefId,
177 pub args: UpvarArgs<'tcx>,
178 pub upvars: Box<[ExprId]>,
179 pub movability: Option<hir::Movability>,
180 pub fake_reads: Vec<(ExprId, FakeReadCause, HirId)>,
181}
182
183#[derive(#[automatically_derived]
impl<'tcx> ::core::clone::Clone for InlineAsmExpr<'tcx> {
#[inline]
fn clone(&self) -> InlineAsmExpr<'tcx> {
InlineAsmExpr {
asm_macro: ::core::clone::Clone::clone(&self.asm_macro),
template: ::core::clone::Clone::clone(&self.template),
operands: ::core::clone::Clone::clone(&self.operands),
options: ::core::clone::Clone::clone(&self.options),
line_spans: ::core::clone::Clone::clone(&self.line_spans),
}
}
}Clone, #[automatically_derived]
impl<'tcx> ::core::fmt::Debug for InlineAsmExpr<'tcx> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field5_finish(f, "InlineAsmExpr",
"asm_macro", &self.asm_macro, "template", &self.template,
"operands", &self.operands, "options", &self.options,
"line_spans", &&self.line_spans)
}
}Debug, const _: () =
{
impl<'tcx> ::rustc_data_structures::stable_hash::StableHash for
InlineAsmExpr<'tcx> {
#[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 {
InlineAsmExpr {
asm_macro: ref __binding_0,
template: ref __binding_1,
operands: ref __binding_2,
options: ref __binding_3,
line_spans: ref __binding_4 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
{ __binding_3.stable_hash(__hcx, __hasher); }
{ __binding_4.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
184pub struct InlineAsmExpr<'tcx> {
185 pub asm_macro: AsmMacro,
186 pub template: &'tcx [InlineAsmTemplatePiece],
187 pub operands: Box<[InlineAsmOperand<'tcx>]>,
188 pub options: InlineAsmOptions,
189 pub line_spans: &'tcx [Span],
190}
191
192#[derive(#[automatically_derived]
impl ::core::marker::Copy for BlockSafety { }Copy, #[automatically_derived]
impl ::core::clone::Clone for BlockSafety {
#[inline]
fn clone(&self) -> BlockSafety {
let _: ::core::clone::AssertParamIsClone<HirId>;
*self
}
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for BlockSafety {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
BlockSafety::Safe => ::core::fmt::Formatter::write_str(f, "Safe"),
BlockSafety::BuiltinUnsafe =>
::core::fmt::Formatter::write_str(f, "BuiltinUnsafe"),
BlockSafety::ExplicitUnsafe(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"ExplicitUnsafe", &__self_0),
}
}
}Debug, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for BlockSafety
{
#[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 {
BlockSafety::Safe => {}
BlockSafety::BuiltinUnsafe => {}
BlockSafety::ExplicitUnsafe(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
193pub enum BlockSafety {
194 Safe,
195 BuiltinUnsafe,
197 ExplicitUnsafe(HirId),
199}
200
201#[derive(#[automatically_derived]
impl<'tcx> ::core::clone::Clone for Stmt<'tcx> {
#[inline]
fn clone(&self) -> Stmt<'tcx> {
Stmt { kind: ::core::clone::Clone::clone(&self.kind) }
}
}Clone, #[automatically_derived]
impl<'tcx> ::core::fmt::Debug for Stmt<'tcx> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field1_finish(f, "Stmt", "kind",
&&self.kind)
}
}Debug, const _: () =
{
impl<'tcx> ::rustc_data_structures::stable_hash::StableHash for
Stmt<'tcx> {
#[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 {
Stmt { kind: ref __binding_0 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
202pub struct Stmt<'tcx> {
203 pub kind: StmtKind<'tcx>,
204}
205
206#[derive(#[automatically_derived]
impl<'tcx> ::core::clone::Clone for StmtKind<'tcx> {
#[inline]
fn clone(&self) -> StmtKind<'tcx> {
match self {
StmtKind::Expr { scope: __self_0, expr: __self_1 } =>
StmtKind::Expr {
scope: ::core::clone::Clone::clone(__self_0),
expr: ::core::clone::Clone::clone(__self_1),
},
StmtKind::Let {
remainder_scope: __self_0,
init_scope: __self_1,
pattern: __self_2,
initializer: __self_3,
else_block: __self_4,
hir_id: __self_5,
span: __self_6 } =>
StmtKind::Let {
remainder_scope: ::core::clone::Clone::clone(__self_0),
init_scope: ::core::clone::Clone::clone(__self_1),
pattern: ::core::clone::Clone::clone(__self_2),
initializer: ::core::clone::Clone::clone(__self_3),
else_block: ::core::clone::Clone::clone(__self_4),
hir_id: ::core::clone::Clone::clone(__self_5),
span: ::core::clone::Clone::clone(__self_6),
},
}
}
}Clone, #[automatically_derived]
impl<'tcx> ::core::fmt::Debug for StmtKind<'tcx> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
StmtKind::Expr { scope: __self_0, expr: __self_1 } =>
::core::fmt::Formatter::debug_struct_field2_finish(f, "Expr",
"scope", __self_0, "expr", &__self_1),
StmtKind::Let {
remainder_scope: __self_0,
init_scope: __self_1,
pattern: __self_2,
initializer: __self_3,
else_block: __self_4,
hir_id: __self_5,
span: __self_6 } => {
let names: &'static _ =
&["remainder_scope", "init_scope", "pattern", "initializer",
"else_block", "hir_id", "span"];
let values: &[&dyn ::core::fmt::Debug] =
&[__self_0, __self_1, __self_2, __self_3, __self_4,
__self_5, &__self_6];
::core::fmt::Formatter::debug_struct_fields_finish(f, "Let",
names, values)
}
}
}
}Debug, const _: () =
{
impl<'tcx> ::rustc_data_structures::stable_hash::StableHash for
StmtKind<'tcx> {
#[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 {
StmtKind::Expr {
scope: ref __binding_0, expr: ref __binding_1 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
StmtKind::Let {
remainder_scope: ref __binding_0,
init_scope: ref __binding_1,
pattern: ref __binding_2,
initializer: ref __binding_3,
else_block: ref __binding_4,
hir_id: ref __binding_5,
span: ref __binding_6 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
{ __binding_3.stable_hash(__hcx, __hasher); }
{ __binding_4.stable_hash(__hcx, __hasher); }
{ __binding_5.stable_hash(__hcx, __hasher); }
{ __binding_6.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
207pub enum StmtKind<'tcx> {
208 Expr {
210 scope: region::Scope,
212
213 expr: ExprId,
215 },
216
217 Let {
219 remainder_scope: region::Scope,
222
223 init_scope: region::Scope,
226
227 pattern: Box<Pat<'tcx>>,
231
232 initializer: Option<ExprId>,
234
235 else_block: Option<BlockId>,
237
238 hir_id: HirId,
240
241 span: Span,
243 },
244}
245
246#[derive(#[automatically_derived]
impl ::core::clone::Clone for LocalVarId {
#[inline]
fn clone(&self) -> LocalVarId {
let _: ::core::clone::AssertParamIsClone<HirId>;
*self
}
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for LocalVarId {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_tuple_field1_finish(f, "LocalVarId",
&&self.0)
}
}Debug, #[automatically_derived]
impl ::core::marker::Copy for LocalVarId { }Copy, #[automatically_derived]
impl ::core::cmp::PartialEq for LocalVarId {
#[inline]
fn eq(&self, other: &LocalVarId) -> bool { self.0 == other.0 }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for LocalVarId {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<HirId>;
}
}Eq, #[automatically_derived]
impl ::core::hash::Hash for LocalVarId {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&self.0, state)
}
}Hash, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for LocalVarId {
#[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 {
LocalVarId(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash, const _: () =
{
impl<'tcx, __E: ::rustc_middle::ty::codec::TyEncoder<'tcx>>
::rustc_serialize::Encodable<__E> for LocalVarId {
fn encode(&self, __encoder: &mut __E) {
match *self {
LocalVarId(ref __binding_0) => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
}
}
}
};TyEncodable, const _: () =
{
impl<'tcx, __D: ::rustc_middle::ty::codec::TyDecoder<'tcx>>
::rustc_serialize::Decodable<__D> for LocalVarId {
fn decode(__decoder: &mut __D) -> Self {
LocalVarId(::rustc_serialize::Decodable::decode(__decoder))
}
}
};TyDecodable)]
247pub struct LocalVarId(pub HirId);
248
249#[derive(#[automatically_derived]
impl<'tcx> ::core::clone::Clone for Expr<'tcx> {
#[inline]
fn clone(&self) -> Expr<'tcx> {
Expr {
kind: ::core::clone::Clone::clone(&self.kind),
ty: ::core::clone::Clone::clone(&self.ty),
temp_scope_id: ::core::clone::Clone::clone(&self.temp_scope_id),
span: ::core::clone::Clone::clone(&self.span),
}
}
}Clone, #[automatically_derived]
impl<'tcx> ::core::fmt::Debug for Expr<'tcx> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field4_finish(f, "Expr", "kind",
&self.kind, "ty", &self.ty, "temp_scope_id", &self.temp_scope_id,
"span", &&self.span)
}
}Debug, const _: () =
{
impl<'tcx> ::rustc_data_structures::stable_hash::StableHash for
Expr<'tcx> {
#[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 {
Expr {
kind: ref __binding_0,
ty: ref __binding_1,
temp_scope_id: ref __binding_2,
span: ref __binding_3 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
{ __binding_3.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
251pub struct Expr<'tcx> {
252 pub kind: ExprKind<'tcx>,
254
255 pub ty: Ty<'tcx>,
257
258 pub temp_scope_id: hir::ItemLocalId,
262
263 pub span: Span,
265}
266
267#[derive(#[automatically_derived]
impl<'tcx> ::core::clone::Clone for ExprKind<'tcx> {
#[inline]
fn clone(&self) -> ExprKind<'tcx> {
match self {
ExprKind::Scope {
region_scope: __self_0, hir_id: __self_1, value: __self_2 } =>
ExprKind::Scope {
region_scope: ::core::clone::Clone::clone(__self_0),
hir_id: ::core::clone::Clone::clone(__self_1),
value: ::core::clone::Clone::clone(__self_2),
},
ExprKind::If {
if_then_scope: __self_0,
cond: __self_1,
then: __self_2,
else_opt: __self_3 } =>
ExprKind::If {
if_then_scope: ::core::clone::Clone::clone(__self_0),
cond: ::core::clone::Clone::clone(__self_1),
then: ::core::clone::Clone::clone(__self_2),
else_opt: ::core::clone::Clone::clone(__self_3),
},
ExprKind::Call {
ty: __self_0,
fun: __self_1,
args: __self_2,
from_hir_call: __self_3,
fn_span: __self_4 } =>
ExprKind::Call {
ty: ::core::clone::Clone::clone(__self_0),
fun: ::core::clone::Clone::clone(__self_1),
args: ::core::clone::Clone::clone(__self_2),
from_hir_call: ::core::clone::Clone::clone(__self_3),
fn_span: ::core::clone::Clone::clone(__self_4),
},
ExprKind::ByUse { expr: __self_0, span: __self_1 } =>
ExprKind::ByUse {
expr: ::core::clone::Clone::clone(__self_0),
span: ::core::clone::Clone::clone(__self_1),
},
ExprKind::Deref { arg: __self_0 } =>
ExprKind::Deref {
arg: ::core::clone::Clone::clone(__self_0),
},
ExprKind::Binary { op: __self_0, lhs: __self_1, rhs: __self_2 } =>
ExprKind::Binary {
op: ::core::clone::Clone::clone(__self_0),
lhs: ::core::clone::Clone::clone(__self_1),
rhs: ::core::clone::Clone::clone(__self_2),
},
ExprKind::LogicalOp { op: __self_0, lhs: __self_1, rhs: __self_2 }
=>
ExprKind::LogicalOp {
op: ::core::clone::Clone::clone(__self_0),
lhs: ::core::clone::Clone::clone(__self_1),
rhs: ::core::clone::Clone::clone(__self_2),
},
ExprKind::Unary { op: __self_0, arg: __self_1 } =>
ExprKind::Unary {
op: ::core::clone::Clone::clone(__self_0),
arg: ::core::clone::Clone::clone(__self_1),
},
ExprKind::Cast { source: __self_0 } =>
ExprKind::Cast {
source: ::core::clone::Clone::clone(__self_0),
},
ExprKind::Use { source: __self_0 } =>
ExprKind::Use {
source: ::core::clone::Clone::clone(__self_0),
},
ExprKind::NeverToAny { source: __self_0 } =>
ExprKind::NeverToAny {
source: ::core::clone::Clone::clone(__self_0),
},
ExprKind::PointerCoercion {
cast: __self_0, source: __self_1, is_from_as_cast: __self_2 }
=>
ExprKind::PointerCoercion {
cast: ::core::clone::Clone::clone(__self_0),
source: ::core::clone::Clone::clone(__self_1),
is_from_as_cast: ::core::clone::Clone::clone(__self_2),
},
ExprKind::Loop { body: __self_0 } =>
ExprKind::Loop {
body: ::core::clone::Clone::clone(__self_0),
},
ExprKind::LoopMatch {
state: __self_0, region_scope: __self_1, match_data: __self_2
} =>
ExprKind::LoopMatch {
state: ::core::clone::Clone::clone(__self_0),
region_scope: ::core::clone::Clone::clone(__self_1),
match_data: ::core::clone::Clone::clone(__self_2),
},
ExprKind::Let { expr: __self_0, pat: __self_1 } =>
ExprKind::Let {
expr: ::core::clone::Clone::clone(__self_0),
pat: ::core::clone::Clone::clone(__self_1),
},
ExprKind::Match {
scrutinee: __self_0, arms: __self_1, match_source: __self_2 }
=>
ExprKind::Match {
scrutinee: ::core::clone::Clone::clone(__self_0),
arms: ::core::clone::Clone::clone(__self_1),
match_source: ::core::clone::Clone::clone(__self_2),
},
ExprKind::Block { block: __self_0 } =>
ExprKind::Block {
block: ::core::clone::Clone::clone(__self_0),
},
ExprKind::Assign { lhs: __self_0, rhs: __self_1 } =>
ExprKind::Assign {
lhs: ::core::clone::Clone::clone(__self_0),
rhs: ::core::clone::Clone::clone(__self_1),
},
ExprKind::AssignOp { op: __self_0, lhs: __self_1, rhs: __self_2 }
=>
ExprKind::AssignOp {
op: ::core::clone::Clone::clone(__self_0),
lhs: ::core::clone::Clone::clone(__self_1),
rhs: ::core::clone::Clone::clone(__self_2),
},
ExprKind::Field {
lhs: __self_0, variant_index: __self_1, name: __self_2 } =>
ExprKind::Field {
lhs: ::core::clone::Clone::clone(__self_0),
variant_index: ::core::clone::Clone::clone(__self_1),
name: ::core::clone::Clone::clone(__self_2),
},
ExprKind::Index { lhs: __self_0, index: __self_1 } =>
ExprKind::Index {
lhs: ::core::clone::Clone::clone(__self_0),
index: ::core::clone::Clone::clone(__self_1),
},
ExprKind::VarRef { id: __self_0 } =>
ExprKind::VarRef {
id: ::core::clone::Clone::clone(__self_0),
},
ExprKind::UpvarRef {
closure_def_id: __self_0, var_hir_id: __self_1 } =>
ExprKind::UpvarRef {
closure_def_id: ::core::clone::Clone::clone(__self_0),
var_hir_id: ::core::clone::Clone::clone(__self_1),
},
ExprKind::Borrow { borrow_kind: __self_0, arg: __self_1 } =>
ExprKind::Borrow {
borrow_kind: ::core::clone::Clone::clone(__self_0),
arg: ::core::clone::Clone::clone(__self_1),
},
ExprKind::RawBorrow { mutability: __self_0, arg: __self_1 } =>
ExprKind::RawBorrow {
mutability: ::core::clone::Clone::clone(__self_0),
arg: ::core::clone::Clone::clone(__self_1),
},
ExprKind::Break { label: __self_0, value: __self_1 } =>
ExprKind::Break {
label: ::core::clone::Clone::clone(__self_0),
value: ::core::clone::Clone::clone(__self_1),
},
ExprKind::Continue { label: __self_0 } =>
ExprKind::Continue {
label: ::core::clone::Clone::clone(__self_0),
},
ExprKind::ConstContinue { label: __self_0, value: __self_1 } =>
ExprKind::ConstContinue {
label: ::core::clone::Clone::clone(__self_0),
value: ::core::clone::Clone::clone(__self_1),
},
ExprKind::Return { value: __self_0 } =>
ExprKind::Return {
value: ::core::clone::Clone::clone(__self_0),
},
ExprKind::Become { value: __self_0 } =>
ExprKind::Become {
value: ::core::clone::Clone::clone(__self_0),
},
ExprKind::ConstBlock { did: __self_0, args: __self_1 } =>
ExprKind::ConstBlock {
did: ::core::clone::Clone::clone(__self_0),
args: ::core::clone::Clone::clone(__self_1),
},
ExprKind::Repeat { value: __self_0, count: __self_1 } =>
ExprKind::Repeat {
value: ::core::clone::Clone::clone(__self_0),
count: ::core::clone::Clone::clone(__self_1),
},
ExprKind::Array { fields: __self_0 } =>
ExprKind::Array {
fields: ::core::clone::Clone::clone(__self_0),
},
ExprKind::Tuple { fields: __self_0 } =>
ExprKind::Tuple {
fields: ::core::clone::Clone::clone(__self_0),
},
ExprKind::Adt(__self_0) =>
ExprKind::Adt(::core::clone::Clone::clone(__self_0)),
ExprKind::PlaceTypeAscription {
source: __self_0, user_ty: __self_1, user_ty_span: __self_2 }
=>
ExprKind::PlaceTypeAscription {
source: ::core::clone::Clone::clone(__self_0),
user_ty: ::core::clone::Clone::clone(__self_1),
user_ty_span: ::core::clone::Clone::clone(__self_2),
},
ExprKind::ValueTypeAscription {
source: __self_0, user_ty: __self_1, user_ty_span: __self_2 }
=>
ExprKind::ValueTypeAscription {
source: ::core::clone::Clone::clone(__self_0),
user_ty: ::core::clone::Clone::clone(__self_1),
user_ty_span: ::core::clone::Clone::clone(__self_2),
},
ExprKind::PlaceUnwrapUnsafeBinder { source: __self_0 } =>
ExprKind::PlaceUnwrapUnsafeBinder {
source: ::core::clone::Clone::clone(__self_0),
},
ExprKind::ValueUnwrapUnsafeBinder { source: __self_0 } =>
ExprKind::ValueUnwrapUnsafeBinder {
source: ::core::clone::Clone::clone(__self_0),
},
ExprKind::WrapUnsafeBinder { source: __self_0 } =>
ExprKind::WrapUnsafeBinder {
source: ::core::clone::Clone::clone(__self_0),
},
ExprKind::Closure(__self_0) =>
ExprKind::Closure(::core::clone::Clone::clone(__self_0)),
ExprKind::Literal { lit: __self_0, neg: __self_1 } =>
ExprKind::Literal {
lit: ::core::clone::Clone::clone(__self_0),
neg: ::core::clone::Clone::clone(__self_1),
},
ExprKind::NonHirLiteral { lit: __self_0, user_ty: __self_1 } =>
ExprKind::NonHirLiteral {
lit: ::core::clone::Clone::clone(__self_0),
user_ty: ::core::clone::Clone::clone(__self_1),
},
ExprKind::ZstLiteral { user_ty: __self_0 } =>
ExprKind::ZstLiteral {
user_ty: ::core::clone::Clone::clone(__self_0),
},
ExprKind::NamedConst {
def_id: __self_0, args: __self_1, user_ty: __self_2 } =>
ExprKind::NamedConst {
def_id: ::core::clone::Clone::clone(__self_0),
args: ::core::clone::Clone::clone(__self_1),
user_ty: ::core::clone::Clone::clone(__self_2),
},
ExprKind::ConstParam { param: __self_0, def_id: __self_1 } =>
ExprKind::ConstParam {
param: ::core::clone::Clone::clone(__self_0),
def_id: ::core::clone::Clone::clone(__self_1),
},
ExprKind::StaticRef {
alloc_id: __self_0, ty: __self_1, def_id: __self_2 } =>
ExprKind::StaticRef {
alloc_id: ::core::clone::Clone::clone(__self_0),
ty: ::core::clone::Clone::clone(__self_1),
def_id: ::core::clone::Clone::clone(__self_2),
},
ExprKind::InlineAsm(__self_0) =>
ExprKind::InlineAsm(::core::clone::Clone::clone(__self_0)),
ExprKind::ThreadLocalRef(__self_0) =>
ExprKind::ThreadLocalRef(::core::clone::Clone::clone(__self_0)),
ExprKind::Yield { value: __self_0 } =>
ExprKind::Yield {
value: ::core::clone::Clone::clone(__self_0),
},
ExprKind::Reborrow {
source: __self_0, mutability: __self_1, target: __self_2 } =>
ExprKind::Reborrow {
source: ::core::clone::Clone::clone(__self_0),
mutability: ::core::clone::Clone::clone(__self_1),
target: ::core::clone::Clone::clone(__self_2),
},
}
}
}Clone, #[automatically_derived]
impl<'tcx> ::core::fmt::Debug for ExprKind<'tcx> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
ExprKind::Scope {
region_scope: __self_0, hir_id: __self_1, value: __self_2 } =>
::core::fmt::Formatter::debug_struct_field3_finish(f, "Scope",
"region_scope", __self_0, "hir_id", __self_1, "value",
&__self_2),
ExprKind::If {
if_then_scope: __self_0,
cond: __self_1,
then: __self_2,
else_opt: __self_3 } =>
::core::fmt::Formatter::debug_struct_field4_finish(f, "If",
"if_then_scope", __self_0, "cond", __self_1, "then",
__self_2, "else_opt", &__self_3),
ExprKind::Call {
ty: __self_0,
fun: __self_1,
args: __self_2,
from_hir_call: __self_3,
fn_span: __self_4 } =>
::core::fmt::Formatter::debug_struct_field5_finish(f, "Call",
"ty", __self_0, "fun", __self_1, "args", __self_2,
"from_hir_call", __self_3, "fn_span", &__self_4),
ExprKind::ByUse { expr: __self_0, span: __self_1 } =>
::core::fmt::Formatter::debug_struct_field2_finish(f, "ByUse",
"expr", __self_0, "span", &__self_1),
ExprKind::Deref { arg: __self_0 } =>
::core::fmt::Formatter::debug_struct_field1_finish(f, "Deref",
"arg", &__self_0),
ExprKind::Binary { op: __self_0, lhs: __self_1, rhs: __self_2 } =>
::core::fmt::Formatter::debug_struct_field3_finish(f,
"Binary", "op", __self_0, "lhs", __self_1, "rhs",
&__self_2),
ExprKind::LogicalOp { op: __self_0, lhs: __self_1, rhs: __self_2 }
=>
::core::fmt::Formatter::debug_struct_field3_finish(f,
"LogicalOp", "op", __self_0, "lhs", __self_1, "rhs",
&__self_2),
ExprKind::Unary { op: __self_0, arg: __self_1 } =>
::core::fmt::Formatter::debug_struct_field2_finish(f, "Unary",
"op", __self_0, "arg", &__self_1),
ExprKind::Cast { source: __self_0 } =>
::core::fmt::Formatter::debug_struct_field1_finish(f, "Cast",
"source", &__self_0),
ExprKind::Use { source: __self_0 } =>
::core::fmt::Formatter::debug_struct_field1_finish(f, "Use",
"source", &__self_0),
ExprKind::NeverToAny { source: __self_0 } =>
::core::fmt::Formatter::debug_struct_field1_finish(f,
"NeverToAny", "source", &__self_0),
ExprKind::PointerCoercion {
cast: __self_0, source: __self_1, is_from_as_cast: __self_2 }
=>
::core::fmt::Formatter::debug_struct_field3_finish(f,
"PointerCoercion", "cast", __self_0, "source", __self_1,
"is_from_as_cast", &__self_2),
ExprKind::Loop { body: __self_0 } =>
::core::fmt::Formatter::debug_struct_field1_finish(f, "Loop",
"body", &__self_0),
ExprKind::LoopMatch {
state: __self_0, region_scope: __self_1, match_data: __self_2
} =>
::core::fmt::Formatter::debug_struct_field3_finish(f,
"LoopMatch", "state", __self_0, "region_scope", __self_1,
"match_data", &__self_2),
ExprKind::Let { expr: __self_0, pat: __self_1 } =>
::core::fmt::Formatter::debug_struct_field2_finish(f, "Let",
"expr", __self_0, "pat", &__self_1),
ExprKind::Match {
scrutinee: __self_0, arms: __self_1, match_source: __self_2 }
=>
::core::fmt::Formatter::debug_struct_field3_finish(f, "Match",
"scrutinee", __self_0, "arms", __self_1, "match_source",
&__self_2),
ExprKind::Block { block: __self_0 } =>
::core::fmt::Formatter::debug_struct_field1_finish(f, "Block",
"block", &__self_0),
ExprKind::Assign { lhs: __self_0, rhs: __self_1 } =>
::core::fmt::Formatter::debug_struct_field2_finish(f,
"Assign", "lhs", __self_0, "rhs", &__self_1),
ExprKind::AssignOp { op: __self_0, lhs: __self_1, rhs: __self_2 }
=>
::core::fmt::Formatter::debug_struct_field3_finish(f,
"AssignOp", "op", __self_0, "lhs", __self_1, "rhs",
&__self_2),
ExprKind::Field {
lhs: __self_0, variant_index: __self_1, name: __self_2 } =>
::core::fmt::Formatter::debug_struct_field3_finish(f, "Field",
"lhs", __self_0, "variant_index", __self_1, "name",
&__self_2),
ExprKind::Index { lhs: __self_0, index: __self_1 } =>
::core::fmt::Formatter::debug_struct_field2_finish(f, "Index",
"lhs", __self_0, "index", &__self_1),
ExprKind::VarRef { id: __self_0 } =>
::core::fmt::Formatter::debug_struct_field1_finish(f,
"VarRef", "id", &__self_0),
ExprKind::UpvarRef {
closure_def_id: __self_0, var_hir_id: __self_1 } =>
::core::fmt::Formatter::debug_struct_field2_finish(f,
"UpvarRef", "closure_def_id", __self_0, "var_hir_id",
&__self_1),
ExprKind::Borrow { borrow_kind: __self_0, arg: __self_1 } =>
::core::fmt::Formatter::debug_struct_field2_finish(f,
"Borrow", "borrow_kind", __self_0, "arg", &__self_1),
ExprKind::RawBorrow { mutability: __self_0, arg: __self_1 } =>
::core::fmt::Formatter::debug_struct_field2_finish(f,
"RawBorrow", "mutability", __self_0, "arg", &__self_1),
ExprKind::Break { label: __self_0, value: __self_1 } =>
::core::fmt::Formatter::debug_struct_field2_finish(f, "Break",
"label", __self_0, "value", &__self_1),
ExprKind::Continue { label: __self_0 } =>
::core::fmt::Formatter::debug_struct_field1_finish(f,
"Continue", "label", &__self_0),
ExprKind::ConstContinue { label: __self_0, value: __self_1 } =>
::core::fmt::Formatter::debug_struct_field2_finish(f,
"ConstContinue", "label", __self_0, "value", &__self_1),
ExprKind::Return { value: __self_0 } =>
::core::fmt::Formatter::debug_struct_field1_finish(f,
"Return", "value", &__self_0),
ExprKind::Become { value: __self_0 } =>
::core::fmt::Formatter::debug_struct_field1_finish(f,
"Become", "value", &__self_0),
ExprKind::ConstBlock { did: __self_0, args: __self_1 } =>
::core::fmt::Formatter::debug_struct_field2_finish(f,
"ConstBlock", "did", __self_0, "args", &__self_1),
ExprKind::Repeat { value: __self_0, count: __self_1 } =>
::core::fmt::Formatter::debug_struct_field2_finish(f,
"Repeat", "value", __self_0, "count", &__self_1),
ExprKind::Array { fields: __self_0 } =>
::core::fmt::Formatter::debug_struct_field1_finish(f, "Array",
"fields", &__self_0),
ExprKind::Tuple { fields: __self_0 } =>
::core::fmt::Formatter::debug_struct_field1_finish(f, "Tuple",
"fields", &__self_0),
ExprKind::Adt(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Adt",
&__self_0),
ExprKind::PlaceTypeAscription {
source: __self_0, user_ty: __self_1, user_ty_span: __self_2 }
=>
::core::fmt::Formatter::debug_struct_field3_finish(f,
"PlaceTypeAscription", "source", __self_0, "user_ty",
__self_1, "user_ty_span", &__self_2),
ExprKind::ValueTypeAscription {
source: __self_0, user_ty: __self_1, user_ty_span: __self_2 }
=>
::core::fmt::Formatter::debug_struct_field3_finish(f,
"ValueTypeAscription", "source", __self_0, "user_ty",
__self_1, "user_ty_span", &__self_2),
ExprKind::PlaceUnwrapUnsafeBinder { source: __self_0 } =>
::core::fmt::Formatter::debug_struct_field1_finish(f,
"PlaceUnwrapUnsafeBinder", "source", &__self_0),
ExprKind::ValueUnwrapUnsafeBinder { source: __self_0 } =>
::core::fmt::Formatter::debug_struct_field1_finish(f,
"ValueUnwrapUnsafeBinder", "source", &__self_0),
ExprKind::WrapUnsafeBinder { source: __self_0 } =>
::core::fmt::Formatter::debug_struct_field1_finish(f,
"WrapUnsafeBinder", "source", &__self_0),
ExprKind::Closure(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"Closure", &__self_0),
ExprKind::Literal { lit: __self_0, neg: __self_1 } =>
::core::fmt::Formatter::debug_struct_field2_finish(f,
"Literal", "lit", __self_0, "neg", &__self_1),
ExprKind::NonHirLiteral { lit: __self_0, user_ty: __self_1 } =>
::core::fmt::Formatter::debug_struct_field2_finish(f,
"NonHirLiteral", "lit", __self_0, "user_ty", &__self_1),
ExprKind::ZstLiteral { user_ty: __self_0 } =>
::core::fmt::Formatter::debug_struct_field1_finish(f,
"ZstLiteral", "user_ty", &__self_0),
ExprKind::NamedConst {
def_id: __self_0, args: __self_1, user_ty: __self_2 } =>
::core::fmt::Formatter::debug_struct_field3_finish(f,
"NamedConst", "def_id", __self_0, "args", __self_1,
"user_ty", &__self_2),
ExprKind::ConstParam { param: __self_0, def_id: __self_1 } =>
::core::fmt::Formatter::debug_struct_field2_finish(f,
"ConstParam", "param", __self_0, "def_id", &__self_1),
ExprKind::StaticRef {
alloc_id: __self_0, ty: __self_1, def_id: __self_2 } =>
::core::fmt::Formatter::debug_struct_field3_finish(f,
"StaticRef", "alloc_id", __self_0, "ty", __self_1, "def_id",
&__self_2),
ExprKind::InlineAsm(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"InlineAsm", &__self_0),
ExprKind::ThreadLocalRef(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"ThreadLocalRef", &__self_0),
ExprKind::Yield { value: __self_0 } =>
::core::fmt::Formatter::debug_struct_field1_finish(f, "Yield",
"value", &__self_0),
ExprKind::Reborrow {
source: __self_0, mutability: __self_1, target: __self_2 } =>
::core::fmt::Formatter::debug_struct_field3_finish(f,
"Reborrow", "source", __self_0, "mutability", __self_1,
"target", &__self_2),
}
}
}Debug, const _: () =
{
impl<'tcx> ::rustc_data_structures::stable_hash::StableHash for
ExprKind<'tcx> {
#[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 {
ExprKind::Scope {
region_scope: ref __binding_0,
hir_id: ref __binding_1,
value: ref __binding_2 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
}
ExprKind::If {
if_then_scope: ref __binding_0,
cond: ref __binding_1,
then: ref __binding_2,
else_opt: ref __binding_3 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
{ __binding_3.stable_hash(__hcx, __hasher); }
}
ExprKind::Call {
ty: ref __binding_0,
fun: ref __binding_1,
args: ref __binding_2,
from_hir_call: ref __binding_3,
fn_span: ref __binding_4 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
{ __binding_3.stable_hash(__hcx, __hasher); }
{ __binding_4.stable_hash(__hcx, __hasher); }
}
ExprKind::ByUse {
expr: ref __binding_0, span: ref __binding_1 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
ExprKind::Deref { arg: ref __binding_0 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
ExprKind::Binary {
op: ref __binding_0,
lhs: ref __binding_1,
rhs: ref __binding_2 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
}
ExprKind::LogicalOp {
op: ref __binding_0,
lhs: ref __binding_1,
rhs: ref __binding_2 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
}
ExprKind::Unary { op: ref __binding_0, arg: ref __binding_1
} => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
ExprKind::Cast { source: ref __binding_0 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
ExprKind::Use { source: ref __binding_0 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
ExprKind::NeverToAny { source: ref __binding_0 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
ExprKind::PointerCoercion {
cast: ref __binding_0,
source: ref __binding_1,
is_from_as_cast: ref __binding_2 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
}
ExprKind::Loop { body: ref __binding_0 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
ExprKind::LoopMatch {
state: ref __binding_0,
region_scope: ref __binding_1,
match_data: ref __binding_2 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
}
ExprKind::Let { expr: ref __binding_0, pat: ref __binding_1
} => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
ExprKind::Match {
scrutinee: ref __binding_0,
arms: ref __binding_1,
match_source: ref __binding_2 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
}
ExprKind::Block { block: ref __binding_0 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
ExprKind::Assign {
lhs: ref __binding_0, rhs: ref __binding_1 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
ExprKind::AssignOp {
op: ref __binding_0,
lhs: ref __binding_1,
rhs: ref __binding_2 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
}
ExprKind::Field {
lhs: ref __binding_0,
variant_index: ref __binding_1,
name: ref __binding_2 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
}
ExprKind::Index {
lhs: ref __binding_0, index: ref __binding_1 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
ExprKind::VarRef { id: ref __binding_0 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
ExprKind::UpvarRef {
closure_def_id: ref __binding_0, var_hir_id: ref __binding_1
} => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
ExprKind::Borrow {
borrow_kind: ref __binding_0, arg: ref __binding_1 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
ExprKind::RawBorrow {
mutability: ref __binding_0, arg: ref __binding_1 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
ExprKind::Break {
label: ref __binding_0, value: ref __binding_1 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
ExprKind::Continue { label: ref __binding_0 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
ExprKind::ConstContinue {
label: ref __binding_0, value: ref __binding_1 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
ExprKind::Return { value: ref __binding_0 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
ExprKind::Become { value: ref __binding_0 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
ExprKind::ConstBlock {
did: ref __binding_0, args: ref __binding_1 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
ExprKind::Repeat {
value: ref __binding_0, count: ref __binding_1 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
ExprKind::Array { fields: ref __binding_0 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
ExprKind::Tuple { fields: ref __binding_0 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
ExprKind::Adt(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
ExprKind::PlaceTypeAscription {
source: ref __binding_0,
user_ty: ref __binding_1,
user_ty_span: ref __binding_2 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
}
ExprKind::ValueTypeAscription {
source: ref __binding_0,
user_ty: ref __binding_1,
user_ty_span: ref __binding_2 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
}
ExprKind::PlaceUnwrapUnsafeBinder { source: ref __binding_0
} => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
ExprKind::ValueUnwrapUnsafeBinder { source: ref __binding_0
} => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
ExprKind::WrapUnsafeBinder { source: ref __binding_0 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
ExprKind::Closure(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
ExprKind::Literal {
lit: ref __binding_0, neg: ref __binding_1 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
ExprKind::NonHirLiteral {
lit: ref __binding_0, user_ty: ref __binding_1 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
ExprKind::ZstLiteral { user_ty: ref __binding_0 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
ExprKind::NamedConst {
def_id: ref __binding_0,
args: ref __binding_1,
user_ty: ref __binding_2 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
}
ExprKind::ConstParam {
param: ref __binding_0, def_id: ref __binding_1 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
ExprKind::StaticRef {
alloc_id: ref __binding_0,
ty: ref __binding_1,
def_id: ref __binding_2 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
}
ExprKind::InlineAsm(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
ExprKind::ThreadLocalRef(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
ExprKind::Yield { value: ref __binding_0 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
ExprKind::Reborrow {
source: ref __binding_0,
mutability: ref __binding_1,
target: ref __binding_2 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
268pub enum ExprKind<'tcx> {
269 Scope {
272 region_scope: region::Scope,
273 hir_id: HirId,
274 value: ExprId,
275 },
276 If {
278 if_then_scope: region::Scope,
279 cond: ExprId,
280 then: ExprId,
282 else_opt: Option<ExprId>,
285 },
286 Call {
288 ty: Ty<'tcx>,
293 fun: ExprId,
295 args: Box<[ExprId]>,
300 from_hir_call: bool,
303 fn_span: Span,
306 },
307 ByUse {
309 expr: ExprId,
311 span: Span,
314 },
315 Deref {
317 arg: ExprId,
318 },
319 Binary {
321 op: BinOp,
322 lhs: ExprId,
323 rhs: ExprId,
324 },
325 LogicalOp {
328 op: LogicalOp,
329 lhs: ExprId,
330 rhs: ExprId,
331 },
332 Unary {
335 op: UnOp,
336 arg: ExprId,
337 },
338 Cast {
341 source: ExprId,
342 },
343 Use {
348 source: ExprId,
349 },
350 NeverToAny {
352 source: ExprId,
353 },
354 PointerCoercion {
357 cast: PointerCoercion,
358 source: ExprId,
359 is_from_as_cast: bool,
361 },
362 Loop {
364 body: ExprId,
365 },
366 LoopMatch {
368 state: ExprId,
371 region_scope: region::Scope,
372 match_data: Box<LoopMatchMatchData>,
373 },
374 Let {
382 expr: ExprId,
383 pat: Box<Pat<'tcx>>,
384 },
385 Match {
387 scrutinee: ExprId,
388 arms: Box<[ArmId]>,
389 match_source: MatchSource,
390 },
391 Block {
393 block: BlockId,
394 },
395 Assign {
397 lhs: ExprId,
398 rhs: ExprId,
399 },
400 AssignOp {
402 op: AssignOp,
403 lhs: ExprId,
404 rhs: ExprId,
405 },
406 Field {
408 lhs: ExprId,
409 variant_index: VariantIdx,
411 name: FieldIdx,
413 },
414 Index {
416 lhs: ExprId,
417 index: ExprId,
418 },
419 VarRef {
421 id: LocalVarId,
422 },
423 UpvarRef {
425 closure_def_id: DefId,
427
428 var_hir_id: LocalVarId,
430 },
431 Borrow {
433 borrow_kind: BorrowKind,
434 arg: ExprId,
435 },
436 RawBorrow {
438 mutability: hir::Mutability,
439 arg: ExprId,
440 },
441 Break {
443 label: region::Scope,
444 value: Option<ExprId>,
445 },
446 Continue {
448 label: region::Scope,
449 },
450 ConstContinue {
452 label: region::Scope,
453 value: ExprId,
454 },
455 Return {
457 value: Option<ExprId>,
458 },
459 Become {
461 value: ExprId,
462 },
463 ConstBlock {
465 did: DefId,
466 args: GenericArgsRef<'tcx>,
467 },
468 Repeat {
470 value: ExprId,
471 count: ty::Const<'tcx>,
472 },
473 Array {
475 fields: Box<[ExprId]>,
476 },
477 Tuple {
479 fields: Box<[ExprId]>,
480 },
481 Adt(Box<AdtExpr<'tcx>>),
483 PlaceTypeAscription {
485 source: ExprId,
486 user_ty: UserTy<'tcx>,
488 user_ty_span: Span,
489 },
490 ValueTypeAscription {
492 source: ExprId,
493 user_ty: UserTy<'tcx>,
495 user_ty_span: Span,
496 },
497 PlaceUnwrapUnsafeBinder {
499 source: ExprId,
500 },
501 ValueUnwrapUnsafeBinder {
504 source: ExprId,
505 },
506 WrapUnsafeBinder {
508 source: ExprId,
509 },
510 Closure(Box<ClosureExpr<'tcx>>),
512 Literal {
514 lit: hir::Lit,
515 neg: bool,
516 },
517 NonHirLiteral {
519 lit: ty::ScalarInt,
520 user_ty: UserTy<'tcx>,
521 },
522 ZstLiteral {
524 user_ty: UserTy<'tcx>,
525 },
526 NamedConst {
528 def_id: DefId,
529 args: GenericArgsRef<'tcx>,
530 user_ty: UserTy<'tcx>,
531 },
532 ConstParam {
533 param: ty::ParamConst,
534 def_id: DefId,
535 },
536 StaticRef {
542 alloc_id: AllocId,
543 ty: Ty<'tcx>,
544 def_id: DefId,
545 },
546 InlineAsm(Box<InlineAsmExpr<'tcx>>),
548 ThreadLocalRef(DefId),
550 Yield {
552 value: ExprId,
553 },
554 Reborrow {
562 source: ExprId,
563 mutability: Mutability,
564 target: Ty<'tcx>,
565 },
566}
567
568#[derive(#[automatically_derived]
impl ::core::clone::Clone for FieldExpr {
#[inline]
fn clone(&self) -> FieldExpr {
FieldExpr {
name: ::core::clone::Clone::clone(&self.name),
expr: ::core::clone::Clone::clone(&self.expr),
}
}
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for FieldExpr {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field2_finish(f, "FieldExpr",
"name", &self.name, "expr", &&self.expr)
}
}Debug, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for FieldExpr {
#[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 {
FieldExpr { name: ref __binding_0, expr: ref __binding_1 }
=> {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
572pub struct FieldExpr {
573 pub name: FieldIdx,
574 pub expr: ExprId,
575}
576
577#[derive(#[automatically_derived]
impl<'tcx> ::core::clone::Clone for FruInfo<'tcx> {
#[inline]
fn clone(&self) -> FruInfo<'tcx> {
FruInfo {
base: ::core::clone::Clone::clone(&self.base),
field_types: ::core::clone::Clone::clone(&self.field_types),
}
}
}Clone, #[automatically_derived]
impl<'tcx> ::core::fmt::Debug for FruInfo<'tcx> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field2_finish(f, "FruInfo",
"base", &self.base, "field_types", &&self.field_types)
}
}Debug, const _: () =
{
impl<'tcx> ::rustc_data_structures::stable_hash::StableHash for
FruInfo<'tcx> {
#[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 {
FruInfo {
base: ref __binding_0, field_types: ref __binding_1 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
578pub struct FruInfo<'tcx> {
579 pub base: ExprId,
580 pub field_types: Box<[Ty<'tcx>]>,
581}
582
583#[derive(#[automatically_derived]
impl<'tcx> ::core::clone::Clone for Arm<'tcx> {
#[inline]
fn clone(&self) -> Arm<'tcx> {
Arm {
pattern: ::core::clone::Clone::clone(&self.pattern),
guard: ::core::clone::Clone::clone(&self.guard),
body: ::core::clone::Clone::clone(&self.body),
hir_id: ::core::clone::Clone::clone(&self.hir_id),
scope: ::core::clone::Clone::clone(&self.scope),
span: ::core::clone::Clone::clone(&self.span),
}
}
}Clone, #[automatically_derived]
impl<'tcx> ::core::fmt::Debug for Arm<'tcx> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
let names: &'static _ =
&["pattern", "guard", "body", "hir_id", "scope", "span"];
let values: &[&dyn ::core::fmt::Debug] =
&[&self.pattern, &self.guard, &self.body, &self.hir_id,
&self.scope, &&self.span];
::core::fmt::Formatter::debug_struct_fields_finish(f, "Arm", names,
values)
}
}Debug, const _: () =
{
impl<'tcx> ::rustc_data_structures::stable_hash::StableHash for
Arm<'tcx> {
#[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 {
Arm {
pattern: ref __binding_0,
guard: ref __binding_1,
body: ref __binding_2,
hir_id: ref __binding_3,
scope: ref __binding_4,
span: ref __binding_5 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
{ __binding_3.stable_hash(__hcx, __hasher); }
{ __binding_4.stable_hash(__hcx, __hasher); }
{ __binding_5.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
585pub struct Arm<'tcx> {
586 pub pattern: Box<Pat<'tcx>>,
587 pub guard: Option<ExprId>,
588 pub body: ExprId,
589 pub hir_id: HirId,
590 pub scope: region::Scope,
591 pub span: Span,
592}
593
594#[derive(#[automatically_derived]
impl ::core::clone::Clone for LoopMatchMatchData {
#[inline]
fn clone(&self) -> LoopMatchMatchData {
LoopMatchMatchData {
scrutinee: ::core::clone::Clone::clone(&self.scrutinee),
arms: ::core::clone::Clone::clone(&self.arms),
span: ::core::clone::Clone::clone(&self.span),
}
}
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for LoopMatchMatchData {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field3_finish(f,
"LoopMatchMatchData", "scrutinee", &self.scrutinee, "arms",
&self.arms, "span", &&self.span)
}
}Debug, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for
LoopMatchMatchData {
#[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 {
LoopMatchMatchData {
scrutinee: ref __binding_0,
arms: ref __binding_1,
span: ref __binding_2 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
596pub struct LoopMatchMatchData {
597 pub scrutinee: ExprId,
598 pub arms: Box<[ArmId]>,
599 pub span: Span,
600}
601
602#[derive(#[automatically_derived]
impl ::core::marker::Copy for LogicalOp { }Copy, #[automatically_derived]
impl ::core::clone::Clone for LogicalOp {
#[inline]
fn clone(&self) -> LogicalOp { *self }
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for LogicalOp {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self { LogicalOp::And => "And", LogicalOp::Or => "Or", })
}
}Debug, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for LogicalOp {
#[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 { LogicalOp::And => {} LogicalOp::Or => {} }
}
}
};StableHash)]
603pub enum LogicalOp {
604 And,
606 Or,
608}
609
610#[derive(#[automatically_derived]
impl<'tcx> ::core::clone::Clone for InlineAsmOperand<'tcx> {
#[inline]
fn clone(&self) -> InlineAsmOperand<'tcx> {
match self {
InlineAsmOperand::In { reg: __self_0, expr: __self_1 } =>
InlineAsmOperand::In {
reg: ::core::clone::Clone::clone(__self_0),
expr: ::core::clone::Clone::clone(__self_1),
},
InlineAsmOperand::Out {
reg: __self_0, late: __self_1, expr: __self_2 } =>
InlineAsmOperand::Out {
reg: ::core::clone::Clone::clone(__self_0),
late: ::core::clone::Clone::clone(__self_1),
expr: ::core::clone::Clone::clone(__self_2),
},
InlineAsmOperand::InOut {
reg: __self_0, late: __self_1, expr: __self_2 } =>
InlineAsmOperand::InOut {
reg: ::core::clone::Clone::clone(__self_0),
late: ::core::clone::Clone::clone(__self_1),
expr: ::core::clone::Clone::clone(__self_2),
},
InlineAsmOperand::SplitInOut {
reg: __self_0,
late: __self_1,
in_expr: __self_2,
out_expr: __self_3 } =>
InlineAsmOperand::SplitInOut {
reg: ::core::clone::Clone::clone(__self_0),
late: ::core::clone::Clone::clone(__self_1),
in_expr: ::core::clone::Clone::clone(__self_2),
out_expr: ::core::clone::Clone::clone(__self_3),
},
InlineAsmOperand::Const { value: __self_0, span: __self_1 } =>
InlineAsmOperand::Const {
value: ::core::clone::Clone::clone(__self_0),
span: ::core::clone::Clone::clone(__self_1),
},
InlineAsmOperand::SymFn { value: __self_0 } =>
InlineAsmOperand::SymFn {
value: ::core::clone::Clone::clone(__self_0),
},
InlineAsmOperand::SymStatic { def_id: __self_0 } =>
InlineAsmOperand::SymStatic {
def_id: ::core::clone::Clone::clone(__self_0),
},
InlineAsmOperand::Label { block: __self_0 } =>
InlineAsmOperand::Label {
block: ::core::clone::Clone::clone(__self_0),
},
}
}
}Clone, #[automatically_derived]
impl<'tcx> ::core::fmt::Debug for InlineAsmOperand<'tcx> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
InlineAsmOperand::In { reg: __self_0, expr: __self_1 } =>
::core::fmt::Formatter::debug_struct_field2_finish(f, "In",
"reg", __self_0, "expr", &__self_1),
InlineAsmOperand::Out {
reg: __self_0, late: __self_1, expr: __self_2 } =>
::core::fmt::Formatter::debug_struct_field3_finish(f, "Out",
"reg", __self_0, "late", __self_1, "expr", &__self_2),
InlineAsmOperand::InOut {
reg: __self_0, late: __self_1, expr: __self_2 } =>
::core::fmt::Formatter::debug_struct_field3_finish(f, "InOut",
"reg", __self_0, "late", __self_1, "expr", &__self_2),
InlineAsmOperand::SplitInOut {
reg: __self_0,
late: __self_1,
in_expr: __self_2,
out_expr: __self_3 } =>
::core::fmt::Formatter::debug_struct_field4_finish(f,
"SplitInOut", "reg", __self_0, "late", __self_1, "in_expr",
__self_2, "out_expr", &__self_3),
InlineAsmOperand::Const { value: __self_0, span: __self_1 } =>
::core::fmt::Formatter::debug_struct_field2_finish(f, "Const",
"value", __self_0, "span", &__self_1),
InlineAsmOperand::SymFn { value: __self_0 } =>
::core::fmt::Formatter::debug_struct_field1_finish(f, "SymFn",
"value", &__self_0),
InlineAsmOperand::SymStatic { def_id: __self_0 } =>
::core::fmt::Formatter::debug_struct_field1_finish(f,
"SymStatic", "def_id", &__self_0),
InlineAsmOperand::Label { block: __self_0 } =>
::core::fmt::Formatter::debug_struct_field1_finish(f, "Label",
"block", &__self_0),
}
}
}Debug, const _: () =
{
impl<'tcx> ::rustc_data_structures::stable_hash::StableHash for
InlineAsmOperand<'tcx> {
#[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 {
InlineAsmOperand::In {
reg: ref __binding_0, expr: ref __binding_1 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
InlineAsmOperand::Out {
reg: ref __binding_0,
late: ref __binding_1,
expr: ref __binding_2 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
}
InlineAsmOperand::InOut {
reg: ref __binding_0,
late: ref __binding_1,
expr: ref __binding_2 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
}
InlineAsmOperand::SplitInOut {
reg: ref __binding_0,
late: ref __binding_1,
in_expr: ref __binding_2,
out_expr: ref __binding_3 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
{ __binding_3.stable_hash(__hcx, __hasher); }
}
InlineAsmOperand::Const {
value: ref __binding_0, span: ref __binding_1 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
InlineAsmOperand::SymFn { value: ref __binding_0 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
InlineAsmOperand::SymStatic { def_id: ref __binding_0 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
InlineAsmOperand::Label { block: ref __binding_0 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
611pub enum InlineAsmOperand<'tcx> {
612 In {
613 reg: InlineAsmRegOrRegClass,
614 expr: ExprId,
615 },
616 Out {
617 reg: InlineAsmRegOrRegClass,
618 late: bool,
619 expr: Option<ExprId>,
620 },
621 InOut {
622 reg: InlineAsmRegOrRegClass,
623 late: bool,
624 expr: ExprId,
625 },
626 SplitInOut {
627 reg: InlineAsmRegOrRegClass,
628 late: bool,
629 in_expr: ExprId,
630 out_expr: Option<ExprId>,
631 },
632 Const {
633 value: mir::Const<'tcx>,
634 span: Span,
635 },
636 SymFn {
637 value: ExprId,
638 },
639 SymStatic {
640 def_id: DefId,
641 },
642 Label {
643 block: BlockId,
644 },
645}
646
647#[derive(#[automatically_derived]
impl<'tcx> ::core::clone::Clone for FieldPat<'tcx> {
#[inline]
fn clone(&self) -> FieldPat<'tcx> {
FieldPat {
field: ::core::clone::Clone::clone(&self.field),
pattern: ::core::clone::Clone::clone(&self.pattern),
}
}
}Clone, #[automatically_derived]
impl<'tcx> ::core::fmt::Debug for FieldPat<'tcx> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field2_finish(f, "FieldPat",
"field", &self.field, "pattern", &&self.pattern)
}
}Debug, const _: () =
{
impl<'tcx> ::rustc_data_structures::stable_hash::StableHash for
FieldPat<'tcx> {
#[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 {
FieldPat { field: ref __binding_0, pattern: ref __binding_1
} => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash, const _: () =
{
impl<'tcx>
::rustc_middle::ty::TypeVisitable<::rustc_middle::ty::TyCtxt<'tcx>>
for FieldPat<'tcx> {
fn visit_with<__V: ::rustc_middle::ty::TypeVisitor<::rustc_middle::ty::TyCtxt<'tcx>>>(&self,
__visitor: &mut __V) -> __V::Result {
match *self {
FieldPat { field: ref __binding_0, pattern: ref __binding_1
} => {
{
match ::rustc_middle::ty::VisitorResult::branch(::rustc_middle::ty::TypeVisitable::visit_with(__binding_0,
__visitor)) {
::core::ops::ControlFlow::Continue(()) => {}
::core::ops::ControlFlow::Break(r) => {
return ::rustc_middle::ty::VisitorResult::from_residual(r);
}
}
}
{
match ::rustc_middle::ty::VisitorResult::branch(::rustc_middle::ty::TypeVisitable::visit_with(__binding_1,
__visitor)) {
::core::ops::ControlFlow::Continue(()) => {}
::core::ops::ControlFlow::Break(r) => {
return ::rustc_middle::ty::VisitorResult::from_residual(r);
}
}
}
}
}
<__V::Result as ::rustc_middle::ty::VisitorResult>::output()
}
}
};TypeVisitable)]
648pub struct FieldPat<'tcx> {
649 pub field: FieldIdx,
650 pub pattern: Pat<'tcx>,
651}
652
653#[derive(#[automatically_derived]
impl<'tcx> ::core::clone::Clone for PatExtra<'tcx> {
#[inline]
fn clone(&self) -> PatExtra<'tcx> {
PatExtra {
expanded_const: ::core::clone::Clone::clone(&self.expanded_const),
ascriptions: ::core::clone::Clone::clone(&self.ascriptions),
}
}
}Clone, #[automatically_derived]
impl<'tcx> ::core::fmt::Debug for PatExtra<'tcx> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field2_finish(f, "PatExtra",
"expanded_const", &self.expanded_const, "ascriptions",
&&self.ascriptions)
}
}Debug, #[automatically_derived]
impl<'tcx> ::core::default::Default for PatExtra<'tcx> {
#[inline]
fn default() -> PatExtra<'tcx> {
PatExtra {
expanded_const: ::core::default::Default::default(),
ascriptions: ::core::default::Default::default(),
}
}
}Default, const _: () =
{
impl<'tcx> ::rustc_data_structures::stable_hash::StableHash for
PatExtra<'tcx> {
#[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 {
PatExtra {
expanded_const: ref __binding_0,
ascriptions: ref __binding_1 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash, const _: () =
{
impl<'tcx>
::rustc_middle::ty::TypeVisitable<::rustc_middle::ty::TyCtxt<'tcx>>
for PatExtra<'tcx> {
fn visit_with<__V: ::rustc_middle::ty::TypeVisitor<::rustc_middle::ty::TyCtxt<'tcx>>>(&self,
__visitor: &mut __V) -> __V::Result {
match *self {
PatExtra {
expanded_const: ref __binding_0,
ascriptions: ref __binding_1 } => {
{
match ::rustc_middle::ty::VisitorResult::branch(::rustc_middle::ty::TypeVisitable::visit_with(__binding_0,
__visitor)) {
::core::ops::ControlFlow::Continue(()) => {}
::core::ops::ControlFlow::Break(r) => {
return ::rustc_middle::ty::VisitorResult::from_residual(r);
}
}
}
{
match ::rustc_middle::ty::VisitorResult::branch(::rustc_middle::ty::TypeVisitable::visit_with(__binding_1,
__visitor)) {
::core::ops::ControlFlow::Continue(()) => {}
::core::ops::ControlFlow::Break(r) => {
return ::rustc_middle::ty::VisitorResult::from_residual(r);
}
}
}
}
}
<__V::Result as ::rustc_middle::ty::VisitorResult>::output()
}
}
};TypeVisitable)]
655pub struct PatExtra<'tcx> {
656 pub expanded_const: Option<DefId>,
662
663 pub ascriptions: Vec<Ascription<'tcx>>,
666}
667
668#[derive(#[automatically_derived]
impl<'tcx> ::core::clone::Clone for Pat<'tcx> {
#[inline]
fn clone(&self) -> Pat<'tcx> {
Pat {
ty: ::core::clone::Clone::clone(&self.ty),
span: ::core::clone::Clone::clone(&self.span),
extra: ::core::clone::Clone::clone(&self.extra),
kind: ::core::clone::Clone::clone(&self.kind),
}
}
}Clone, #[automatically_derived]
impl<'tcx> ::core::fmt::Debug for Pat<'tcx> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field4_finish(f, "Pat", "ty",
&self.ty, "span", &self.span, "extra", &self.extra, "kind",
&&self.kind)
}
}Debug, const _: () =
{
impl<'tcx> ::rustc_data_structures::stable_hash::StableHash for
Pat<'tcx> {
#[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 {
Pat {
ty: ref __binding_0,
span: ref __binding_1,
extra: ref __binding_2,
kind: ref __binding_3 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
{ __binding_3.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash, const _: () =
{
impl<'tcx>
::rustc_middle::ty::TypeVisitable<::rustc_middle::ty::TyCtxt<'tcx>>
for Pat<'tcx> {
fn visit_with<__V: ::rustc_middle::ty::TypeVisitor<::rustc_middle::ty::TyCtxt<'tcx>>>(&self,
__visitor: &mut __V) -> __V::Result {
match *self {
Pat {
ty: ref __binding_0,
span: ref __binding_1,
extra: ref __binding_2,
kind: ref __binding_3 } => {
{
match ::rustc_middle::ty::VisitorResult::branch(::rustc_middle::ty::TypeVisitable::visit_with(__binding_0,
__visitor)) {
::core::ops::ControlFlow::Continue(()) => {}
::core::ops::ControlFlow::Break(r) => {
return ::rustc_middle::ty::VisitorResult::from_residual(r);
}
}
}
{
match ::rustc_middle::ty::VisitorResult::branch(::rustc_middle::ty::TypeVisitable::visit_with(__binding_1,
__visitor)) {
::core::ops::ControlFlow::Continue(()) => {}
::core::ops::ControlFlow::Break(r) => {
return ::rustc_middle::ty::VisitorResult::from_residual(r);
}
}
}
{
match ::rustc_middle::ty::VisitorResult::branch(::rustc_middle::ty::TypeVisitable::visit_with(__binding_2,
__visitor)) {
::core::ops::ControlFlow::Continue(()) => {}
::core::ops::ControlFlow::Break(r) => {
return ::rustc_middle::ty::VisitorResult::from_residual(r);
}
}
}
{
match ::rustc_middle::ty::VisitorResult::branch(::rustc_middle::ty::TypeVisitable::visit_with(__binding_3,
__visitor)) {
::core::ops::ControlFlow::Continue(()) => {}
::core::ops::ControlFlow::Break(r) => {
return ::rustc_middle::ty::VisitorResult::from_residual(r);
}
}
}
}
}
<__V::Result as ::rustc_middle::ty::VisitorResult>::output()
}
}
};TypeVisitable)]
669pub struct Pat<'tcx> {
670 pub ty: Ty<'tcx>,
671 pub span: Span,
672 pub extra: Option<Box<PatExtra<'tcx>>>,
673 pub kind: PatKind<'tcx>,
674}
675
676impl<'tcx> Pat<'tcx> {
677 pub fn simple_ident(&self) -> Option<Symbol> {
678 match self.kind {
679 PatKind::Binding {
680 name, mode: BindingMode(ByRef::No, _), subpattern: None, ..
681 } => Some(name),
682 _ => None,
683 }
684 }
685
686 pub fn each_binding(&self, mut f: impl FnMut(Symbol, ByRef, Ty<'tcx>, Span)) {
689 self.walk_always(|p| {
690 if let PatKind::Binding { name, mode, ty, .. } = p.kind {
691 f(name, mode.0, ty, p.span);
692 }
693 });
694 }
695
696 pub fn walk(&self, mut it: impl FnMut(&Pat<'tcx>) -> bool) {
700 self.walk_(&mut it)
701 }
702
703 fn walk_(&self, it: &mut impl FnMut(&Pat<'tcx>) -> bool) {
704 if !it(self) {
705 return;
706 }
707
708 for_each_immediate_subpat(self, |p| p.walk_(it));
709 }
710
711 pub fn pat_error_reported(&self) -> Result<(), ErrorGuaranteed> {
713 let mut error = None;
714 self.walk(|pat| {
715 if let PatKind::Error(e) = pat.kind
716 && error.is_none()
717 {
718 error = Some(e);
719 }
720 error.is_none()
721 });
722 match error {
723 None => Ok(()),
724 Some(e) => Err(e),
725 }
726 }
727
728 pub fn walk_always(&self, mut it: impl FnMut(&Pat<'tcx>)) {
732 self.walk(|p| {
733 it(p);
734 true
735 })
736 }
737}
738
739#[derive(#[automatically_derived]
impl<'tcx> ::core::clone::Clone for Ascription<'tcx> {
#[inline]
fn clone(&self) -> Ascription<'tcx> {
Ascription {
annotation: ::core::clone::Clone::clone(&self.annotation),
variance: ::core::clone::Clone::clone(&self.variance),
}
}
}Clone, #[automatically_derived]
impl<'tcx> ::core::fmt::Debug for Ascription<'tcx> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field2_finish(f, "Ascription",
"annotation", &self.annotation, "variance", &&self.variance)
}
}Debug, const _: () =
{
impl<'tcx> ::rustc_data_structures::stable_hash::StableHash for
Ascription<'tcx> {
#[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 {
Ascription {
annotation: ref __binding_0, variance: ref __binding_1 } =>
{
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash, const _: () =
{
impl<'tcx>
::rustc_middle::ty::TypeVisitable<::rustc_middle::ty::TyCtxt<'tcx>>
for Ascription<'tcx> {
fn visit_with<__V: ::rustc_middle::ty::TypeVisitor<::rustc_middle::ty::TyCtxt<'tcx>>>(&self,
__visitor: &mut __V) -> __V::Result {
match *self {
Ascription {
annotation: ref __binding_0, variance: ref __binding_1 } =>
{
{
match ::rustc_middle::ty::VisitorResult::branch(::rustc_middle::ty::TypeVisitable::visit_with(__binding_0,
__visitor)) {
::core::ops::ControlFlow::Continue(()) => {}
::core::ops::ControlFlow::Break(r) => {
return ::rustc_middle::ty::VisitorResult::from_residual(r);
}
}
}
{
match ::rustc_middle::ty::VisitorResult::branch(::rustc_middle::ty::TypeVisitable::visit_with(__binding_1,
__visitor)) {
::core::ops::ControlFlow::Continue(()) => {}
::core::ops::ControlFlow::Break(r) => {
return ::rustc_middle::ty::VisitorResult::from_residual(r);
}
}
}
}
}
<__V::Result as ::rustc_middle::ty::VisitorResult>::output()
}
}
};TypeVisitable)]
740pub struct Ascription<'tcx> {
741 pub annotation: CanonicalUserTypeAnnotation<'tcx>,
742 pub variance: ty::Variance,
761}
762
763#[derive(#[automatically_derived]
impl<'tcx> ::core::clone::Clone for PatKind<'tcx> {
#[inline]
fn clone(&self) -> PatKind<'tcx> {
match self {
PatKind::Missing => PatKind::Missing,
PatKind::Wild => PatKind::Wild,
PatKind::Binding {
name: __self_0,
mode: __self_1,
var: __self_2,
ty: __self_3,
subpattern: __self_4,
is_primary: __self_5,
is_shorthand: __self_6 } =>
PatKind::Binding {
name: ::core::clone::Clone::clone(__self_0),
mode: ::core::clone::Clone::clone(__self_1),
var: ::core::clone::Clone::clone(__self_2),
ty: ::core::clone::Clone::clone(__self_3),
subpattern: ::core::clone::Clone::clone(__self_4),
is_primary: ::core::clone::Clone::clone(__self_5),
is_shorthand: ::core::clone::Clone::clone(__self_6),
},
PatKind::Variant {
adt_def: __self_0,
args: __self_1,
variant_index: __self_2,
subpatterns: __self_3 } =>
PatKind::Variant {
adt_def: ::core::clone::Clone::clone(__self_0),
args: ::core::clone::Clone::clone(__self_1),
variant_index: ::core::clone::Clone::clone(__self_2),
subpatterns: ::core::clone::Clone::clone(__self_3),
},
PatKind::Leaf { subpatterns: __self_0 } =>
PatKind::Leaf {
subpatterns: ::core::clone::Clone::clone(__self_0),
},
PatKind::Deref { pin: __self_0, subpattern: __self_1 } =>
PatKind::Deref {
pin: ::core::clone::Clone::clone(__self_0),
subpattern: ::core::clone::Clone::clone(__self_1),
},
PatKind::DerefPattern { subpattern: __self_0, borrow: __self_1 }
=>
PatKind::DerefPattern {
subpattern: ::core::clone::Clone::clone(__self_0),
borrow: ::core::clone::Clone::clone(__self_1),
},
PatKind::Constant { value: __self_0 } =>
PatKind::Constant {
value: ::core::clone::Clone::clone(__self_0),
},
PatKind::Range(__self_0) =>
PatKind::Range(::core::clone::Clone::clone(__self_0)),
PatKind::Slice {
prefix: __self_0, slice: __self_1, suffix: __self_2 } =>
PatKind::Slice {
prefix: ::core::clone::Clone::clone(__self_0),
slice: ::core::clone::Clone::clone(__self_1),
suffix: ::core::clone::Clone::clone(__self_2),
},
PatKind::Array {
prefix: __self_0, slice: __self_1, suffix: __self_2 } =>
PatKind::Array {
prefix: ::core::clone::Clone::clone(__self_0),
slice: ::core::clone::Clone::clone(__self_1),
suffix: ::core::clone::Clone::clone(__self_2),
},
PatKind::Or { pats: __self_0 } =>
PatKind::Or { pats: ::core::clone::Clone::clone(__self_0) },
PatKind::Guard { subpattern: __self_0, condition: __self_1 } =>
PatKind::Guard {
subpattern: ::core::clone::Clone::clone(__self_0),
condition: ::core::clone::Clone::clone(__self_1),
},
PatKind::Never => PatKind::Never,
PatKind::Error(__self_0) =>
PatKind::Error(::core::clone::Clone::clone(__self_0)),
}
}
}Clone, #[automatically_derived]
impl<'tcx> ::core::fmt::Debug for PatKind<'tcx> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
PatKind::Missing =>
::core::fmt::Formatter::write_str(f, "Missing"),
PatKind::Wild => ::core::fmt::Formatter::write_str(f, "Wild"),
PatKind::Binding {
name: __self_0,
mode: __self_1,
var: __self_2,
ty: __self_3,
subpattern: __self_4,
is_primary: __self_5,
is_shorthand: __self_6 } => {
let names: &'static _ =
&["name", "mode", "var", "ty", "subpattern", "is_primary",
"is_shorthand"];
let values: &[&dyn ::core::fmt::Debug] =
&[__self_0, __self_1, __self_2, __self_3, __self_4,
__self_5, &__self_6];
::core::fmt::Formatter::debug_struct_fields_finish(f,
"Binding", names, values)
}
PatKind::Variant {
adt_def: __self_0,
args: __self_1,
variant_index: __self_2,
subpatterns: __self_3 } =>
::core::fmt::Formatter::debug_struct_field4_finish(f,
"Variant", "adt_def", __self_0, "args", __self_1,
"variant_index", __self_2, "subpatterns", &__self_3),
PatKind::Leaf { subpatterns: __self_0 } =>
::core::fmt::Formatter::debug_struct_field1_finish(f, "Leaf",
"subpatterns", &__self_0),
PatKind::Deref { pin: __self_0, subpattern: __self_1 } =>
::core::fmt::Formatter::debug_struct_field2_finish(f, "Deref",
"pin", __self_0, "subpattern", &__self_1),
PatKind::DerefPattern { subpattern: __self_0, borrow: __self_1 }
=>
::core::fmt::Formatter::debug_struct_field2_finish(f,
"DerefPattern", "subpattern", __self_0, "borrow",
&__self_1),
PatKind::Constant { value: __self_0 } =>
::core::fmt::Formatter::debug_struct_field1_finish(f,
"Constant", "value", &__self_0),
PatKind::Range(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Range",
&__self_0),
PatKind::Slice {
prefix: __self_0, slice: __self_1, suffix: __self_2 } =>
::core::fmt::Formatter::debug_struct_field3_finish(f, "Slice",
"prefix", __self_0, "slice", __self_1, "suffix", &__self_2),
PatKind::Array {
prefix: __self_0, slice: __self_1, suffix: __self_2 } =>
::core::fmt::Formatter::debug_struct_field3_finish(f, "Array",
"prefix", __self_0, "slice", __self_1, "suffix", &__self_2),
PatKind::Or { pats: __self_0 } =>
::core::fmt::Formatter::debug_struct_field1_finish(f, "Or",
"pats", &__self_0),
PatKind::Guard { subpattern: __self_0, condition: __self_1 } =>
::core::fmt::Formatter::debug_struct_field2_finish(f, "Guard",
"subpattern", __self_0, "condition", &__self_1),
PatKind::Never => ::core::fmt::Formatter::write_str(f, "Never"),
PatKind::Error(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Error",
&__self_0),
}
}
}Debug, const _: () =
{
impl<'tcx> ::rustc_data_structures::stable_hash::StableHash for
PatKind<'tcx> {
#[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 {
PatKind::Missing => {}
PatKind::Wild => {}
PatKind::Binding {
name: ref __binding_0,
mode: ref __binding_1,
var: ref __binding_2,
ty: ref __binding_3,
subpattern: ref __binding_4,
is_primary: ref __binding_5,
is_shorthand: ref __binding_6 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
{ __binding_3.stable_hash(__hcx, __hasher); }
{ __binding_4.stable_hash(__hcx, __hasher); }
{ __binding_5.stable_hash(__hcx, __hasher); }
{ __binding_6.stable_hash(__hcx, __hasher); }
}
PatKind::Variant {
adt_def: ref __binding_0,
args: ref __binding_1,
variant_index: ref __binding_2,
subpatterns: ref __binding_3 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
{ __binding_3.stable_hash(__hcx, __hasher); }
}
PatKind::Leaf { subpatterns: ref __binding_0 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
PatKind::Deref {
pin: ref __binding_0, subpattern: ref __binding_1 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
PatKind::DerefPattern {
subpattern: ref __binding_0, borrow: ref __binding_1 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
PatKind::Constant { value: ref __binding_0 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
PatKind::Range(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
PatKind::Slice {
prefix: ref __binding_0,
slice: ref __binding_1,
suffix: ref __binding_2 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
}
PatKind::Array {
prefix: ref __binding_0,
slice: ref __binding_1,
suffix: ref __binding_2 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
}
PatKind::Or { pats: ref __binding_0 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
PatKind::Guard {
subpattern: ref __binding_0, condition: ref __binding_1 } =>
{
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
PatKind::Never => {}
PatKind::Error(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash, const _: () =
{
impl<'tcx>
::rustc_middle::ty::TypeVisitable<::rustc_middle::ty::TyCtxt<'tcx>>
for PatKind<'tcx> {
fn visit_with<__V: ::rustc_middle::ty::TypeVisitor<::rustc_middle::ty::TyCtxt<'tcx>>>(&self,
__visitor: &mut __V) -> __V::Result {
match *self {
PatKind::Missing => {}
PatKind::Wild => {}
PatKind::Binding {
name: ref __binding_0,
ty: ref __binding_3,
subpattern: ref __binding_4,
is_primary: ref __binding_5,
is_shorthand: ref __binding_6, .. } => {
{
match ::rustc_middle::ty::VisitorResult::branch(::rustc_middle::ty::TypeVisitable::visit_with(__binding_0,
__visitor)) {
::core::ops::ControlFlow::Continue(()) => {}
::core::ops::ControlFlow::Break(r) => {
return ::rustc_middle::ty::VisitorResult::from_residual(r);
}
}
}
{
match ::rustc_middle::ty::VisitorResult::branch(::rustc_middle::ty::TypeVisitable::visit_with(__binding_3,
__visitor)) {
::core::ops::ControlFlow::Continue(()) => {}
::core::ops::ControlFlow::Break(r) => {
return ::rustc_middle::ty::VisitorResult::from_residual(r);
}
}
}
{
match ::rustc_middle::ty::VisitorResult::branch(::rustc_middle::ty::TypeVisitable::visit_with(__binding_4,
__visitor)) {
::core::ops::ControlFlow::Continue(()) => {}
::core::ops::ControlFlow::Break(r) => {
return ::rustc_middle::ty::VisitorResult::from_residual(r);
}
}
}
{
match ::rustc_middle::ty::VisitorResult::branch(::rustc_middle::ty::TypeVisitable::visit_with(__binding_5,
__visitor)) {
::core::ops::ControlFlow::Continue(()) => {}
::core::ops::ControlFlow::Break(r) => {
return ::rustc_middle::ty::VisitorResult::from_residual(r);
}
}
}
{
match ::rustc_middle::ty::VisitorResult::branch(::rustc_middle::ty::TypeVisitable::visit_with(__binding_6,
__visitor)) {
::core::ops::ControlFlow::Continue(()) => {}
::core::ops::ControlFlow::Break(r) => {
return ::rustc_middle::ty::VisitorResult::from_residual(r);
}
}
}
}
PatKind::Variant {
adt_def: ref __binding_0,
args: ref __binding_1,
variant_index: ref __binding_2,
subpatterns: ref __binding_3 } => {
{
match ::rustc_middle::ty::VisitorResult::branch(::rustc_middle::ty::TypeVisitable::visit_with(__binding_0,
__visitor)) {
::core::ops::ControlFlow::Continue(()) => {}
::core::ops::ControlFlow::Break(r) => {
return ::rustc_middle::ty::VisitorResult::from_residual(r);
}
}
}
{
match ::rustc_middle::ty::VisitorResult::branch(::rustc_middle::ty::TypeVisitable::visit_with(__binding_1,
__visitor)) {
::core::ops::ControlFlow::Continue(()) => {}
::core::ops::ControlFlow::Break(r) => {
return ::rustc_middle::ty::VisitorResult::from_residual(r);
}
}
}
{
match ::rustc_middle::ty::VisitorResult::branch(::rustc_middle::ty::TypeVisitable::visit_with(__binding_2,
__visitor)) {
::core::ops::ControlFlow::Continue(()) => {}
::core::ops::ControlFlow::Break(r) => {
return ::rustc_middle::ty::VisitorResult::from_residual(r);
}
}
}
{
match ::rustc_middle::ty::VisitorResult::branch(::rustc_middle::ty::TypeVisitable::visit_with(__binding_3,
__visitor)) {
::core::ops::ControlFlow::Continue(()) => {}
::core::ops::ControlFlow::Break(r) => {
return ::rustc_middle::ty::VisitorResult::from_residual(r);
}
}
}
}
PatKind::Leaf { subpatterns: ref __binding_0 } => {
{
match ::rustc_middle::ty::VisitorResult::branch(::rustc_middle::ty::TypeVisitable::visit_with(__binding_0,
__visitor)) {
::core::ops::ControlFlow::Continue(()) => {}
::core::ops::ControlFlow::Break(r) => {
return ::rustc_middle::ty::VisitorResult::from_residual(r);
}
}
}
}
PatKind::Deref { subpattern: ref __binding_1, .. } => {
{
match ::rustc_middle::ty::VisitorResult::branch(::rustc_middle::ty::TypeVisitable::visit_with(__binding_1,
__visitor)) {
::core::ops::ControlFlow::Continue(()) => {}
::core::ops::ControlFlow::Break(r) => {
return ::rustc_middle::ty::VisitorResult::from_residual(r);
}
}
}
}
PatKind::DerefPattern { subpattern: ref __binding_0, .. } =>
{
{
match ::rustc_middle::ty::VisitorResult::branch(::rustc_middle::ty::TypeVisitable::visit_with(__binding_0,
__visitor)) {
::core::ops::ControlFlow::Continue(()) => {}
::core::ops::ControlFlow::Break(r) => {
return ::rustc_middle::ty::VisitorResult::from_residual(r);
}
}
}
}
PatKind::Constant { value: ref __binding_0 } => {
{
match ::rustc_middle::ty::VisitorResult::branch(::rustc_middle::ty::TypeVisitable::visit_with(__binding_0,
__visitor)) {
::core::ops::ControlFlow::Continue(()) => {}
::core::ops::ControlFlow::Break(r) => {
return ::rustc_middle::ty::VisitorResult::from_residual(r);
}
}
}
}
PatKind::Range(ref __binding_0) => {
{
match ::rustc_middle::ty::VisitorResult::branch(::rustc_middle::ty::TypeVisitable::visit_with(__binding_0,
__visitor)) {
::core::ops::ControlFlow::Continue(()) => {}
::core::ops::ControlFlow::Break(r) => {
return ::rustc_middle::ty::VisitorResult::from_residual(r);
}
}
}
}
PatKind::Slice {
prefix: ref __binding_0,
slice: ref __binding_1,
suffix: ref __binding_2 } => {
{
match ::rustc_middle::ty::VisitorResult::branch(::rustc_middle::ty::TypeVisitable::visit_with(__binding_0,
__visitor)) {
::core::ops::ControlFlow::Continue(()) => {}
::core::ops::ControlFlow::Break(r) => {
return ::rustc_middle::ty::VisitorResult::from_residual(r);
}
}
}
{
match ::rustc_middle::ty::VisitorResult::branch(::rustc_middle::ty::TypeVisitable::visit_with(__binding_1,
__visitor)) {
::core::ops::ControlFlow::Continue(()) => {}
::core::ops::ControlFlow::Break(r) => {
return ::rustc_middle::ty::VisitorResult::from_residual(r);
}
}
}
{
match ::rustc_middle::ty::VisitorResult::branch(::rustc_middle::ty::TypeVisitable::visit_with(__binding_2,
__visitor)) {
::core::ops::ControlFlow::Continue(()) => {}
::core::ops::ControlFlow::Break(r) => {
return ::rustc_middle::ty::VisitorResult::from_residual(r);
}
}
}
}
PatKind::Array {
prefix: ref __binding_0,
slice: ref __binding_1,
suffix: ref __binding_2 } => {
{
match ::rustc_middle::ty::VisitorResult::branch(::rustc_middle::ty::TypeVisitable::visit_with(__binding_0,
__visitor)) {
::core::ops::ControlFlow::Continue(()) => {}
::core::ops::ControlFlow::Break(r) => {
return ::rustc_middle::ty::VisitorResult::from_residual(r);
}
}
}
{
match ::rustc_middle::ty::VisitorResult::branch(::rustc_middle::ty::TypeVisitable::visit_with(__binding_1,
__visitor)) {
::core::ops::ControlFlow::Continue(()) => {}
::core::ops::ControlFlow::Break(r) => {
return ::rustc_middle::ty::VisitorResult::from_residual(r);
}
}
}
{
match ::rustc_middle::ty::VisitorResult::branch(::rustc_middle::ty::TypeVisitable::visit_with(__binding_2,
__visitor)) {
::core::ops::ControlFlow::Continue(()) => {}
::core::ops::ControlFlow::Break(r) => {
return ::rustc_middle::ty::VisitorResult::from_residual(r);
}
}
}
}
PatKind::Or { pats: ref __binding_0 } => {
{
match ::rustc_middle::ty::VisitorResult::branch(::rustc_middle::ty::TypeVisitable::visit_with(__binding_0,
__visitor)) {
::core::ops::ControlFlow::Continue(()) => {}
::core::ops::ControlFlow::Break(r) => {
return ::rustc_middle::ty::VisitorResult::from_residual(r);
}
}
}
}
PatKind::Guard { subpattern: ref __binding_0, .. } => {
{
match ::rustc_middle::ty::VisitorResult::branch(::rustc_middle::ty::TypeVisitable::visit_with(__binding_0,
__visitor)) {
::core::ops::ControlFlow::Continue(()) => {}
::core::ops::ControlFlow::Break(r) => {
return ::rustc_middle::ty::VisitorResult::from_residual(r);
}
}
}
}
PatKind::Never => {}
PatKind::Error(ref __binding_0) => {
{
match ::rustc_middle::ty::VisitorResult::branch(::rustc_middle::ty::TypeVisitable::visit_with(__binding_0,
__visitor)) {
::core::ops::ControlFlow::Continue(()) => {}
::core::ops::ControlFlow::Break(r) => {
return ::rustc_middle::ty::VisitorResult::from_residual(r);
}
}
}
}
}
<__V::Result as ::rustc_middle::ty::VisitorResult>::output()
}
}
};TypeVisitable)]
764pub enum PatKind<'tcx> {
765 Missing,
767
768 Wild,
770
771 Binding {
773 name: Symbol,
774 #[type_visitable(ignore)]
775 mode: BindingMode,
776 #[type_visitable(ignore)]
777 var: LocalVarId,
778 ty: Ty<'tcx>,
779 subpattern: Option<Box<Pat<'tcx>>>,
780
781 is_primary: bool,
787 is_shorthand: bool,
789 },
790
791 Variant {
794 adt_def: AdtDef<'tcx>,
795 args: GenericArgsRef<'tcx>,
796 variant_index: VariantIdx,
797 subpatterns: Vec<FieldPat<'tcx>>,
798 },
799
800 Leaf {
803 subpatterns: Vec<FieldPat<'tcx>>,
804 },
805
806 Deref {
813 #[type_visitable(ignore)]
814 pin: hir::Pinnedness,
815 subpattern: Box<Pat<'tcx>>,
816 },
817
818 DerefPattern {
823 subpattern: Box<Pat<'tcx>>,
824 #[type_visitable(ignore)]
829 borrow: DerefPatBorrowMode,
830 },
831
832 Constant {
842 value: ty::Value<'tcx>,
843 },
844
845 Range(Arc<PatRange<'tcx>>),
846
847 Slice {
851 prefix: Box<[Pat<'tcx>]>,
852 slice: Option<Box<Pat<'tcx>>>,
853 suffix: Box<[Pat<'tcx>]>,
854 },
855
856 Array {
858 prefix: Box<[Pat<'tcx>]>,
859 slice: Option<Box<Pat<'tcx>>>,
860 suffix: Box<[Pat<'tcx>]>,
861 },
862
863 Or {
866 pats: Box<[Pat<'tcx>]>,
867 },
868
869 Guard {
871 subpattern: Box<Pat<'tcx>>,
872 #[type_visitable(ignore)]
873 condition: ExprId,
874 },
875
876 Never,
878
879 Error(ErrorGuaranteed),
882}
883
884#[derive(#[automatically_derived]
impl ::core::marker::Copy for DerefPatBorrowMode { }Copy, #[automatically_derived]
impl ::core::clone::Clone for DerefPatBorrowMode {
#[inline]
fn clone(&self) -> DerefPatBorrowMode {
let _: ::core::clone::AssertParamIsClone<Mutability>;
*self
}
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for DerefPatBorrowMode {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
DerefPatBorrowMode::Borrow(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Borrow",
&__self_0),
DerefPatBorrowMode::Box =>
::core::fmt::Formatter::write_str(f, "Box"),
}
}
}Debug, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for
DerefPatBorrowMode {
#[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 {
DerefPatBorrowMode::Borrow(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
DerefPatBorrowMode::Box => {}
}
}
}
};StableHash)]
885pub enum DerefPatBorrowMode {
886 Borrow(Mutability),
887 Box,
888}
889
890#[derive(#[automatically_derived]
impl<'tcx> ::core::clone::Clone for PatRange<'tcx> {
#[inline]
fn clone(&self) -> PatRange<'tcx> {
PatRange {
lo: ::core::clone::Clone::clone(&self.lo),
hi: ::core::clone::Clone::clone(&self.hi),
end: ::core::clone::Clone::clone(&self.end),
ty: ::core::clone::Clone::clone(&self.ty),
}
}
}Clone, #[automatically_derived]
impl<'tcx> ::core::fmt::Debug for PatRange<'tcx> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field4_finish(f, "PatRange",
"lo", &self.lo, "hi", &self.hi, "end", &self.end, "ty", &&self.ty)
}
}Debug, #[automatically_derived]
impl<'tcx> ::core::cmp::PartialEq for PatRange<'tcx> {
#[inline]
fn eq(&self, other: &PatRange<'tcx>) -> bool {
self.lo == other.lo && self.hi == other.hi && self.end == other.end &&
self.ty == other.ty
}
}PartialEq, const _: () =
{
impl<'tcx> ::rustc_data_structures::stable_hash::StableHash for
PatRange<'tcx> {
#[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 {
PatRange {
lo: ref __binding_0,
hi: ref __binding_1,
end: ref __binding_2,
ty: ref __binding_3 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
{ __binding_3.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash, const _: () =
{
impl<'tcx>
::rustc_middle::ty::TypeVisitable<::rustc_middle::ty::TyCtxt<'tcx>>
for PatRange<'tcx> {
fn visit_with<__V: ::rustc_middle::ty::TypeVisitor<::rustc_middle::ty::TyCtxt<'tcx>>>(&self,
__visitor: &mut __V) -> __V::Result {
match *self {
PatRange {
lo: ref __binding_0,
hi: ref __binding_1,
ty: ref __binding_3, .. } => {
{
match ::rustc_middle::ty::VisitorResult::branch(::rustc_middle::ty::TypeVisitable::visit_with(__binding_0,
__visitor)) {
::core::ops::ControlFlow::Continue(()) => {}
::core::ops::ControlFlow::Break(r) => {
return ::rustc_middle::ty::VisitorResult::from_residual(r);
}
}
}
{
match ::rustc_middle::ty::VisitorResult::branch(::rustc_middle::ty::TypeVisitable::visit_with(__binding_1,
__visitor)) {
::core::ops::ControlFlow::Continue(()) => {}
::core::ops::ControlFlow::Break(r) => {
return ::rustc_middle::ty::VisitorResult::from_residual(r);
}
}
}
{
match ::rustc_middle::ty::VisitorResult::branch(::rustc_middle::ty::TypeVisitable::visit_with(__binding_3,
__visitor)) {
::core::ops::ControlFlow::Continue(()) => {}
::core::ops::ControlFlow::Break(r) => {
return ::rustc_middle::ty::VisitorResult::from_residual(r);
}
}
}
}
}
<__V::Result as ::rustc_middle::ty::VisitorResult>::output()
}
}
};TypeVisitable)]
893pub struct PatRange<'tcx> {
894 pub lo: PatRangeBoundary<'tcx>,
896 pub hi: PatRangeBoundary<'tcx>,
898 #[type_visitable(ignore)]
899 pub end: RangeEnd,
900 pub ty: Ty<'tcx>,
901}
902
903impl<'tcx> PatRange<'tcx> {
904 #[inline]
906 pub fn is_full_range(&self, tcx: TyCtxt<'tcx>) -> Option<bool> {
907 let (min, max, size, bias) = match *self.ty.kind() {
908 ty::Char => (0, std::char::MAX as u128, Size::from_bits(32), 0),
909 ty::Int(ity) => {
910 let size = Integer::from_int_ty(&tcx, ity).size();
911 let max = size.truncate(u128::MAX);
912 let bias = 1u128 << (size.bits() - 1);
913 (0, max, size, bias)
914 }
915 ty::Uint(uty) => {
916 let size = Integer::from_uint_ty(&tcx, uty).size();
917 let max = size.unsigned_int_max();
918 (0, max, size, 0)
919 }
920 _ => return None,
921 };
922
923 let lo_is_min = match self.lo {
931 PatRangeBoundary::NegInfinity => true,
932 PatRangeBoundary::Finite(value) => {
933 let lo = value.to_leaf().to_bits(size) ^ bias;
934 lo <= min
935 }
936 PatRangeBoundary::PosInfinity => false,
937 };
938 if lo_is_min {
939 let hi_is_max = match self.hi {
940 PatRangeBoundary::NegInfinity => false,
941 PatRangeBoundary::Finite(value) => {
942 let hi = value.to_leaf().to_bits(size) ^ bias;
943 hi > max || hi == max && self.end == RangeEnd::Included
944 }
945 PatRangeBoundary::PosInfinity => true,
946 };
947 if hi_is_max {
948 return Some(true);
949 }
950 }
951 Some(false)
952 }
953
954 #[inline]
955 pub fn contains(&self, value: ty::Value<'tcx>, tcx: TyCtxt<'tcx>) -> Option<bool> {
956 use Ordering::*;
957 if true {
match (&value.ty, &self.ty) {
(left_val, right_val) => {
if !(*left_val == *right_val) {
let kind = ::core::panicking::AssertKind::Eq;
::core::panicking::assert_failed(kind, &*left_val,
&*right_val, ::core::option::Option::None);
}
}
};
};debug_assert_eq!(value.ty, self.ty);
958 let ty = self.ty;
959 let value = PatRangeBoundary::Finite(value.valtree);
960 Some(
962 match self.lo.compare_with(value, ty, tcx)? {
963 Less | Equal => true,
964 Greater => false,
965 } && match value.compare_with(self.hi, ty, tcx)? {
966 Less => true,
967 Equal => self.end == RangeEnd::Included,
968 Greater => false,
969 },
970 )
971 }
972
973 #[inline]
974 pub fn overlaps(&self, other: &Self, tcx: TyCtxt<'tcx>) -> Option<bool> {
975 use Ordering::*;
976 if true {
match (&self.ty, &other.ty) {
(left_val, right_val) => {
if !(*left_val == *right_val) {
let kind = ::core::panicking::AssertKind::Eq;
::core::panicking::assert_failed(kind, &*left_val,
&*right_val, ::core::option::Option::None);
}
}
};
};debug_assert_eq!(self.ty, other.ty);
977 Some(
979 match other.lo.compare_with(self.hi, self.ty, tcx)? {
980 Less => true,
981 Equal => self.end == RangeEnd::Included,
982 Greater => false,
983 } && match self.lo.compare_with(other.hi, self.ty, tcx)? {
984 Less => true,
985 Equal => other.end == RangeEnd::Included,
986 Greater => false,
987 },
988 )
989 }
990}
991
992impl<'tcx> fmt::Display for PatRange<'tcx> {
993 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
994 if let &PatRangeBoundary::Finite(valtree) = &self.lo {
995 let value = ty::Value { ty: self.ty, valtree };
996 f.write_fmt(format_args!("{0}", value))write!(f, "{value}")?;
997 }
998 if let &PatRangeBoundary::Finite(valtree) = &self.hi {
999 f.write_fmt(format_args!("{0}", self.end))write!(f, "{}", self.end)?;
1000 let value = ty::Value { ty: self.ty, valtree };
1001 f.write_fmt(format_args!("{0}", value))write!(f, "{value}")?;
1002 } else {
1003 f.write_fmt(format_args!(".."))write!(f, "..")?;
1005 }
1006 Ok(())
1007 }
1008}
1009
1010#[derive(#[automatically_derived]
impl<'tcx> ::core::marker::Copy for PatRangeBoundary<'tcx> { }Copy, #[automatically_derived]
impl<'tcx> ::core::clone::Clone for PatRangeBoundary<'tcx> {
#[inline]
fn clone(&self) -> PatRangeBoundary<'tcx> {
let _: ::core::clone::AssertParamIsClone<ty::ValTree<'tcx>>;
*self
}
}Clone, #[automatically_derived]
impl<'tcx> ::core::fmt::Debug for PatRangeBoundary<'tcx> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
PatRangeBoundary::Finite(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Finite",
&__self_0),
PatRangeBoundary::NegInfinity =>
::core::fmt::Formatter::write_str(f, "NegInfinity"),
PatRangeBoundary::PosInfinity =>
::core::fmt::Formatter::write_str(f, "PosInfinity"),
}
}
}Debug, #[automatically_derived]
impl<'tcx> ::core::cmp::PartialEq for PatRangeBoundary<'tcx> {
#[inline]
fn eq(&self, other: &PatRangeBoundary<'tcx>) -> bool {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
__self_discr == __arg1_discr &&
match (self, other) {
(PatRangeBoundary::Finite(__self_0),
PatRangeBoundary::Finite(__arg1_0)) => __self_0 == __arg1_0,
_ => true,
}
}
}PartialEq, const _: () =
{
impl<'tcx> ::rustc_data_structures::stable_hash::StableHash for
PatRangeBoundary<'tcx> {
#[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 {
PatRangeBoundary::Finite(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
PatRangeBoundary::NegInfinity => {}
PatRangeBoundary::PosInfinity => {}
}
}
}
};StableHash, const _: () =
{
impl<'tcx>
::rustc_middle::ty::TypeVisitable<::rustc_middle::ty::TyCtxt<'tcx>>
for PatRangeBoundary<'tcx> {
fn visit_with<__V: ::rustc_middle::ty::TypeVisitor<::rustc_middle::ty::TyCtxt<'tcx>>>(&self,
__visitor: &mut __V) -> __V::Result {
match *self {
PatRangeBoundary::Finite(ref __binding_0) => {
{
match ::rustc_middle::ty::VisitorResult::branch(::rustc_middle::ty::TypeVisitable::visit_with(__binding_0,
__visitor)) {
::core::ops::ControlFlow::Continue(()) => {}
::core::ops::ControlFlow::Break(r) => {
return ::rustc_middle::ty::VisitorResult::from_residual(r);
}
}
}
}
PatRangeBoundary::NegInfinity => {}
PatRangeBoundary::PosInfinity => {}
}
<__V::Result as ::rustc_middle::ty::VisitorResult>::output()
}
}
};TypeVisitable)]
1013pub enum PatRangeBoundary<'tcx> {
1014 Finite(ty::ValTree<'tcx>),
1016 NegInfinity,
1017 PosInfinity,
1018}
1019
1020impl<'tcx> PatRangeBoundary<'tcx> {
1021 #[inline]
1022 pub fn is_finite(self) -> bool {
1023 #[allow(non_exhaustive_omitted_patterns)] match self {
Self::Finite(..) => true,
_ => false,
}matches!(self, Self::Finite(..))
1024 }
1025 #[inline]
1026 pub fn as_finite(self) -> Option<ty::ValTree<'tcx>> {
1027 match self {
1028 Self::Finite(value) => Some(value),
1029 Self::NegInfinity | Self::PosInfinity => None,
1030 }
1031 }
1032 pub fn to_bits(self, ty: Ty<'tcx>, tcx: TyCtxt<'tcx>) -> u128 {
1033 match self {
1034 Self::Finite(value) => value.to_leaf().to_bits_unchecked(),
1035 Self::NegInfinity => {
1036 ty.numeric_min_and_max_as_bits(tcx).unwrap().0
1038 }
1039 Self::PosInfinity => {
1040 ty.numeric_min_and_max_as_bits(tcx).unwrap().1
1042 }
1043 }
1044 }
1045
1046 x;#[instrument(skip(tcx), level = "debug", ret)]
1047 pub fn compare_with(self, other: Self, ty: Ty<'tcx>, tcx: TyCtxt<'tcx>) -> Option<Ordering> {
1048 use PatRangeBoundary::*;
1049 match (self, other) {
1050 (PosInfinity, PosInfinity) => return Some(Ordering::Equal),
1054 (NegInfinity, NegInfinity) => return Some(Ordering::Equal),
1055
1056 (Finite(a), Finite(b)) if matches!(ty.kind(), ty::Int(_) | ty::Uint(_) | ty::Char) => {
1062 if let (Some(a), Some(b)) = (a.try_to_leaf(), b.try_to_leaf()) {
1063 let sz = ty.primitive_size(tcx);
1064 let cmp = match ty.kind() {
1065 ty::Uint(_) | ty::Char => a.to_uint(sz).cmp(&b.to_uint(sz)),
1066 ty::Int(_) => a.to_int(sz).cmp(&b.to_int(sz)),
1067 _ => unreachable!(),
1068 };
1069 return Some(cmp);
1070 }
1071 }
1072 _ => {}
1073 }
1074
1075 let a = self.to_bits(ty, tcx);
1076 let b = other.to_bits(ty, tcx);
1077
1078 match ty.kind() {
1079 ty::Float(ty::FloatTy::F16) => {
1080 use rustc_apfloat::Float;
1081 let a = rustc_apfloat::ieee::Half::from_bits(a);
1082 let b = rustc_apfloat::ieee::Half::from_bits(b);
1083 a.partial_cmp(&b)
1084 }
1085 ty::Float(ty::FloatTy::F32) => {
1086 use rustc_apfloat::Float;
1087 let a = rustc_apfloat::ieee::Single::from_bits(a);
1088 let b = rustc_apfloat::ieee::Single::from_bits(b);
1089 a.partial_cmp(&b)
1090 }
1091 ty::Float(ty::FloatTy::F64) => {
1092 use rustc_apfloat::Float;
1093 let a = rustc_apfloat::ieee::Double::from_bits(a);
1094 let b = rustc_apfloat::ieee::Double::from_bits(b);
1095 a.partial_cmp(&b)
1096 }
1097 ty::Float(ty::FloatTy::F128) => {
1098 use rustc_apfloat::Float;
1099 let a = rustc_apfloat::ieee::Quad::from_bits(a);
1100 let b = rustc_apfloat::ieee::Quad::from_bits(b);
1101 a.partial_cmp(&b)
1102 }
1103 ty::Int(ity) => {
1104 let size = rustc_abi::Integer::from_int_ty(&tcx, *ity).size();
1105 let a = size.sign_extend(a) as i128;
1106 let b = size.sign_extend(b) as i128;
1107 Some(a.cmp(&b))
1108 }
1109 ty::Uint(_) | ty::Char => Some(a.cmp(&b)),
1110 _ => bug!(),
1111 }
1112 }
1113}
1114
1115#[cfg(target_pointer_width = "64")]
1117mod size_asserts {
1118 use rustc_data_structures::static_assert_size;
1119
1120 use super::*;
1121 const _: [(); 48] = [(); ::std::mem::size_of::<Block>()];static_assert_size!(Block, 48);
1123 const _: [(); 64] = [(); ::std::mem::size_of::<Expr<'_>>()];static_assert_size!(Expr<'_>, 64);
1124 const _: [(); 40] = [(); ::std::mem::size_of::<ExprKind<'_>>()];static_assert_size!(ExprKind<'_>, 40);
1125 const _: [(); 72] = [(); ::std::mem::size_of::<Pat<'_>>()];static_assert_size!(Pat<'_>, 72);
1126 const _: [(); 48] = [(); ::std::mem::size_of::<PatKind<'_>>()];static_assert_size!(PatKind<'_>, 48);
1127 const _: [(); 48] = [(); ::std::mem::size_of::<Stmt<'_>>()];static_assert_size!(Stmt<'_>, 48);
1128 const _: [(); 48] = [(); ::std::mem::size_of::<StmtKind<'_>>()];static_assert_size!(StmtKind<'_>, 48);
1129 }