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_hir as hir;
19use rustc_hir::def_id::DefId;
20use rustc_hir::{BindingMode, ByRef, HirId, MatchSource, RangeEnd};
21use rustc_index::{IndexVec, newtype_index};
22use rustc_macros::{HashStable, TyDecodable, TyEncodable, TypeVisitable};
23use rustc_span::def_id::LocalDefId;
24use rustc_span::{ErrorGuaranteed, Span, Symbol};
25use rustc_target::asm::InlineAsmRegOrRegClass;
26use tracing::instrument;
27
28use crate::middle::region;
29use crate::mir::interpret::AllocId;
30use crate::mir::{self, AssignOp, BinOp, BorrowKind, FakeReadCause, UnOp};
31use crate::thir::visit::for_each_immediate_subpat;
32use crate::ty::adjustment::PointerCoercion;
33use crate::ty::layout::IntegerExt;
34use crate::ty::{
35 self, AdtDef, CanonicalUserType, CanonicalUserTypeAnnotation, FnSig, GenericArgsRef, Ty,
36 TyCtxt, UpvarArgs,
37};
38
39pub mod visit;
40
41macro_rules! thir_with_elements {
42 (
43 $($name:ident: $id:ty => $value:ty => $format:literal,)*
44 ) => {
45 $(
46 newtype_index! {
47 #[derive(HashStable)]
48 #[debug_format = $format]
49 pub struct $id {}
50 }
51 )*
52
53 #[derive(Debug, HashStable, Clone)]
60 pub struct Thir<'tcx> {
61 pub body_type: BodyTy<'tcx>,
62 $(
63 pub $name: IndexVec<$id, $value>,
64 )*
65 }
66
67 impl<'tcx> Thir<'tcx> {
68 pub fn new(body_type: BodyTy<'tcx>) -> Thir<'tcx> {
69 Thir {
70 body_type,
71 $(
72 $name: IndexVec::new(),
73 )*
74 }
75 }
76 }
77
78 $(
79 impl<'tcx> Index<$id> for Thir<'tcx> {
80 type Output = $value;
81 fn index(&self, index: $id) -> &Self::Output {
82 &self.$name[index]
83 }
84 }
85 )*
86 }
87}
88
89impl ::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 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", "arms", "blocks", "exprs", "stmts", "params"];
let values: &[&dyn ::core::fmt::Debug] =
&[&self.body_type, &self.arms, &self.blocks, &self.exprs,
&self.stmts, &&self.params];
::core::fmt::Formatter::debug_struct_fields_finish(f, "Thir", names,
values)
}
}
const _: () =
{
impl<'tcx, '__ctx>
::rustc_data_structures::stable_hasher::HashStable<::rustc_query_system::ich::StableHashingContext<'__ctx>>
for Thir<'tcx> {
#[inline]
fn hash_stable(&self,
__hcx:
&mut ::rustc_query_system::ich::StableHashingContext<'__ctx>,
__hasher:
&mut ::rustc_data_structures::stable_hasher::StableHasher) {
match *self {
Thir {
body_type: ref __binding_0,
arms: ref __binding_1,
blocks: ref __binding_2,
exprs: ref __binding_3,
stmts: ref __binding_4,
params: ref __binding_5 } => {
{ __binding_0.hash_stable(__hcx, __hasher); }
{ __binding_1.hash_stable(__hcx, __hasher); }
{ __binding_2.hash_stable(__hcx, __hasher); }
{ __binding_3.hash_stable(__hcx, __hasher); }
{ __binding_4.hash_stable(__hcx, __hasher); }
{ __binding_5.hash_stable(__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),
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,
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! {
90 arms: ArmId => Arm<'tcx> => "a{}",
91 blocks: BlockId => Block => "b{}",
92 exprs: ExprId => Expr<'tcx> => "e{}",
93 stmts: StmtId => Stmt<'tcx> => "s{}",
94 params: ParamId => Param<'tcx> => "p{}",
95}
96
97#[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, '__ctx>
::rustc_data_structures::stable_hasher::HashStable<::rustc_query_system::ich::StableHashingContext<'__ctx>>
for BodyTy<'tcx> {
#[inline]
fn hash_stable(&self,
__hcx:
&mut ::rustc_query_system::ich::StableHashingContext<'__ctx>,
__hasher:
&mut ::rustc_data_structures::stable_hasher::StableHasher) {
::std::mem::discriminant(self).hash_stable(__hcx, __hasher);
match *self {
BodyTy::Const(ref __binding_0) => {
{ __binding_0.hash_stable(__hcx, __hasher); }
}
BodyTy::Fn(ref __binding_0) => {
{ __binding_0.hash_stable(__hcx, __hasher); }
}
BodyTy::GlobalAsm(ref __binding_0) => {
{ __binding_0.hash_stable(__hcx, __hasher); }
}
}
}
}
};HashStable, #[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)]
98pub enum BodyTy<'tcx> {
99 Const(Ty<'tcx>),
100 Fn(FnSig<'tcx>),
101 GlobalAsm(Ty<'tcx>),
102}
103
104#[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, '__ctx>
::rustc_data_structures::stable_hasher::HashStable<::rustc_query_system::ich::StableHashingContext<'__ctx>>
for Param<'tcx> {
#[inline]
fn hash_stable(&self,
__hcx:
&mut ::rustc_query_system::ich::StableHashingContext<'__ctx>,
__hasher:
&mut ::rustc_data_structures::stable_hasher::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.hash_stable(__hcx, __hasher); }
{ __binding_1.hash_stable(__hcx, __hasher); }
{ __binding_2.hash_stable(__hcx, __hasher); }
{ __binding_3.hash_stable(__hcx, __hasher); }
{ __binding_4.hash_stable(__hcx, __hasher); }
}
}
}
}
};HashStable)]
106pub struct Param<'tcx> {
107 pub pat: Option<Box<Pat<'tcx>>>,
109 pub ty: Ty<'tcx>,
111 pub ty_span: Option<Span>,
113 pub self_kind: Option<hir::ImplicitSelfKind>,
115 pub hir_id: Option<HirId>,
117}
118
119#[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<'__ctx>
::rustc_data_structures::stable_hasher::HashStable<::rustc_query_system::ich::StableHashingContext<'__ctx>>
for Block {
#[inline]
fn hash_stable(&self,
__hcx:
&mut ::rustc_query_system::ich::StableHashingContext<'__ctx>,
__hasher:
&mut ::rustc_data_structures::stable_hasher::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.hash_stable(__hcx, __hasher); }
{ __binding_1.hash_stable(__hcx, __hasher); }
{ __binding_2.hash_stable(__hcx, __hasher); }
{ __binding_3.hash_stable(__hcx, __hasher); }
{ __binding_4.hash_stable(__hcx, __hasher); }
{ __binding_5.hash_stable(__hcx, __hasher); }
}
}
}
}
};HashStable)]
120pub struct Block {
121 pub targeted_by_break: bool,
126 pub region_scope: region::Scope,
127 pub span: Span,
130 pub stmts: Box<[StmtId]>,
132 pub expr: Option<ExprId>,
134 pub safety_mode: BlockSafety,
135}
136
137type UserTy<'tcx> = Option<Box<CanonicalUserType<'tcx>>>;
138
139#[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, '__ctx>
::rustc_data_structures::stable_hasher::HashStable<::rustc_query_system::ich::StableHashingContext<'__ctx>>
for AdtExpr<'tcx> {
#[inline]
fn hash_stable(&self,
__hcx:
&mut ::rustc_query_system::ich::StableHashingContext<'__ctx>,
__hasher:
&mut ::rustc_data_structures::stable_hasher::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.hash_stable(__hcx, __hasher); }
{ __binding_1.hash_stable(__hcx, __hasher); }
{ __binding_2.hash_stable(__hcx, __hasher); }
{ __binding_3.hash_stable(__hcx, __hasher); }
{ __binding_4.hash_stable(__hcx, __hasher); }
{ __binding_5.hash_stable(__hcx, __hasher); }
}
}
}
}
};HashStable)]
140pub struct AdtExpr<'tcx> {
141 pub adt_def: AdtDef<'tcx>,
143 pub variant_index: VariantIdx,
145 pub args: GenericArgsRef<'tcx>,
146
147 pub user_ty: UserTy<'tcx>,
150
151 pub fields: Box<[FieldExpr]>,
152 pub base: AdtExprBase<'tcx>,
154}
155
156#[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, '__ctx>
::rustc_data_structures::stable_hasher::HashStable<::rustc_query_system::ich::StableHashingContext<'__ctx>>
for AdtExprBase<'tcx> {
#[inline]
fn hash_stable(&self,
__hcx:
&mut ::rustc_query_system::ich::StableHashingContext<'__ctx>,
__hasher:
&mut ::rustc_data_structures::stable_hasher::StableHasher) {
::std::mem::discriminant(self).hash_stable(__hcx, __hasher);
match *self {
AdtExprBase::None => {}
AdtExprBase::Base(ref __binding_0) => {
{ __binding_0.hash_stable(__hcx, __hasher); }
}
AdtExprBase::DefaultFields(ref __binding_0) => {
{ __binding_0.hash_stable(__hcx, __hasher); }
}
}
}
}
};HashStable)]
157pub enum AdtExprBase<'tcx> {
158 None,
160 Base(FruInfo<'tcx>),
163 DefaultFields(Box<[Ty<'tcx>]>),
167}
168
169#[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, '__ctx>
::rustc_data_structures::stable_hasher::HashStable<::rustc_query_system::ich::StableHashingContext<'__ctx>>
for ClosureExpr<'tcx> {
#[inline]
fn hash_stable(&self,
__hcx:
&mut ::rustc_query_system::ich::StableHashingContext<'__ctx>,
__hasher:
&mut ::rustc_data_structures::stable_hasher::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.hash_stable(__hcx, __hasher); }
{ __binding_1.hash_stable(__hcx, __hasher); }
{ __binding_2.hash_stable(__hcx, __hasher); }
{ __binding_3.hash_stable(__hcx, __hasher); }
{ __binding_4.hash_stable(__hcx, __hasher); }
}
}
}
}
};HashStable)]
170pub struct ClosureExpr<'tcx> {
171 pub closure_id: LocalDefId,
172 pub args: UpvarArgs<'tcx>,
173 pub upvars: Box<[ExprId]>,
174 pub movability: Option<hir::Movability>,
175 pub fake_reads: Vec<(ExprId, FakeReadCause, HirId)>,
176}
177
178#[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, '__ctx>
::rustc_data_structures::stable_hasher::HashStable<::rustc_query_system::ich::StableHashingContext<'__ctx>>
for InlineAsmExpr<'tcx> {
#[inline]
fn hash_stable(&self,
__hcx:
&mut ::rustc_query_system::ich::StableHashingContext<'__ctx>,
__hasher:
&mut ::rustc_data_structures::stable_hasher::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.hash_stable(__hcx, __hasher); }
{ __binding_1.hash_stable(__hcx, __hasher); }
{ __binding_2.hash_stable(__hcx, __hasher); }
{ __binding_3.hash_stable(__hcx, __hasher); }
{ __binding_4.hash_stable(__hcx, __hasher); }
}
}
}
}
};HashStable)]
179pub struct InlineAsmExpr<'tcx> {
180 pub asm_macro: AsmMacro,
181 pub template: &'tcx [InlineAsmTemplatePiece],
182 pub operands: Box<[InlineAsmOperand<'tcx>]>,
183 pub options: InlineAsmOptions,
184 pub line_spans: &'tcx [Span],
185}
186
187#[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<'__ctx>
::rustc_data_structures::stable_hasher::HashStable<::rustc_query_system::ich::StableHashingContext<'__ctx>>
for BlockSafety {
#[inline]
fn hash_stable(&self,
__hcx:
&mut ::rustc_query_system::ich::StableHashingContext<'__ctx>,
__hasher:
&mut ::rustc_data_structures::stable_hasher::StableHasher) {
::std::mem::discriminant(self).hash_stable(__hcx, __hasher);
match *self {
BlockSafety::Safe => {}
BlockSafety::BuiltinUnsafe => {}
BlockSafety::ExplicitUnsafe(ref __binding_0) => {
{ __binding_0.hash_stable(__hcx, __hasher); }
}
}
}
}
};HashStable)]
188pub enum BlockSafety {
189 Safe,
190 BuiltinUnsafe,
192 ExplicitUnsafe(HirId),
194}
195
196#[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, '__ctx>
::rustc_data_structures::stable_hasher::HashStable<::rustc_query_system::ich::StableHashingContext<'__ctx>>
for Stmt<'tcx> {
#[inline]
fn hash_stable(&self,
__hcx:
&mut ::rustc_query_system::ich::StableHashingContext<'__ctx>,
__hasher:
&mut ::rustc_data_structures::stable_hasher::StableHasher) {
match *self {
Stmt { kind: ref __binding_0 } => {
{ __binding_0.hash_stable(__hcx, __hasher); }
}
}
}
}
};HashStable)]
197pub struct Stmt<'tcx> {
198 pub kind: StmtKind<'tcx>,
199}
200
201#[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, '__ctx>
::rustc_data_structures::stable_hasher::HashStable<::rustc_query_system::ich::StableHashingContext<'__ctx>>
for StmtKind<'tcx> {
#[inline]
fn hash_stable(&self,
__hcx:
&mut ::rustc_query_system::ich::StableHashingContext<'__ctx>,
__hasher:
&mut ::rustc_data_structures::stable_hasher::StableHasher) {
::std::mem::discriminant(self).hash_stable(__hcx, __hasher);
match *self {
StmtKind::Expr {
scope: ref __binding_0, expr: ref __binding_1 } => {
{ __binding_0.hash_stable(__hcx, __hasher); }
{ __binding_1.hash_stable(__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.hash_stable(__hcx, __hasher); }
{ __binding_1.hash_stable(__hcx, __hasher); }
{ __binding_2.hash_stable(__hcx, __hasher); }
{ __binding_3.hash_stable(__hcx, __hasher); }
{ __binding_4.hash_stable(__hcx, __hasher); }
{ __binding_5.hash_stable(__hcx, __hasher); }
{ __binding_6.hash_stable(__hcx, __hasher); }
}
}
}
}
};HashStable)]
202pub enum StmtKind<'tcx> {
203 Expr {
205 scope: region::Scope,
207
208 expr: ExprId,
210 },
211
212 Let {
214 remainder_scope: region::Scope,
217
218 init_scope: region::Scope,
221
222 pattern: Box<Pat<'tcx>>,
226
227 initializer: Option<ExprId>,
229
230 else_block: Option<BlockId>,
232
233 hir_id: HirId,
235
236 span: Span,
238 },
239}
240
241#[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_receiver_is_total_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<'__ctx>
::rustc_data_structures::stable_hasher::HashStable<::rustc_query_system::ich::StableHashingContext<'__ctx>>
for LocalVarId {
#[inline]
fn hash_stable(&self,
__hcx:
&mut ::rustc_query_system::ich::StableHashingContext<'__ctx>,
__hasher:
&mut ::rustc_data_structures::stable_hasher::StableHasher) {
match *self {
LocalVarId(ref __binding_0) => {
{ __binding_0.hash_stable(__hcx, __hasher); }
}
}
}
}
};HashStable, 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)]
242pub struct LocalVarId(pub HirId);
243
244#[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, '__ctx>
::rustc_data_structures::stable_hasher::HashStable<::rustc_query_system::ich::StableHashingContext<'__ctx>>
for Expr<'tcx> {
#[inline]
fn hash_stable(&self,
__hcx:
&mut ::rustc_query_system::ich::StableHashingContext<'__ctx>,
__hasher:
&mut ::rustc_data_structures::stable_hasher::StableHasher) {
match *self {
Expr {
kind: ref __binding_0,
ty: ref __binding_1,
temp_scope_id: ref __binding_2,
span: ref __binding_3 } => {
{ __binding_0.hash_stable(__hcx, __hasher); }
{ __binding_1.hash_stable(__hcx, __hasher); }
{ __binding_2.hash_stable(__hcx, __hasher); }
{ __binding_3.hash_stable(__hcx, __hasher); }
}
}
}
}
};HashStable)]
246pub struct Expr<'tcx> {
247 pub kind: ExprKind<'tcx>,
249
250 pub ty: Ty<'tcx>,
252
253 pub temp_scope_id: hir::ItemLocalId,
257
258 pub span: Span,
260}
261
262#[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::Box { value: __self_0 } =>
ExprKind::Box {
value: ::core::clone::Clone::clone(__self_0),
},
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),
},
}
}
}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::Box { value: __self_0 } =>
::core::fmt::Formatter::debug_struct_field1_finish(f, "Box",
"value", &__self_0),
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),
}
}
}Debug, const _: () =
{
impl<'tcx, '__ctx>
::rustc_data_structures::stable_hasher::HashStable<::rustc_query_system::ich::StableHashingContext<'__ctx>>
for ExprKind<'tcx> {
#[inline]
fn hash_stable(&self,
__hcx:
&mut ::rustc_query_system::ich::StableHashingContext<'__ctx>,
__hasher:
&mut ::rustc_data_structures::stable_hasher::StableHasher) {
::std::mem::discriminant(self).hash_stable(__hcx, __hasher);
match *self {
ExprKind::Scope {
region_scope: ref __binding_0,
hir_id: ref __binding_1,
value: ref __binding_2 } => {
{ __binding_0.hash_stable(__hcx, __hasher); }
{ __binding_1.hash_stable(__hcx, __hasher); }
{ __binding_2.hash_stable(__hcx, __hasher); }
}
ExprKind::Box { value: ref __binding_0 } => {
{ __binding_0.hash_stable(__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.hash_stable(__hcx, __hasher); }
{ __binding_1.hash_stable(__hcx, __hasher); }
{ __binding_2.hash_stable(__hcx, __hasher); }
{ __binding_3.hash_stable(__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.hash_stable(__hcx, __hasher); }
{ __binding_1.hash_stable(__hcx, __hasher); }
{ __binding_2.hash_stable(__hcx, __hasher); }
{ __binding_3.hash_stable(__hcx, __hasher); }
{ __binding_4.hash_stable(__hcx, __hasher); }
}
ExprKind::ByUse {
expr: ref __binding_0, span: ref __binding_1 } => {
{ __binding_0.hash_stable(__hcx, __hasher); }
{ __binding_1.hash_stable(__hcx, __hasher); }
}
ExprKind::Deref { arg: ref __binding_0 } => {
{ __binding_0.hash_stable(__hcx, __hasher); }
}
ExprKind::Binary {
op: ref __binding_0,
lhs: ref __binding_1,
rhs: ref __binding_2 } => {
{ __binding_0.hash_stable(__hcx, __hasher); }
{ __binding_1.hash_stable(__hcx, __hasher); }
{ __binding_2.hash_stable(__hcx, __hasher); }
}
ExprKind::LogicalOp {
op: ref __binding_0,
lhs: ref __binding_1,
rhs: ref __binding_2 } => {
{ __binding_0.hash_stable(__hcx, __hasher); }
{ __binding_1.hash_stable(__hcx, __hasher); }
{ __binding_2.hash_stable(__hcx, __hasher); }
}
ExprKind::Unary { op: ref __binding_0, arg: ref __binding_1
} => {
{ __binding_0.hash_stable(__hcx, __hasher); }
{ __binding_1.hash_stable(__hcx, __hasher); }
}
ExprKind::Cast { source: ref __binding_0 } => {
{ __binding_0.hash_stable(__hcx, __hasher); }
}
ExprKind::Use { source: ref __binding_0 } => {
{ __binding_0.hash_stable(__hcx, __hasher); }
}
ExprKind::NeverToAny { source: ref __binding_0 } => {
{ __binding_0.hash_stable(__hcx, __hasher); }
}
ExprKind::PointerCoercion {
cast: ref __binding_0,
source: ref __binding_1,
is_from_as_cast: ref __binding_2 } => {
{ __binding_0.hash_stable(__hcx, __hasher); }
{ __binding_1.hash_stable(__hcx, __hasher); }
{ __binding_2.hash_stable(__hcx, __hasher); }
}
ExprKind::Loop { body: ref __binding_0 } => {
{ __binding_0.hash_stable(__hcx, __hasher); }
}
ExprKind::LoopMatch {
state: ref __binding_0,
region_scope: ref __binding_1,
match_data: ref __binding_2 } => {
{ __binding_0.hash_stable(__hcx, __hasher); }
{ __binding_1.hash_stable(__hcx, __hasher); }
{ __binding_2.hash_stable(__hcx, __hasher); }
}
ExprKind::Let { expr: ref __binding_0, pat: ref __binding_1
} => {
{ __binding_0.hash_stable(__hcx, __hasher); }
{ __binding_1.hash_stable(__hcx, __hasher); }
}
ExprKind::Match {
scrutinee: ref __binding_0,
arms: ref __binding_1,
match_source: ref __binding_2 } => {
{ __binding_0.hash_stable(__hcx, __hasher); }
{ __binding_1.hash_stable(__hcx, __hasher); }
{ __binding_2.hash_stable(__hcx, __hasher); }
}
ExprKind::Block { block: ref __binding_0 } => {
{ __binding_0.hash_stable(__hcx, __hasher); }
}
ExprKind::Assign {
lhs: ref __binding_0, rhs: ref __binding_1 } => {
{ __binding_0.hash_stable(__hcx, __hasher); }
{ __binding_1.hash_stable(__hcx, __hasher); }
}
ExprKind::AssignOp {
op: ref __binding_0,
lhs: ref __binding_1,
rhs: ref __binding_2 } => {
{ __binding_0.hash_stable(__hcx, __hasher); }
{ __binding_1.hash_stable(__hcx, __hasher); }
{ __binding_2.hash_stable(__hcx, __hasher); }
}
ExprKind::Field {
lhs: ref __binding_0,
variant_index: ref __binding_1,
name: ref __binding_2 } => {
{ __binding_0.hash_stable(__hcx, __hasher); }
{ __binding_1.hash_stable(__hcx, __hasher); }
{ __binding_2.hash_stable(__hcx, __hasher); }
}
ExprKind::Index {
lhs: ref __binding_0, index: ref __binding_1 } => {
{ __binding_0.hash_stable(__hcx, __hasher); }
{ __binding_1.hash_stable(__hcx, __hasher); }
}
ExprKind::VarRef { id: ref __binding_0 } => {
{ __binding_0.hash_stable(__hcx, __hasher); }
}
ExprKind::UpvarRef {
closure_def_id: ref __binding_0, var_hir_id: ref __binding_1
} => {
{ __binding_0.hash_stable(__hcx, __hasher); }
{ __binding_1.hash_stable(__hcx, __hasher); }
}
ExprKind::Borrow {
borrow_kind: ref __binding_0, arg: ref __binding_1 } => {
{ __binding_0.hash_stable(__hcx, __hasher); }
{ __binding_1.hash_stable(__hcx, __hasher); }
}
ExprKind::RawBorrow {
mutability: ref __binding_0, arg: ref __binding_1 } => {
{ __binding_0.hash_stable(__hcx, __hasher); }
{ __binding_1.hash_stable(__hcx, __hasher); }
}
ExprKind::Break {
label: ref __binding_0, value: ref __binding_1 } => {
{ __binding_0.hash_stable(__hcx, __hasher); }
{ __binding_1.hash_stable(__hcx, __hasher); }
}
ExprKind::Continue { label: ref __binding_0 } => {
{ __binding_0.hash_stable(__hcx, __hasher); }
}
ExprKind::ConstContinue {
label: ref __binding_0, value: ref __binding_1 } => {
{ __binding_0.hash_stable(__hcx, __hasher); }
{ __binding_1.hash_stable(__hcx, __hasher); }
}
ExprKind::Return { value: ref __binding_0 } => {
{ __binding_0.hash_stable(__hcx, __hasher); }
}
ExprKind::Become { value: ref __binding_0 } => {
{ __binding_0.hash_stable(__hcx, __hasher); }
}
ExprKind::ConstBlock {
did: ref __binding_0, args: ref __binding_1 } => {
{ __binding_0.hash_stable(__hcx, __hasher); }
{ __binding_1.hash_stable(__hcx, __hasher); }
}
ExprKind::Repeat {
value: ref __binding_0, count: ref __binding_1 } => {
{ __binding_0.hash_stable(__hcx, __hasher); }
{ __binding_1.hash_stable(__hcx, __hasher); }
}
ExprKind::Array { fields: ref __binding_0 } => {
{ __binding_0.hash_stable(__hcx, __hasher); }
}
ExprKind::Tuple { fields: ref __binding_0 } => {
{ __binding_0.hash_stable(__hcx, __hasher); }
}
ExprKind::Adt(ref __binding_0) => {
{ __binding_0.hash_stable(__hcx, __hasher); }
}
ExprKind::PlaceTypeAscription {
source: ref __binding_0,
user_ty: ref __binding_1,
user_ty_span: ref __binding_2 } => {
{ __binding_0.hash_stable(__hcx, __hasher); }
{ __binding_1.hash_stable(__hcx, __hasher); }
{ __binding_2.hash_stable(__hcx, __hasher); }
}
ExprKind::ValueTypeAscription {
source: ref __binding_0,
user_ty: ref __binding_1,
user_ty_span: ref __binding_2 } => {
{ __binding_0.hash_stable(__hcx, __hasher); }
{ __binding_1.hash_stable(__hcx, __hasher); }
{ __binding_2.hash_stable(__hcx, __hasher); }
}
ExprKind::PlaceUnwrapUnsafeBinder { source: ref __binding_0
} => {
{ __binding_0.hash_stable(__hcx, __hasher); }
}
ExprKind::ValueUnwrapUnsafeBinder { source: ref __binding_0
} => {
{ __binding_0.hash_stable(__hcx, __hasher); }
}
ExprKind::WrapUnsafeBinder { source: ref __binding_0 } => {
{ __binding_0.hash_stable(__hcx, __hasher); }
}
ExprKind::Closure(ref __binding_0) => {
{ __binding_0.hash_stable(__hcx, __hasher); }
}
ExprKind::Literal {
lit: ref __binding_0, neg: ref __binding_1 } => {
{ __binding_0.hash_stable(__hcx, __hasher); }
{ __binding_1.hash_stable(__hcx, __hasher); }
}
ExprKind::NonHirLiteral {
lit: ref __binding_0, user_ty: ref __binding_1 } => {
{ __binding_0.hash_stable(__hcx, __hasher); }
{ __binding_1.hash_stable(__hcx, __hasher); }
}
ExprKind::ZstLiteral { user_ty: ref __binding_0 } => {
{ __binding_0.hash_stable(__hcx, __hasher); }
}
ExprKind::NamedConst {
def_id: ref __binding_0,
args: ref __binding_1,
user_ty: ref __binding_2 } => {
{ __binding_0.hash_stable(__hcx, __hasher); }
{ __binding_1.hash_stable(__hcx, __hasher); }
{ __binding_2.hash_stable(__hcx, __hasher); }
}
ExprKind::ConstParam {
param: ref __binding_0, def_id: ref __binding_1 } => {
{ __binding_0.hash_stable(__hcx, __hasher); }
{ __binding_1.hash_stable(__hcx, __hasher); }
}
ExprKind::StaticRef {
alloc_id: ref __binding_0,
ty: ref __binding_1,
def_id: ref __binding_2 } => {
{ __binding_0.hash_stable(__hcx, __hasher); }
{ __binding_1.hash_stable(__hcx, __hasher); }
{ __binding_2.hash_stable(__hcx, __hasher); }
}
ExprKind::InlineAsm(ref __binding_0) => {
{ __binding_0.hash_stable(__hcx, __hasher); }
}
ExprKind::ThreadLocalRef(ref __binding_0) => {
{ __binding_0.hash_stable(__hcx, __hasher); }
}
ExprKind::Yield { value: ref __binding_0 } => {
{ __binding_0.hash_stable(__hcx, __hasher); }
}
}
}
}
};HashStable)]
263pub enum ExprKind<'tcx> {
264 Scope {
267 region_scope: region::Scope,
268 hir_id: HirId,
269 value: ExprId,
270 },
271 Box {
273 value: ExprId,
274 },
275 If {
277 if_then_scope: region::Scope,
278 cond: ExprId,
279 then: ExprId,
281 else_opt: Option<ExprId>,
284 },
285 Call {
287 ty: Ty<'tcx>,
292 fun: ExprId,
294 args: Box<[ExprId]>,
299 from_hir_call: bool,
302 fn_span: Span,
305 },
306 ByUse {
308 expr: ExprId,
310 span: Span,
313 },
314 Deref {
316 arg: ExprId,
317 },
318 Binary {
320 op: BinOp,
321 lhs: ExprId,
322 rhs: ExprId,
323 },
324 LogicalOp {
327 op: LogicalOp,
328 lhs: ExprId,
329 rhs: ExprId,
330 },
331 Unary {
334 op: UnOp,
335 arg: ExprId,
336 },
337 Cast {
340 source: ExprId,
341 },
342 Use {
347 source: ExprId,
348 },
349 NeverToAny {
351 source: ExprId,
352 },
353 PointerCoercion {
356 cast: PointerCoercion,
357 source: ExprId,
358 is_from_as_cast: bool,
360 },
361 Loop {
363 body: ExprId,
364 },
365 LoopMatch {
367 state: ExprId,
370 region_scope: region::Scope,
371 match_data: Box<LoopMatchMatchData>,
372 },
373 Let {
381 expr: ExprId,
382 pat: Box<Pat<'tcx>>,
383 },
384 Match {
386 scrutinee: ExprId,
387 arms: Box<[ArmId]>,
388 match_source: MatchSource,
389 },
390 Block {
392 block: BlockId,
393 },
394 Assign {
396 lhs: ExprId,
397 rhs: ExprId,
398 },
399 AssignOp {
401 op: AssignOp,
402 lhs: ExprId,
403 rhs: ExprId,
404 },
405 Field {
407 lhs: ExprId,
408 variant_index: VariantIdx,
410 name: FieldIdx,
412 },
413 Index {
415 lhs: ExprId,
416 index: ExprId,
417 },
418 VarRef {
420 id: LocalVarId,
421 },
422 UpvarRef {
424 closure_def_id: DefId,
426
427 var_hir_id: LocalVarId,
429 },
430 Borrow {
432 borrow_kind: BorrowKind,
433 arg: ExprId,
434 },
435 RawBorrow {
437 mutability: hir::Mutability,
438 arg: ExprId,
439 },
440 Break {
442 label: region::Scope,
443 value: Option<ExprId>,
444 },
445 Continue {
447 label: region::Scope,
448 },
449 ConstContinue {
451 label: region::Scope,
452 value: ExprId,
453 },
454 Return {
456 value: Option<ExprId>,
457 },
458 Become {
460 value: ExprId,
461 },
462 ConstBlock {
464 did: DefId,
465 args: GenericArgsRef<'tcx>,
466 },
467 Repeat {
469 value: ExprId,
470 count: ty::Const<'tcx>,
471 },
472 Array {
474 fields: Box<[ExprId]>,
475 },
476 Tuple {
478 fields: Box<[ExprId]>,
479 },
480 Adt(Box<AdtExpr<'tcx>>),
482 PlaceTypeAscription {
484 source: ExprId,
485 user_ty: UserTy<'tcx>,
487 user_ty_span: Span,
488 },
489 ValueTypeAscription {
491 source: ExprId,
492 user_ty: UserTy<'tcx>,
494 user_ty_span: Span,
495 },
496 PlaceUnwrapUnsafeBinder {
498 source: ExprId,
499 },
500 ValueUnwrapUnsafeBinder {
503 source: ExprId,
504 },
505 WrapUnsafeBinder {
507 source: ExprId,
508 },
509 Closure(Box<ClosureExpr<'tcx>>),
511 Literal {
513 lit: hir::Lit,
514 neg: bool,
515 },
516 NonHirLiteral {
518 lit: ty::ScalarInt,
519 user_ty: UserTy<'tcx>,
520 },
521 ZstLiteral {
523 user_ty: UserTy<'tcx>,
524 },
525 NamedConst {
527 def_id: DefId,
528 args: GenericArgsRef<'tcx>,
529 user_ty: UserTy<'tcx>,
530 },
531 ConstParam {
532 param: ty::ParamConst,
533 def_id: DefId,
534 },
535 StaticRef {
541 alloc_id: AllocId,
542 ty: Ty<'tcx>,
543 def_id: DefId,
544 },
545 InlineAsm(Box<InlineAsmExpr<'tcx>>),
547 ThreadLocalRef(DefId),
549 Yield {
551 value: ExprId,
552 },
553}
554
555#[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<'__ctx>
::rustc_data_structures::stable_hasher::HashStable<::rustc_query_system::ich::StableHashingContext<'__ctx>>
for FieldExpr {
#[inline]
fn hash_stable(&self,
__hcx:
&mut ::rustc_query_system::ich::StableHashingContext<'__ctx>,
__hasher:
&mut ::rustc_data_structures::stable_hasher::StableHasher) {
match *self {
FieldExpr { name: ref __binding_0, expr: ref __binding_1 }
=> {
{ __binding_0.hash_stable(__hcx, __hasher); }
{ __binding_1.hash_stable(__hcx, __hasher); }
}
}
}
}
};HashStable)]
559pub struct FieldExpr {
560 pub name: FieldIdx,
561 pub expr: ExprId,
562}
563
564#[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, '__ctx>
::rustc_data_structures::stable_hasher::HashStable<::rustc_query_system::ich::StableHashingContext<'__ctx>>
for FruInfo<'tcx> {
#[inline]
fn hash_stable(&self,
__hcx:
&mut ::rustc_query_system::ich::StableHashingContext<'__ctx>,
__hasher:
&mut ::rustc_data_structures::stable_hasher::StableHasher) {
match *self {
FruInfo {
base: ref __binding_0, field_types: ref __binding_1 } => {
{ __binding_0.hash_stable(__hcx, __hasher); }
{ __binding_1.hash_stable(__hcx, __hasher); }
}
}
}
}
};HashStable)]
565pub struct FruInfo<'tcx> {
566 pub base: ExprId,
567 pub field_types: Box<[Ty<'tcx>]>,
568}
569
570#[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, '__ctx>
::rustc_data_structures::stable_hasher::HashStable<::rustc_query_system::ich::StableHashingContext<'__ctx>>
for Arm<'tcx> {
#[inline]
fn hash_stable(&self,
__hcx:
&mut ::rustc_query_system::ich::StableHashingContext<'__ctx>,
__hasher:
&mut ::rustc_data_structures::stable_hasher::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.hash_stable(__hcx, __hasher); }
{ __binding_1.hash_stable(__hcx, __hasher); }
{ __binding_2.hash_stable(__hcx, __hasher); }
{ __binding_3.hash_stable(__hcx, __hasher); }
{ __binding_4.hash_stable(__hcx, __hasher); }
{ __binding_5.hash_stable(__hcx, __hasher); }
}
}
}
}
};HashStable)]
572pub struct Arm<'tcx> {
573 pub pattern: Box<Pat<'tcx>>,
574 pub guard: Option<ExprId>,
575 pub body: ExprId,
576 pub hir_id: HirId,
577 pub scope: region::Scope,
578 pub span: Span,
579}
580
581#[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<'__ctx>
::rustc_data_structures::stable_hasher::HashStable<::rustc_query_system::ich::StableHashingContext<'__ctx>>
for LoopMatchMatchData {
#[inline]
fn hash_stable(&self,
__hcx:
&mut ::rustc_query_system::ich::StableHashingContext<'__ctx>,
__hasher:
&mut ::rustc_data_structures::stable_hasher::StableHasher) {
match *self {
LoopMatchMatchData {
scrutinee: ref __binding_0,
arms: ref __binding_1,
span: ref __binding_2 } => {
{ __binding_0.hash_stable(__hcx, __hasher); }
{ __binding_1.hash_stable(__hcx, __hasher); }
{ __binding_2.hash_stable(__hcx, __hasher); }
}
}
}
}
};HashStable)]
583pub struct LoopMatchMatchData {
584 pub scrutinee: ExprId,
585 pub arms: Box<[ArmId]>,
586 pub span: Span,
587}
588
589#[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<'__ctx>
::rustc_data_structures::stable_hasher::HashStable<::rustc_query_system::ich::StableHashingContext<'__ctx>>
for LogicalOp {
#[inline]
fn hash_stable(&self,
__hcx:
&mut ::rustc_query_system::ich::StableHashingContext<'__ctx>,
__hasher:
&mut ::rustc_data_structures::stable_hasher::StableHasher) {
::std::mem::discriminant(self).hash_stable(__hcx, __hasher);
match *self { LogicalOp::And => {} LogicalOp::Or => {} }
}
}
};HashStable)]
590pub enum LogicalOp {
591 And,
593 Or,
595}
596
597#[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, '__ctx>
::rustc_data_structures::stable_hasher::HashStable<::rustc_query_system::ich::StableHashingContext<'__ctx>>
for InlineAsmOperand<'tcx> {
#[inline]
fn hash_stable(&self,
__hcx:
&mut ::rustc_query_system::ich::StableHashingContext<'__ctx>,
__hasher:
&mut ::rustc_data_structures::stable_hasher::StableHasher) {
::std::mem::discriminant(self).hash_stable(__hcx, __hasher);
match *self {
InlineAsmOperand::In {
reg: ref __binding_0, expr: ref __binding_1 } => {
{ __binding_0.hash_stable(__hcx, __hasher); }
{ __binding_1.hash_stable(__hcx, __hasher); }
}
InlineAsmOperand::Out {
reg: ref __binding_0,
late: ref __binding_1,
expr: ref __binding_2 } => {
{ __binding_0.hash_stable(__hcx, __hasher); }
{ __binding_1.hash_stable(__hcx, __hasher); }
{ __binding_2.hash_stable(__hcx, __hasher); }
}
InlineAsmOperand::InOut {
reg: ref __binding_0,
late: ref __binding_1,
expr: ref __binding_2 } => {
{ __binding_0.hash_stable(__hcx, __hasher); }
{ __binding_1.hash_stable(__hcx, __hasher); }
{ __binding_2.hash_stable(__hcx, __hasher); }
}
InlineAsmOperand::SplitInOut {
reg: ref __binding_0,
late: ref __binding_1,
in_expr: ref __binding_2,
out_expr: ref __binding_3 } => {
{ __binding_0.hash_stable(__hcx, __hasher); }
{ __binding_1.hash_stable(__hcx, __hasher); }
{ __binding_2.hash_stable(__hcx, __hasher); }
{ __binding_3.hash_stable(__hcx, __hasher); }
}
InlineAsmOperand::Const {
value: ref __binding_0, span: ref __binding_1 } => {
{ __binding_0.hash_stable(__hcx, __hasher); }
{ __binding_1.hash_stable(__hcx, __hasher); }
}
InlineAsmOperand::SymFn { value: ref __binding_0 } => {
{ __binding_0.hash_stable(__hcx, __hasher); }
}
InlineAsmOperand::SymStatic { def_id: ref __binding_0 } => {
{ __binding_0.hash_stable(__hcx, __hasher); }
}
InlineAsmOperand::Label { block: ref __binding_0 } => {
{ __binding_0.hash_stable(__hcx, __hasher); }
}
}
}
}
};HashStable)]
598pub enum InlineAsmOperand<'tcx> {
599 In {
600 reg: InlineAsmRegOrRegClass,
601 expr: ExprId,
602 },
603 Out {
604 reg: InlineAsmRegOrRegClass,
605 late: bool,
606 expr: Option<ExprId>,
607 },
608 InOut {
609 reg: InlineAsmRegOrRegClass,
610 late: bool,
611 expr: ExprId,
612 },
613 SplitInOut {
614 reg: InlineAsmRegOrRegClass,
615 late: bool,
616 in_expr: ExprId,
617 out_expr: Option<ExprId>,
618 },
619 Const {
620 value: mir::Const<'tcx>,
621 span: Span,
622 },
623 SymFn {
624 value: ExprId,
625 },
626 SymStatic {
627 def_id: DefId,
628 },
629 Label {
630 block: BlockId,
631 },
632}
633
634#[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, '__ctx>
::rustc_data_structures::stable_hasher::HashStable<::rustc_query_system::ich::StableHashingContext<'__ctx>>
for FieldPat<'tcx> {
#[inline]
fn hash_stable(&self,
__hcx:
&mut ::rustc_query_system::ich::StableHashingContext<'__ctx>,
__hasher:
&mut ::rustc_data_structures::stable_hasher::StableHasher) {
match *self {
FieldPat { field: ref __binding_0, pattern: ref __binding_1
} => {
{ __binding_0.hash_stable(__hcx, __hasher); }
{ __binding_1.hash_stable(__hcx, __hasher); }
}
}
}
}
};HashStable, 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)]
635pub struct FieldPat<'tcx> {
636 pub field: FieldIdx,
637 pub pattern: Pat<'tcx>,
638}
639
640#[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, '__ctx>
::rustc_data_structures::stable_hasher::HashStable<::rustc_query_system::ich::StableHashingContext<'__ctx>>
for PatExtra<'tcx> {
#[inline]
fn hash_stable(&self,
__hcx:
&mut ::rustc_query_system::ich::StableHashingContext<'__ctx>,
__hasher:
&mut ::rustc_data_structures::stable_hasher::StableHasher) {
match *self {
PatExtra {
expanded_const: ref __binding_0,
ascriptions: ref __binding_1 } => {
{ __binding_0.hash_stable(__hcx, __hasher); }
{ __binding_1.hash_stable(__hcx, __hasher); }
}
}
}
}
};HashStable, 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)]
642pub struct PatExtra<'tcx> {
643 pub expanded_const: Option<DefId>,
649
650 pub ascriptions: Vec<Ascription<'tcx>>,
653}
654
655#[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, '__ctx>
::rustc_data_structures::stable_hasher::HashStable<::rustc_query_system::ich::StableHashingContext<'__ctx>>
for Pat<'tcx> {
#[inline]
fn hash_stable(&self,
__hcx:
&mut ::rustc_query_system::ich::StableHashingContext<'__ctx>,
__hasher:
&mut ::rustc_data_structures::stable_hasher::StableHasher) {
match *self {
Pat {
ty: ref __binding_0,
span: ref __binding_1,
extra: ref __binding_2,
kind: ref __binding_3 } => {
{ __binding_0.hash_stable(__hcx, __hasher); }
{ __binding_1.hash_stable(__hcx, __hasher); }
{ __binding_2.hash_stable(__hcx, __hasher); }
{ __binding_3.hash_stable(__hcx, __hasher); }
}
}
}
}
};HashStable, 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)]
656pub struct Pat<'tcx> {
657 pub ty: Ty<'tcx>,
658 pub span: Span,
659 pub extra: Option<Box<PatExtra<'tcx>>>,
660 pub kind: PatKind<'tcx>,
661}
662
663impl<'tcx> Pat<'tcx> {
664 pub fn simple_ident(&self) -> Option<Symbol> {
665 match self.kind {
666 PatKind::Binding {
667 name, mode: BindingMode(ByRef::No, _), subpattern: None, ..
668 } => Some(name),
669 _ => None,
670 }
671 }
672
673 pub fn each_binding(&self, mut f: impl FnMut(Symbol, ByRef, Ty<'tcx>, Span)) {
676 self.walk_always(|p| {
677 if let PatKind::Binding { name, mode, ty, .. } = p.kind {
678 f(name, mode.0, ty, p.span);
679 }
680 });
681 }
682
683 pub fn walk(&self, mut it: impl FnMut(&Pat<'tcx>) -> bool) {
687 self.walk_(&mut it)
688 }
689
690 fn walk_(&self, it: &mut impl FnMut(&Pat<'tcx>) -> bool) {
691 if !it(self) {
692 return;
693 }
694
695 for_each_immediate_subpat(self, |p| p.walk_(it));
696 }
697
698 pub fn pat_error_reported(&self) -> Result<(), ErrorGuaranteed> {
700 let mut error = None;
701 self.walk(|pat| {
702 if let PatKind::Error(e) = pat.kind
703 && error.is_none()
704 {
705 error = Some(e);
706 }
707 error.is_none()
708 });
709 match error {
710 None => Ok(()),
711 Some(e) => Err(e),
712 }
713 }
714
715 pub fn walk_always(&self, mut it: impl FnMut(&Pat<'tcx>)) {
719 self.walk(|p| {
720 it(p);
721 true
722 })
723 }
724
725 pub fn is_never_pattern(&self) -> bool {
727 let mut is_never_pattern = false;
728 self.walk(|pat| match &pat.kind {
729 PatKind::Never => {
730 is_never_pattern = true;
731 false
732 }
733 PatKind::Or { pats } => {
734 is_never_pattern = pats.iter().all(|p| p.is_never_pattern());
735 false
736 }
737 _ => true,
738 });
739 is_never_pattern
740 }
741}
742
743#[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, '__ctx>
::rustc_data_structures::stable_hasher::HashStable<::rustc_query_system::ich::StableHashingContext<'__ctx>>
for Ascription<'tcx> {
#[inline]
fn hash_stable(&self,
__hcx:
&mut ::rustc_query_system::ich::StableHashingContext<'__ctx>,
__hasher:
&mut ::rustc_data_structures::stable_hasher::StableHasher) {
match *self {
Ascription {
annotation: ref __binding_0, variance: ref __binding_1 } =>
{
{ __binding_0.hash_stable(__hcx, __hasher); }
{ __binding_1.hash_stable(__hcx, __hasher); }
}
}
}
}
};HashStable, 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)]
744pub struct Ascription<'tcx> {
745 pub annotation: CanonicalUserTypeAnnotation<'tcx>,
746 pub variance: ty::Variance,
765}
766
767#[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 { subpattern: __self_0 } =>
PatKind::Deref {
subpattern: ::core::clone::Clone::clone(__self_0),
},
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::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 { subpattern: __self_0 } =>
::core::fmt::Formatter::debug_struct_field1_finish(f, "Deref",
"subpattern", &__self_0),
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::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, '__ctx>
::rustc_data_structures::stable_hasher::HashStable<::rustc_query_system::ich::StableHashingContext<'__ctx>>
for PatKind<'tcx> {
#[inline]
fn hash_stable(&self,
__hcx:
&mut ::rustc_query_system::ich::StableHashingContext<'__ctx>,
__hasher:
&mut ::rustc_data_structures::stable_hasher::StableHasher) {
::std::mem::discriminant(self).hash_stable(__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.hash_stable(__hcx, __hasher); }
{ __binding_1.hash_stable(__hcx, __hasher); }
{ __binding_2.hash_stable(__hcx, __hasher); }
{ __binding_3.hash_stable(__hcx, __hasher); }
{ __binding_4.hash_stable(__hcx, __hasher); }
{ __binding_5.hash_stable(__hcx, __hasher); }
{ __binding_6.hash_stable(__hcx, __hasher); }
}
PatKind::Variant {
adt_def: ref __binding_0,
args: ref __binding_1,
variant_index: ref __binding_2,
subpatterns: ref __binding_3 } => {
{ __binding_0.hash_stable(__hcx, __hasher); }
{ __binding_1.hash_stable(__hcx, __hasher); }
{ __binding_2.hash_stable(__hcx, __hasher); }
{ __binding_3.hash_stable(__hcx, __hasher); }
}
PatKind::Leaf { subpatterns: ref __binding_0 } => {
{ __binding_0.hash_stable(__hcx, __hasher); }
}
PatKind::Deref { subpattern: ref __binding_0 } => {
{ __binding_0.hash_stable(__hcx, __hasher); }
}
PatKind::DerefPattern {
subpattern: ref __binding_0, borrow: ref __binding_1 } => {
{ __binding_0.hash_stable(__hcx, __hasher); }
{ __binding_1.hash_stable(__hcx, __hasher); }
}
PatKind::Constant { value: ref __binding_0 } => {
{ __binding_0.hash_stable(__hcx, __hasher); }
}
PatKind::Range(ref __binding_0) => {
{ __binding_0.hash_stable(__hcx, __hasher); }
}
PatKind::Slice {
prefix: ref __binding_0,
slice: ref __binding_1,
suffix: ref __binding_2 } => {
{ __binding_0.hash_stable(__hcx, __hasher); }
{ __binding_1.hash_stable(__hcx, __hasher); }
{ __binding_2.hash_stable(__hcx, __hasher); }
}
PatKind::Array {
prefix: ref __binding_0,
slice: ref __binding_1,
suffix: ref __binding_2 } => {
{ __binding_0.hash_stable(__hcx, __hasher); }
{ __binding_1.hash_stable(__hcx, __hasher); }
{ __binding_2.hash_stable(__hcx, __hasher); }
}
PatKind::Or { pats: ref __binding_0 } => {
{ __binding_0.hash_stable(__hcx, __hasher); }
}
PatKind::Never => {}
PatKind::Error(ref __binding_0) => {
{ __binding_0.hash_stable(__hcx, __hasher); }
}
}
}
}
};HashStable, 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_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::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::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)]
768pub enum PatKind<'tcx> {
769 Missing,
771
772 Wild,
774
775 Binding {
777 name: Symbol,
778 #[type_visitable(ignore)]
779 mode: BindingMode,
780 #[type_visitable(ignore)]
781 var: LocalVarId,
782 ty: Ty<'tcx>,
783 subpattern: Option<Box<Pat<'tcx>>>,
784
785 is_primary: bool,
791 is_shorthand: bool,
793 },
794
795 Variant {
798 adt_def: AdtDef<'tcx>,
799 args: GenericArgsRef<'tcx>,
800 variant_index: VariantIdx,
801 subpatterns: Vec<FieldPat<'tcx>>,
802 },
803
804 Leaf {
807 subpatterns: Vec<FieldPat<'tcx>>,
808 },
809
810 Deref {
812 subpattern: Box<Pat<'tcx>>,
813 },
814
815 DerefPattern {
817 subpattern: Box<Pat<'tcx>>,
818 #[type_visitable(ignore)]
823 borrow: DerefPatBorrowMode,
824 },
825
826 Constant {
836 value: ty::Value<'tcx>,
837 },
838
839 Range(Arc<PatRange<'tcx>>),
840
841 Slice {
845 prefix: Box<[Pat<'tcx>]>,
846 slice: Option<Box<Pat<'tcx>>>,
847 suffix: Box<[Pat<'tcx>]>,
848 },
849
850 Array {
852 prefix: Box<[Pat<'tcx>]>,
853 slice: Option<Box<Pat<'tcx>>>,
854 suffix: Box<[Pat<'tcx>]>,
855 },
856
857 Or {
860 pats: Box<[Pat<'tcx>]>,
861 },
862
863 Never,
865
866 Error(ErrorGuaranteed),
869}
870
871#[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<'__ctx>
::rustc_data_structures::stable_hasher::HashStable<::rustc_query_system::ich::StableHashingContext<'__ctx>>
for DerefPatBorrowMode {
#[inline]
fn hash_stable(&self,
__hcx:
&mut ::rustc_query_system::ich::StableHashingContext<'__ctx>,
__hasher:
&mut ::rustc_data_structures::stable_hasher::StableHasher) {
::std::mem::discriminant(self).hash_stable(__hcx, __hasher);
match *self {
DerefPatBorrowMode::Borrow(ref __binding_0) => {
{ __binding_0.hash_stable(__hcx, __hasher); }
}
DerefPatBorrowMode::Box => {}
}
}
}
};HashStable)]
872pub enum DerefPatBorrowMode {
873 Borrow(Mutability),
874 Box,
875}
876
877#[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, '__ctx>
::rustc_data_structures::stable_hasher::HashStable<::rustc_query_system::ich::StableHashingContext<'__ctx>>
for PatRange<'tcx> {
#[inline]
fn hash_stable(&self,
__hcx:
&mut ::rustc_query_system::ich::StableHashingContext<'__ctx>,
__hasher:
&mut ::rustc_data_structures::stable_hasher::StableHasher) {
match *self {
PatRange {
lo: ref __binding_0,
hi: ref __binding_1,
end: ref __binding_2,
ty: ref __binding_3 } => {
{ __binding_0.hash_stable(__hcx, __hasher); }
{ __binding_1.hash_stable(__hcx, __hasher); }
{ __binding_2.hash_stable(__hcx, __hasher); }
{ __binding_3.hash_stable(__hcx, __hasher); }
}
}
}
}
};HashStable, 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)]
880pub struct PatRange<'tcx> {
881 pub lo: PatRangeBoundary<'tcx>,
883 pub hi: PatRangeBoundary<'tcx>,
885 #[type_visitable(ignore)]
886 pub end: RangeEnd,
887 pub ty: Ty<'tcx>,
888}
889
890impl<'tcx> PatRange<'tcx> {
891 #[inline]
893 pub fn is_full_range(&self, tcx: TyCtxt<'tcx>) -> Option<bool> {
894 let (min, max, size, bias) = match *self.ty.kind() {
895 ty::Char => (0, std::char::MAX as u128, Size::from_bits(32), 0),
896 ty::Int(ity) => {
897 let size = Integer::from_int_ty(&tcx, ity).size();
898 let max = size.truncate(u128::MAX);
899 let bias = 1u128 << (size.bits() - 1);
900 (0, max, size, bias)
901 }
902 ty::Uint(uty) => {
903 let size = Integer::from_uint_ty(&tcx, uty).size();
904 let max = size.unsigned_int_max();
905 (0, max, size, 0)
906 }
907 _ => return None,
908 };
909
910 let lo_is_min = match self.lo {
918 PatRangeBoundary::NegInfinity => true,
919 PatRangeBoundary::Finite(value) => {
920 let lo = value.to_leaf().to_bits(size) ^ bias;
921 lo <= min
922 }
923 PatRangeBoundary::PosInfinity => false,
924 };
925 if lo_is_min {
926 let hi_is_max = match self.hi {
927 PatRangeBoundary::NegInfinity => false,
928 PatRangeBoundary::Finite(value) => {
929 let hi = value.to_leaf().to_bits(size) ^ bias;
930 hi > max || hi == max && self.end == RangeEnd::Included
931 }
932 PatRangeBoundary::PosInfinity => true,
933 };
934 if hi_is_max {
935 return Some(true);
936 }
937 }
938 Some(false)
939 }
940
941 #[inline]
942 pub fn contains(&self, value: ty::Value<'tcx>, tcx: TyCtxt<'tcx>) -> Option<bool> {
943 use Ordering::*;
944 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);
945 let ty = self.ty;
946 let value = PatRangeBoundary::Finite(value.valtree);
947 Some(
949 match self.lo.compare_with(value, ty, tcx)? {
950 Less | Equal => true,
951 Greater => false,
952 } && match value.compare_with(self.hi, ty, tcx)? {
953 Less => true,
954 Equal => self.end == RangeEnd::Included,
955 Greater => false,
956 },
957 )
958 }
959
960 #[inline]
961 pub fn overlaps(&self, other: &Self, tcx: TyCtxt<'tcx>) -> Option<bool> {
962 use Ordering::*;
963 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);
964 Some(
966 match other.lo.compare_with(self.hi, self.ty, tcx)? {
967 Less => true,
968 Equal => self.end == RangeEnd::Included,
969 Greater => false,
970 } && match self.lo.compare_with(other.hi, self.ty, tcx)? {
971 Less => true,
972 Equal => other.end == RangeEnd::Included,
973 Greater => false,
974 },
975 )
976 }
977}
978
979impl<'tcx> fmt::Display for PatRange<'tcx> {
980 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
981 if let &PatRangeBoundary::Finite(valtree) = &self.lo {
982 let value = ty::Value { ty: self.ty, valtree };
983 f.write_fmt(format_args!("{0}", value))write!(f, "{value}")?;
984 }
985 if let &PatRangeBoundary::Finite(valtree) = &self.hi {
986 f.write_fmt(format_args!("{0}", self.end))write!(f, "{}", self.end)?;
987 let value = ty::Value { ty: self.ty, valtree };
988 f.write_fmt(format_args!("{0}", value))write!(f, "{value}")?;
989 } else {
990 f.write_fmt(format_args!(".."))write!(f, "..")?;
992 }
993 Ok(())
994 }
995}
996
997#[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, '__ctx>
::rustc_data_structures::stable_hasher::HashStable<::rustc_query_system::ich::StableHashingContext<'__ctx>>
for PatRangeBoundary<'tcx> {
#[inline]
fn hash_stable(&self,
__hcx:
&mut ::rustc_query_system::ich::StableHashingContext<'__ctx>,
__hasher:
&mut ::rustc_data_structures::stable_hasher::StableHasher) {
::std::mem::discriminant(self).hash_stable(__hcx, __hasher);
match *self {
PatRangeBoundary::Finite(ref __binding_0) => {
{ __binding_0.hash_stable(__hcx, __hasher); }
}
PatRangeBoundary::NegInfinity => {}
PatRangeBoundary::PosInfinity => {}
}
}
}
};HashStable, 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)]
1000pub enum PatRangeBoundary<'tcx> {
1001 Finite(ty::ValTree<'tcx>),
1003 NegInfinity,
1004 PosInfinity,
1005}
1006
1007impl<'tcx> PatRangeBoundary<'tcx> {
1008 #[inline]
1009 pub fn is_finite(self) -> bool {
1010 #[allow(non_exhaustive_omitted_patterns)] match self {
Self::Finite(..) => true,
_ => false,
}matches!(self, Self::Finite(..))
1011 }
1012 #[inline]
1013 pub fn as_finite(self) -> Option<ty::ValTree<'tcx>> {
1014 match self {
1015 Self::Finite(value) => Some(value),
1016 Self::NegInfinity | Self::PosInfinity => None,
1017 }
1018 }
1019 pub fn to_bits(self, ty: Ty<'tcx>, tcx: TyCtxt<'tcx>) -> u128 {
1020 match self {
1021 Self::Finite(value) => value.to_leaf().to_bits_unchecked(),
1022 Self::NegInfinity => {
1023 ty.numeric_min_and_max_as_bits(tcx).unwrap().0
1025 }
1026 Self::PosInfinity => {
1027 ty.numeric_min_and_max_as_bits(tcx).unwrap().1
1029 }
1030 }
1031 }
1032
1033 x;#[instrument(skip(tcx), level = "debug", ret)]
1034 pub fn compare_with(self, other: Self, ty: Ty<'tcx>, tcx: TyCtxt<'tcx>) -> Option<Ordering> {
1035 use PatRangeBoundary::*;
1036 match (self, other) {
1037 (PosInfinity, PosInfinity) => return Some(Ordering::Equal),
1041 (NegInfinity, NegInfinity) => return Some(Ordering::Equal),
1042
1043 (Finite(a), Finite(b)) if matches!(ty.kind(), ty::Int(_) | ty::Uint(_) | ty::Char) => {
1049 if let (Some(a), Some(b)) = (a.try_to_leaf(), b.try_to_leaf()) {
1050 let sz = ty.primitive_size(tcx);
1051 let cmp = match ty.kind() {
1052 ty::Uint(_) | ty::Char => a.to_uint(sz).cmp(&b.to_uint(sz)),
1053 ty::Int(_) => a.to_int(sz).cmp(&b.to_int(sz)),
1054 _ => unreachable!(),
1055 };
1056 return Some(cmp);
1057 }
1058 }
1059 _ => {}
1060 }
1061
1062 let a = self.to_bits(ty, tcx);
1063 let b = other.to_bits(ty, tcx);
1064
1065 match ty.kind() {
1066 ty::Float(ty::FloatTy::F16) => {
1067 use rustc_apfloat::Float;
1068 let a = rustc_apfloat::ieee::Half::from_bits(a);
1069 let b = rustc_apfloat::ieee::Half::from_bits(b);
1070 a.partial_cmp(&b)
1071 }
1072 ty::Float(ty::FloatTy::F32) => {
1073 use rustc_apfloat::Float;
1074 let a = rustc_apfloat::ieee::Single::from_bits(a);
1075 let b = rustc_apfloat::ieee::Single::from_bits(b);
1076 a.partial_cmp(&b)
1077 }
1078 ty::Float(ty::FloatTy::F64) => {
1079 use rustc_apfloat::Float;
1080 let a = rustc_apfloat::ieee::Double::from_bits(a);
1081 let b = rustc_apfloat::ieee::Double::from_bits(b);
1082 a.partial_cmp(&b)
1083 }
1084 ty::Float(ty::FloatTy::F128) => {
1085 use rustc_apfloat::Float;
1086 let a = rustc_apfloat::ieee::Quad::from_bits(a);
1087 let b = rustc_apfloat::ieee::Quad::from_bits(b);
1088 a.partial_cmp(&b)
1089 }
1090 ty::Int(ity) => {
1091 let size = rustc_abi::Integer::from_int_ty(&tcx, *ity).size();
1092 let a = size.sign_extend(a) as i128;
1093 let b = size.sign_extend(b) as i128;
1094 Some(a.cmp(&b))
1095 }
1096 ty::Uint(_) | ty::Char => Some(a.cmp(&b)),
1097 _ => bug!(),
1098 }
1099 }
1100}
1101
1102#[cfg(target_pointer_width = "64")]
1104mod size_asserts {
1105 use rustc_data_structures::static_assert_size;
1106
1107 use super::*;
1108 const _: [(); 48] = [(); ::std::mem::size_of::<Block>()];static_assert_size!(Block, 48);
1110 const _: [(); 64] = [(); ::std::mem::size_of::<Expr<'_>>()];static_assert_size!(Expr<'_>, 64);
1111 const _: [(); 40] = [(); ::std::mem::size_of::<ExprKind<'_>>()];static_assert_size!(ExprKind<'_>, 40);
1112 const _: [(); 72] = [(); ::std::mem::size_of::<Pat<'_>>()];static_assert_size!(Pat<'_>, 72);
1113 const _: [(); 48] = [(); ::std::mem::size_of::<PatKind<'_>>()];static_assert_size!(PatKind<'_>, 48);
1114 const _: [(); 48] = [(); ::std::mem::size_of::<Stmt<'_>>()];static_assert_size!(Stmt<'_>, 48);
1115 const _: [(); 48] = [(); ::std::mem::size_of::<StmtKind<'_>>()];static_assert_size!(StmtKind<'_>, 48);
1116 }