1use rustc_abi::{FieldIdx, VariantIdx};
2use rustc_hir::Safety;
3use rustc_middle::mir::interpret::Scalar;
4use rustc_middle::mir::*;
5use rustc_middle::thir::*;
6use rustc_middle::ty;
7use rustc_middle::ty::adjustment::PointerCoercion;
8use rustc_middle::ty::cast::mir_cast_kind;
9use rustc_span::{Span, Spanned};
10
11use super::{PResult, ParseCtxt, parse_by_kind};
12use crate::builder::custom::ParseError;
13use crate::builder::expr::as_constant::as_constant_inner;
14
15impl<'a, 'tcx> ParseCtxt<'a, 'tcx> {
16 pub(crate) fn parse_statement(&self, expr_id: ExprId) -> PResult<StatementKind<'tcx>> {
17 {
let expr_id = self.preparse(expr_id);
let expr = &self.thir[expr_id];
{
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event /rustc-dev/923c95cdf5ba65cea505aa2ea829f578e1506ed8/compiler/rustc_mir_build/src/builder/custom/parse/instruction.rs:17",
"rustc_mir_build::builder::custom::parse::instruction",
::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("/rustc-dev/923c95cdf5ba65cea505aa2ea829f578e1506ed8/compiler/rustc_mir_build/src/builder/custom/parse/instruction.rs"),
::tracing_core::__macro_support::Option::Some(17u32),
::tracing_core::__macro_support::Option::Some("rustc_mir_build::builder::custom::parse::instruction"),
::tracing_core::field::FieldSet::new(&["message"],
::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::EVENT)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let enabled =
::tracing::Level::DEBUG <=
::tracing::level_filters::STATIC_MAX_LEVEL &&
::tracing::Level::DEBUG <=
::tracing::level_filters::LevelFilter::current() &&
{
let interest = __CALLSITE.interest();
!interest.is_never() &&
::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
interest)
};
if enabled {
(|value_set: ::tracing::field::ValueSet|
{
let meta = __CALLSITE.metadata();
::tracing::Event::dispatch(meta, &value_set);
;
})({
#[allow(unused_imports)]
use ::tracing::field::{debug, display, Value};
__CALLSITE.metadata().fields().value_set_all(&[(::tracing::__macro_support::Option::Some(&format_args!("Trying to parse {0:?} as {1}",
expr.kind, "statement") as &dyn ::tracing::field::Value))])
});
} else { ; }
};
let _ = expr;
match &expr.kind {
ExprKind::Call { ty, fun: _, args: args, .. } if
{
match ty.kind() {
ty::FnDef(did, _) => {
self.tcx.is_diagnostic_item(rustc_span::sym::mir_storage_live,
*did)
}
_ => false,
}
} => {
Ok(StatementKind::StorageLive(self.parse_local(args[0])?))
}
ExprKind::Call { ty, fun: _, args: args, .. } if
{
match ty.kind() {
ty::FnDef(did, _) => {
self.tcx.is_diagnostic_item(rustc_span::sym::mir_storage_dead,
*did)
}
_ => false,
}
} => {
Ok(StatementKind::StorageDead(self.parse_local(args[0])?))
}
ExprKind::Call { ty, fun: _, args: args, .. } if
{
match ty.kind() {
ty::FnDef(did, _) => {
self.tcx.is_diagnostic_item(rustc_span::sym::mir_assume,
*did)
}
_ => false,
}
} => {
let op = self.parse_operand(args[0])?;
Ok(StatementKind::Intrinsic(Box::new(NonDivergingIntrinsic::Assume(op))))
}
ExprKind::Call { ty, fun: _, args: args, .. } if
{
match ty.kind() {
ty::FnDef(did, _) => {
self.tcx.is_diagnostic_item(rustc_span::sym::mir_set_discriminant,
*did)
}
_ => false,
}
} => {
let place = self.parse_place(args[0])?;
let var = self.parse_integer_literal(args[1])? as u32;
Ok(StatementKind::SetDiscriminant {
place: Box::new(place),
variant_index: VariantIdx::from_u32(var),
})
}
ExprKind::Assign { lhs, rhs } => {
let lhs = self.parse_place(*lhs)?;
let rhs = self.parse_rvalue(*rhs)?;
Ok(StatementKind::Assign(Box::new((lhs, rhs))))
}
#[allow(unreachable_patterns)]
_ => return Err(self.expr_error(expr_id, "statement")),
}
}parse_by_kind!(self, expr_id, _, "statement",
18 @call(mir_storage_live, args) => {
19 Ok(StatementKind::StorageLive(self.parse_local(args[0])?))
20 },
21 @call(mir_storage_dead, args) => {
22 Ok(StatementKind::StorageDead(self.parse_local(args[0])?))
23 },
24 @call(mir_assume, args) => {
25 let op = self.parse_operand(args[0])?;
26 Ok(StatementKind::Intrinsic(Box::new(NonDivergingIntrinsic::Assume(op))))
27 },
28 @call(mir_set_discriminant, args) => {
29 let place = self.parse_place(args[0])?;
30 let var = self.parse_integer_literal(args[1])? as u32;
31 Ok(StatementKind::SetDiscriminant {
32 place: Box::new(place),
33 variant_index: VariantIdx::from_u32(var),
34 })
35 },
36 ExprKind::Assign { lhs, rhs } => {
37 let lhs = self.parse_place(*lhs)?;
38 let rhs = self.parse_rvalue(*rhs)?;
39 Ok(StatementKind::Assign(Box::new((lhs, rhs))))
40 },
41 )
42 }
43
44 pub(crate) fn parse_terminator(&self, expr_id: ExprId) -> PResult<TerminatorKind<'tcx>> {
45 {
let expr_id = self.preparse(expr_id);
let expr = &self.thir[expr_id];
{
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event /rustc-dev/923c95cdf5ba65cea505aa2ea829f578e1506ed8/compiler/rustc_mir_build/src/builder/custom/parse/instruction.rs:45",
"rustc_mir_build::builder::custom::parse::instruction",
::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("/rustc-dev/923c95cdf5ba65cea505aa2ea829f578e1506ed8/compiler/rustc_mir_build/src/builder/custom/parse/instruction.rs"),
::tracing_core::__macro_support::Option::Some(45u32),
::tracing_core::__macro_support::Option::Some("rustc_mir_build::builder::custom::parse::instruction"),
::tracing_core::field::FieldSet::new(&["message"],
::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::EVENT)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let enabled =
::tracing::Level::DEBUG <=
::tracing::level_filters::STATIC_MAX_LEVEL &&
::tracing::Level::DEBUG <=
::tracing::level_filters::LevelFilter::current() &&
{
let interest = __CALLSITE.interest();
!interest.is_never() &&
::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
interest)
};
if enabled {
(|value_set: ::tracing::field::ValueSet|
{
let meta = __CALLSITE.metadata();
::tracing::Event::dispatch(meta, &value_set);
;
})({
#[allow(unused_imports)]
use ::tracing::field::{debug, display, Value};
__CALLSITE.metadata().fields().value_set_all(&[(::tracing::__macro_support::Option::Some(&format_args!("Trying to parse {0:?} as {1}",
expr.kind, "terminator") as &dyn ::tracing::field::Value))])
});
} else { ; }
};
let expr = expr;
match &expr.kind {
ExprKind::Call { ty, fun: _, args: _args, .. } if
{
match ty.kind() {
ty::FnDef(did, _) => {
self.tcx.is_diagnostic_item(rustc_span::sym::mir_return,
*did)
}
_ => false,
}
} => {
Ok(TerminatorKind::Return)
}
ExprKind::Call { ty, fun: _, args: args, .. } if
{
match ty.kind() {
ty::FnDef(did, _) => {
self.tcx.is_diagnostic_item(rustc_span::sym::mir_goto, *did)
}
_ => false,
}
} => {
Ok(TerminatorKind::Goto { target: self.parse_block(args[0])? })
}
ExprKind::Call { ty, fun: _, args: _args, .. } if
{
match ty.kind() {
ty::FnDef(did, _) => {
self.tcx.is_diagnostic_item(rustc_span::sym::mir_unreachable,
*did)
}
_ => false,
}
} => {
Ok(TerminatorKind::Unreachable)
}
ExprKind::Call { ty, fun: _, args: _args, .. } if
{
match ty.kind() {
ty::FnDef(did, _) => {
self.tcx.is_diagnostic_item(rustc_span::sym::mir_unwind_resume,
*did)
}
_ => false,
}
} => {
Ok(TerminatorKind::UnwindResume)
}
ExprKind::Call { ty, fun: _, args: args, .. } if
{
match ty.kind() {
ty::FnDef(did, _) => {
self.tcx.is_diagnostic_item(rustc_span::sym::mir_unwind_terminate,
*did)
}
_ => false,
}
} => {
Ok(TerminatorKind::UnwindTerminate(self.parse_unwind_terminate_reason(args[0])?))
}
ExprKind::Call { ty, fun: _, args: args, .. } if
{
match ty.kind() {
ty::FnDef(did, _) => {
self.tcx.is_diagnostic_item(rustc_span::sym::mir_drop, *did)
}
_ => false,
}
} => {
Ok(TerminatorKind::Drop {
place: self.parse_place(args[0])?,
target: self.parse_return_to(args[1])?,
unwind: self.parse_unwind_action(args[2])?,
replace: false,
drop: None,
})
}
ExprKind::Call { ty, fun: _, args: args, .. } if
{
match ty.kind() {
ty::FnDef(did, _) => {
self.tcx.is_diagnostic_item(rustc_span::sym::mir_call, *did)
}
_ => false,
}
} => {
self.parse_call(args)
}
ExprKind::Call { ty, fun: _, args: args, .. } if
{
match ty.kind() {
ty::FnDef(did, _) => {
self.tcx.is_diagnostic_item(rustc_span::sym::mir_tail_call,
*did)
}
_ => false,
}
} => {
self.parse_tail_call(args)
}
ExprKind::Match { scrutinee, arms, .. } => {
let discr = self.parse_operand(*scrutinee)?;
self.parse_match(arms,
expr.span).map(|t|
TerminatorKind::SwitchInt { discr, targets: t })
}
#[allow(unreachable_patterns)]
_ => return Err(self.expr_error(expr_id, "terminator")),
}
}parse_by_kind!(self, expr_id, expr, "terminator",
46 @call(mir_return, _args) => {
47 Ok(TerminatorKind::Return)
48 },
49 @call(mir_goto, args) => {
50 Ok(TerminatorKind::Goto { target: self.parse_block(args[0])? } )
51 },
52 @call(mir_unreachable, _args) => {
53 Ok(TerminatorKind::Unreachable)
54 },
55 @call(mir_unwind_resume, _args) => {
56 Ok(TerminatorKind::UnwindResume)
57 },
58 @call(mir_unwind_terminate, args) => {
59 Ok(TerminatorKind::UnwindTerminate(self.parse_unwind_terminate_reason(args[0])?))
60 },
61 @call(mir_drop, args) => {
62 Ok(TerminatorKind::Drop {
63 place: self.parse_place(args[0])?,
64 target: self.parse_return_to(args[1])?,
65 unwind: self.parse_unwind_action(args[2])?,
66 replace: false,
67 drop: None,
68 })
69 },
70 @call(mir_call, args) => {
71 self.parse_call(args)
72 },
73 @call(mir_tail_call, args) => {
74 self.parse_tail_call(args)
75 },
76 ExprKind::Match { scrutinee, arms, .. } => {
77 let discr = self.parse_operand(*scrutinee)?;
78 self.parse_match(arms, expr.span).map(|t| TerminatorKind::SwitchInt { discr, targets: t })
79 },
80 )
81 }
82
83 fn parse_unwind_terminate_reason(&self, expr_id: ExprId) -> PResult<UnwindTerminateReason> {
84 {
let expr_id = self.preparse(expr_id);
let expr = &self.thir[expr_id];
{
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event /rustc-dev/923c95cdf5ba65cea505aa2ea829f578e1506ed8/compiler/rustc_mir_build/src/builder/custom/parse/instruction.rs:84",
"rustc_mir_build::builder::custom::parse::instruction",
::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("/rustc-dev/923c95cdf5ba65cea505aa2ea829f578e1506ed8/compiler/rustc_mir_build/src/builder/custom/parse/instruction.rs"),
::tracing_core::__macro_support::Option::Some(84u32),
::tracing_core::__macro_support::Option::Some("rustc_mir_build::builder::custom::parse::instruction"),
::tracing_core::field::FieldSet::new(&["message"],
::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::EVENT)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let enabled =
::tracing::Level::DEBUG <=
::tracing::level_filters::STATIC_MAX_LEVEL &&
::tracing::Level::DEBUG <=
::tracing::level_filters::LevelFilter::current() &&
{
let interest = __CALLSITE.interest();
!interest.is_never() &&
::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
interest)
};
if enabled {
(|value_set: ::tracing::field::ValueSet|
{
let meta = __CALLSITE.metadata();
::tracing::Event::dispatch(meta, &value_set);
;
})({
#[allow(unused_imports)]
use ::tracing::field::{debug, display, Value};
__CALLSITE.metadata().fields().value_set_all(&[(::tracing::__macro_support::Option::Some(&format_args!("Trying to parse {0:?} as {1}",
expr.kind, "unwind terminate reason") as
&dyn ::tracing::field::Value))])
});
} else { ; }
};
let _ = expr;
match &expr.kind {
ExprKind::Adt(AdtExpr { adt_def, variant_index, .. }) if
{
self.tcx.is_diagnostic_item(rustc_span::sym::mir_unwind_terminate_reason,
adt_def.did()) &&
adt_def.variants()[*variant_index].name ==
rustc_span::sym::Abi
} => {
Ok(UnwindTerminateReason::Abi)
}
ExprKind::Adt(AdtExpr { adt_def, variant_index, .. }) if
{
self.tcx.is_diagnostic_item(rustc_span::sym::mir_unwind_terminate_reason,
adt_def.did()) &&
adt_def.variants()[*variant_index].name ==
rustc_span::sym::InCleanup
} => {
Ok(UnwindTerminateReason::InCleanup)
}
#[allow(unreachable_patterns)]
_ =>
return Err(self.expr_error(expr_id, "unwind terminate reason")),
}
}parse_by_kind!(self, expr_id, _, "unwind terminate reason",
85 @variant(mir_unwind_terminate_reason, Abi) => {
86 Ok(UnwindTerminateReason::Abi)
87 },
88 @variant(mir_unwind_terminate_reason, InCleanup) => {
89 Ok(UnwindTerminateReason::InCleanup)
90 },
91 )
92 }
93
94 fn parse_unwind_action(&self, expr_id: ExprId) -> PResult<UnwindAction> {
95 {
let expr_id = self.preparse(expr_id);
let expr = &self.thir[expr_id];
{
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event /rustc-dev/923c95cdf5ba65cea505aa2ea829f578e1506ed8/compiler/rustc_mir_build/src/builder/custom/parse/instruction.rs:95",
"rustc_mir_build::builder::custom::parse::instruction",
::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("/rustc-dev/923c95cdf5ba65cea505aa2ea829f578e1506ed8/compiler/rustc_mir_build/src/builder/custom/parse/instruction.rs"),
::tracing_core::__macro_support::Option::Some(95u32),
::tracing_core::__macro_support::Option::Some("rustc_mir_build::builder::custom::parse::instruction"),
::tracing_core::field::FieldSet::new(&["message"],
::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::EVENT)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let enabled =
::tracing::Level::DEBUG <=
::tracing::level_filters::STATIC_MAX_LEVEL &&
::tracing::Level::DEBUG <=
::tracing::level_filters::LevelFilter::current() &&
{
let interest = __CALLSITE.interest();
!interest.is_never() &&
::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
interest)
};
if enabled {
(|value_set: ::tracing::field::ValueSet|
{
let meta = __CALLSITE.metadata();
::tracing::Event::dispatch(meta, &value_set);
;
})({
#[allow(unused_imports)]
use ::tracing::field::{debug, display, Value};
__CALLSITE.metadata().fields().value_set_all(&[(::tracing::__macro_support::Option::Some(&format_args!("Trying to parse {0:?} as {1}",
expr.kind, "unwind action") as
&dyn ::tracing::field::Value))])
});
} else { ; }
};
let _ = expr;
match &expr.kind {
ExprKind::Call { ty, fun: _, args: _args, .. } if
{
match ty.kind() {
ty::FnDef(did, _) => {
self.tcx.is_diagnostic_item(rustc_span::sym::mir_unwind_continue,
*did)
}
_ => false,
}
} => {
Ok(UnwindAction::Continue)
}
ExprKind::Call { ty, fun: _, args: _args, .. } if
{
match ty.kind() {
ty::FnDef(did, _) => {
self.tcx.is_diagnostic_item(rustc_span::sym::mir_unwind_unreachable,
*did)
}
_ => false,
}
} => {
Ok(UnwindAction::Unreachable)
}
ExprKind::Call { ty, fun: _, args: args, .. } if
{
match ty.kind() {
ty::FnDef(did, _) => {
self.tcx.is_diagnostic_item(rustc_span::sym::mir_unwind_terminate,
*did)
}
_ => false,
}
} => {
Ok(UnwindAction::Terminate(self.parse_unwind_terminate_reason(args[0])?))
}
ExprKind::Call { ty, fun: _, args: args, .. } if
{
match ty.kind() {
ty::FnDef(did, _) => {
self.tcx.is_diagnostic_item(rustc_span::sym::mir_unwind_cleanup,
*did)
}
_ => false,
}
} => {
Ok(UnwindAction::Cleanup(self.parse_block(args[0])?))
}
#[allow(unreachable_patterns)]
_ => return Err(self.expr_error(expr_id, "unwind action")),
}
}parse_by_kind!(self, expr_id, _, "unwind action",
96 @call(mir_unwind_continue, _args) => {
97 Ok(UnwindAction::Continue)
98 },
99 @call(mir_unwind_unreachable, _args) => {
100 Ok(UnwindAction::Unreachable)
101 },
102 @call(mir_unwind_terminate, args) => {
103 Ok(UnwindAction::Terminate(self.parse_unwind_terminate_reason(args[0])?))
104 },
105 @call(mir_unwind_cleanup, args) => {
106 Ok(UnwindAction::Cleanup(self.parse_block(args[0])?))
107 },
108 )
109 }
110
111 fn parse_return_to(&self, expr_id: ExprId) -> PResult<BasicBlock> {
112 {
let expr_id = self.preparse(expr_id);
let expr = &self.thir[expr_id];
{
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event /rustc-dev/923c95cdf5ba65cea505aa2ea829f578e1506ed8/compiler/rustc_mir_build/src/builder/custom/parse/instruction.rs:112",
"rustc_mir_build::builder::custom::parse::instruction",
::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("/rustc-dev/923c95cdf5ba65cea505aa2ea829f578e1506ed8/compiler/rustc_mir_build/src/builder/custom/parse/instruction.rs"),
::tracing_core::__macro_support::Option::Some(112u32),
::tracing_core::__macro_support::Option::Some("rustc_mir_build::builder::custom::parse::instruction"),
::tracing_core::field::FieldSet::new(&["message"],
::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::EVENT)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let enabled =
::tracing::Level::DEBUG <=
::tracing::level_filters::STATIC_MAX_LEVEL &&
::tracing::Level::DEBUG <=
::tracing::level_filters::LevelFilter::current() &&
{
let interest = __CALLSITE.interest();
!interest.is_never() &&
::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
interest)
};
if enabled {
(|value_set: ::tracing::field::ValueSet|
{
let meta = __CALLSITE.metadata();
::tracing::Event::dispatch(meta, &value_set);
;
})({
#[allow(unused_imports)]
use ::tracing::field::{debug, display, Value};
__CALLSITE.metadata().fields().value_set_all(&[(::tracing::__macro_support::Option::Some(&format_args!("Trying to parse {0:?} as {1}",
expr.kind, "return block") as
&dyn ::tracing::field::Value))])
});
} else { ; }
};
let _ = expr;
match &expr.kind {
ExprKind::Call { ty, fun: _, args: args, .. } if
{
match ty.kind() {
ty::FnDef(did, _) => {
self.tcx.is_diagnostic_item(rustc_span::sym::mir_return_to,
*did)
}
_ => false,
}
} => {
self.parse_block(args[0])
}
#[allow(unreachable_patterns)]
_ => return Err(self.expr_error(expr_id, "return block")),
}
}parse_by_kind!(self, expr_id, _, "return block",
113 @call(mir_return_to, args) => {
114 self.parse_block(args[0])
115 },
116 )
117 }
118
119 fn parse_match(&self, arms: &[ArmId], span: Span) -> PResult<SwitchTargets> {
120 let Some((otherwise, rest)) = arms.split_last() else {
121 return Err(ParseError {
122 span,
123 item_description: "no arms".to_string(),
124 expected: "at least one arm".to_string(),
125 });
126 };
127
128 let otherwise = &self.thir[*otherwise];
129 let PatKind::Wild = otherwise.pattern.kind else {
130 return Err(ParseError {
131 span: otherwise.span,
132 item_description: ::alloc::__export::must_use({
::alloc::fmt::format(format_args!("{0:?}", otherwise.pattern.kind))
})format!("{:?}", otherwise.pattern.kind),
133 expected: "wildcard pattern".to_string(),
134 });
135 };
136 let otherwise = self.parse_block(otherwise.body)?;
137
138 let mut values = Vec::new();
139 let mut targets = Vec::new();
140 for arm in rest {
141 let arm = &self.thir[*arm];
142 let value = match arm.pattern.kind {
143 PatKind::Constant { value } => value,
144 _ => {
145 return Err(ParseError {
146 span: arm.pattern.span,
147 item_description: ::alloc::__export::must_use({
::alloc::fmt::format(format_args!("{0:?}", arm.pattern.kind))
})format!("{:?}", arm.pattern.kind),
148 expected: "constant pattern".to_string(),
149 });
150 }
151 };
152 values.push(value.to_leaf().to_bits_unchecked());
153 targets.push(self.parse_block(arm.body)?);
154 }
155
156 Ok(SwitchTargets::new(values.into_iter().zip(targets), otherwise))
157 }
158
159 fn parse_call(&self, args: &[ExprId]) -> PResult<TerminatorKind<'tcx>> {
160 let (destination, call) = {
let expr_id = self.preparse(args[0]);
let expr = &self.thir[expr_id];
{
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event /rustc-dev/923c95cdf5ba65cea505aa2ea829f578e1506ed8/compiler/rustc_mir_build/src/builder/custom/parse/instruction.rs:160",
"rustc_mir_build::builder::custom::parse::instruction",
::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("/rustc-dev/923c95cdf5ba65cea505aa2ea829f578e1506ed8/compiler/rustc_mir_build/src/builder/custom/parse/instruction.rs"),
::tracing_core::__macro_support::Option::Some(160u32),
::tracing_core::__macro_support::Option::Some("rustc_mir_build::builder::custom::parse::instruction"),
::tracing_core::field::FieldSet::new(&["message"],
::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::EVENT)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let enabled =
::tracing::Level::DEBUG <=
::tracing::level_filters::STATIC_MAX_LEVEL &&
::tracing::Level::DEBUG <=
::tracing::level_filters::LevelFilter::current() &&
{
let interest = __CALLSITE.interest();
!interest.is_never() &&
::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
interest)
};
if enabled {
(|value_set: ::tracing::field::ValueSet|
{
let meta = __CALLSITE.metadata();
::tracing::Event::dispatch(meta, &value_set);
;
})({
#[allow(unused_imports)]
use ::tracing::field::{debug, display, Value};
__CALLSITE.metadata().fields().value_set_all(&[(::tracing::__macro_support::Option::Some(&format_args!("Trying to parse {0:?} as {1}",
expr.kind, "function call") as
&dyn ::tracing::field::Value))])
});
} else { ; }
};
let _ = expr;
match &expr.kind {
ExprKind::Assign { lhs, rhs } =>
(*lhs,
*rhs),
#[allow(unreachable_patterns)]
_ => return Err(self.expr_error(expr_id, "function call")),
}
}parse_by_kind!(self, args[0], _, "function call",
161 ExprKind::Assign { lhs, rhs } => (*lhs, *rhs),
162 );
163 let destination = self.parse_place(destination)?;
164 let target = self.parse_return_to(args[1])?;
165 let unwind = self.parse_unwind_action(args[2])?;
166
167 {
let expr_id = self.preparse(call);
let expr = &self.thir[expr_id];
{
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event /rustc-dev/923c95cdf5ba65cea505aa2ea829f578e1506ed8/compiler/rustc_mir_build/src/builder/custom/parse/instruction.rs:167",
"rustc_mir_build::builder::custom::parse::instruction",
::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("/rustc-dev/923c95cdf5ba65cea505aa2ea829f578e1506ed8/compiler/rustc_mir_build/src/builder/custom/parse/instruction.rs"),
::tracing_core::__macro_support::Option::Some(167u32),
::tracing_core::__macro_support::Option::Some("rustc_mir_build::builder::custom::parse::instruction"),
::tracing_core::field::FieldSet::new(&["message"],
::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::EVENT)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let enabled =
::tracing::Level::DEBUG <=
::tracing::level_filters::STATIC_MAX_LEVEL &&
::tracing::Level::DEBUG <=
::tracing::level_filters::LevelFilter::current() &&
{
let interest = __CALLSITE.interest();
!interest.is_never() &&
::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
interest)
};
if enabled {
(|value_set: ::tracing::field::ValueSet|
{
let meta = __CALLSITE.metadata();
::tracing::Event::dispatch(meta, &value_set);
;
})({
#[allow(unused_imports)]
use ::tracing::field::{debug, display, Value};
__CALLSITE.metadata().fields().value_set_all(&[(::tracing::__macro_support::Option::Some(&format_args!("Trying to parse {0:?} as {1}",
expr.kind, "function call") as
&dyn ::tracing::field::Value))])
});
} else { ; }
};
let _ = expr;
match &expr.kind {
ExprKind::Call { fun, args, from_hir_call, fn_span, .. } => {
let fun = self.parse_operand(*fun)?;
let args =
args.iter().map(|arg|
Ok(Spanned {
node: self.parse_operand(*arg)?,
span: self.thir.exprs[*arg].span,
})).collect::<PResult<Box<[_]>>>()?;
Ok(TerminatorKind::Call {
func: fun,
args,
destination,
target: Some(target),
unwind,
call_source: if *from_hir_call {
CallSource::Normal
} else { CallSource::OverloadedOperator },
fn_span: *fn_span,
})
}
#[allow(unreachable_patterns)]
_ => return Err(self.expr_error(expr_id, "function call")),
}
}parse_by_kind!(self, call, _, "function call",
168 ExprKind::Call { fun, args, from_hir_call, fn_span, .. } => {
169 let fun = self.parse_operand(*fun)?;
170 let args = args
171 .iter()
172 .map(|arg|
173 Ok(Spanned { node: self.parse_operand(*arg)?, span: self.thir.exprs[*arg].span } )
174 )
175 .collect::<PResult<Box<[_]>>>()?;
176 Ok(TerminatorKind::Call {
177 func: fun,
178 args,
179 destination,
180 target: Some(target),
181 unwind,
182 call_source: if *from_hir_call { CallSource::Normal } else {
183 CallSource::OverloadedOperator
184 },
185 fn_span: *fn_span,
186 })
187 },
188 )
189 }
190
191 fn parse_tail_call(&self, args: &[ExprId]) -> PResult<TerminatorKind<'tcx>> {
192 {
let expr_id = self.preparse(args[0]);
let expr = &self.thir[expr_id];
{
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event /rustc-dev/923c95cdf5ba65cea505aa2ea829f578e1506ed8/compiler/rustc_mir_build/src/builder/custom/parse/instruction.rs:192",
"rustc_mir_build::builder::custom::parse::instruction",
::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("/rustc-dev/923c95cdf5ba65cea505aa2ea829f578e1506ed8/compiler/rustc_mir_build/src/builder/custom/parse/instruction.rs"),
::tracing_core::__macro_support::Option::Some(192u32),
::tracing_core::__macro_support::Option::Some("rustc_mir_build::builder::custom::parse::instruction"),
::tracing_core::field::FieldSet::new(&["message"],
::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::EVENT)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let enabled =
::tracing::Level::DEBUG <=
::tracing::level_filters::STATIC_MAX_LEVEL &&
::tracing::Level::DEBUG <=
::tracing::level_filters::LevelFilter::current() &&
{
let interest = __CALLSITE.interest();
!interest.is_never() &&
::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
interest)
};
if enabled {
(|value_set: ::tracing::field::ValueSet|
{
let meta = __CALLSITE.metadata();
::tracing::Event::dispatch(meta, &value_set);
;
})({
#[allow(unused_imports)]
use ::tracing::field::{debug, display, Value};
__CALLSITE.metadata().fields().value_set_all(&[(::tracing::__macro_support::Option::Some(&format_args!("Trying to parse {0:?} as {1}",
expr.kind, "tail call") as &dyn ::tracing::field::Value))])
});
} else { ; }
};
let _ = expr;
match &expr.kind {
ExprKind::Call { fun, args, fn_span, .. } => {
let fun = self.parse_operand(*fun)?;
let args =
args.iter().map(|arg|
Ok(Spanned {
node: self.parse_operand(*arg)?,
span: self.thir.exprs[*arg].span,
})).collect::<PResult<Box<[_]>>>()?;
Ok(TerminatorKind::TailCall {
func: fun,
args,
fn_span: *fn_span,
})
}
#[allow(unreachable_patterns)]
_ => return Err(self.expr_error(expr_id, "tail call")),
}
}parse_by_kind!(self, args[0], _, "tail call",
193 ExprKind::Call { fun, args, fn_span, .. } => {
194 let fun = self.parse_operand(*fun)?;
195 let args = args
196 .iter()
197 .map(|arg|
198 Ok(Spanned { node: self.parse_operand(*arg)?, span: self.thir.exprs[*arg].span } )
199 )
200 .collect::<PResult<Box<[_]>>>()?;
201 Ok(TerminatorKind::TailCall {
202 func: fun,
203 args,
204 fn_span: *fn_span,
205 })
206 },
207 )
208 }
209
210 fn parse_cast_fn_ptr_safety(&self, expr_id: ExprId) -> PResult<Safety> {
211 {
let expr_id = self.preparse(expr_id);
let expr = &self.thir[expr_id];
{
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event /rustc-dev/923c95cdf5ba65cea505aa2ea829f578e1506ed8/compiler/rustc_mir_build/src/builder/custom/parse/instruction.rs:211",
"rustc_mir_build::builder::custom::parse::instruction",
::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("/rustc-dev/923c95cdf5ba65cea505aa2ea829f578e1506ed8/compiler/rustc_mir_build/src/builder/custom/parse/instruction.rs"),
::tracing_core::__macro_support::Option::Some(211u32),
::tracing_core::__macro_support::Option::Some("rustc_mir_build::builder::custom::parse::instruction"),
::tracing_core::field::FieldSet::new(&["message"],
::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::EVENT)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let enabled =
::tracing::Level::DEBUG <=
::tracing::level_filters::STATIC_MAX_LEVEL &&
::tracing::Level::DEBUG <=
::tracing::level_filters::LevelFilter::current() &&
{
let interest = __CALLSITE.interest();
!interest.is_never() &&
::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
interest)
};
if enabled {
(|value_set: ::tracing::field::ValueSet|
{
let meta = __CALLSITE.metadata();
::tracing::Event::dispatch(meta, &value_set);
;
})({
#[allow(unused_imports)]
use ::tracing::field::{debug, display, Value};
__CALLSITE.metadata().fields().value_set_all(&[(::tracing::__macro_support::Option::Some(&format_args!("Trying to parse {0:?} as {1}",
expr.kind, "function pointer safety") as
&dyn ::tracing::field::Value))])
});
} else { ; }
};
let _ = expr;
match &expr.kind {
ExprKind::Adt(AdtExpr { adt_def, variant_index, .. }) if
{
self.tcx.is_diagnostic_item(rustc_span::sym::mir_cast_fn_ptr_safety,
adt_def.did()) &&
adt_def.variants()[*variant_index].name ==
rustc_span::sym::Safe
} => {
Ok(Safety::Safe)
}
ExprKind::Adt(AdtExpr { adt_def, variant_index, .. }) if
{
self.tcx.is_diagnostic_item(rustc_span::sym::mir_cast_fn_ptr_safety,
adt_def.did()) &&
adt_def.variants()[*variant_index].name ==
rustc_span::sym::Unsafe
} => {
Ok(Safety::Unsafe)
}
#[allow(unreachable_patterns)]
_ =>
return Err(self.expr_error(expr_id, "function pointer safety")),
}
}parse_by_kind!(self, expr_id, _, "function pointer safety",
212 @variant(mir_cast_fn_ptr_safety, Safe) => {
213 Ok(Safety::Safe)
214 },
215 @variant(mir_cast_fn_ptr_safety, Unsafe) => {
216 Ok(Safety::Unsafe)
217 },
218 )
219 }
220
221 fn parse_cast_pointer_coercion(&self, expr_id: ExprId) -> PResult<PointerCoercion> {
222 {
let expr_id = self.preparse(expr_id);
let expr = &self.thir[expr_id];
{
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event /rustc-dev/923c95cdf5ba65cea505aa2ea829f578e1506ed8/compiler/rustc_mir_build/src/builder/custom/parse/instruction.rs:222",
"rustc_mir_build::builder::custom::parse::instruction",
::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("/rustc-dev/923c95cdf5ba65cea505aa2ea829f578e1506ed8/compiler/rustc_mir_build/src/builder/custom/parse/instruction.rs"),
::tracing_core::__macro_support::Option::Some(222u32),
::tracing_core::__macro_support::Option::Some("rustc_mir_build::builder::custom::parse::instruction"),
::tracing_core::field::FieldSet::new(&["message"],
::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::EVENT)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let enabled =
::tracing::Level::DEBUG <=
::tracing::level_filters::STATIC_MAX_LEVEL &&
::tracing::Level::DEBUG <=
::tracing::level_filters::LevelFilter::current() &&
{
let interest = __CALLSITE.interest();
!interest.is_never() &&
::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
interest)
};
if enabled {
(|value_set: ::tracing::field::ValueSet|
{
let meta = __CALLSITE.metadata();
::tracing::Event::dispatch(meta, &value_set);
;
})({
#[allow(unused_imports)]
use ::tracing::field::{debug, display, Value};
__CALLSITE.metadata().fields().value_set_all(&[(::tracing::__macro_support::Option::Some(&format_args!("Trying to parse {0:?} as {1}",
expr.kind, "pointer coercion kind") as
&dyn ::tracing::field::Value))])
});
} else { ; }
};
let expr = expr;
match &expr.kind {
ExprKind::Adt(AdtExpr { adt_def, variant_index, .. }) if
{
self.tcx.is_diagnostic_item(rustc_span::sym::mir_cast_ptr_coercion,
adt_def.did()) &&
adt_def.variants()[*variant_index].name ==
rustc_span::sym::ReifyFnPointer
} => {
let ExprKind::Adt(AdtExpr { fields, .. }) =
&expr.kind else {
{
::core::panicking::panic_fmt(format_args!("internal error: entered unreachable code: {0}",
format_args!("already matched")));
}
};
Ok(PointerCoercion::ReifyFnPointer(self.parse_cast_fn_ptr_safety(fields[0].expr)?))
}
ExprKind::Adt(AdtExpr { adt_def, variant_index, .. }) if
{
self.tcx.is_diagnostic_item(rustc_span::sym::mir_cast_ptr_coercion,
adt_def.did()) &&
adt_def.variants()[*variant_index].name ==
rustc_span::sym::UnsafeFnPointer
} => {
Ok(PointerCoercion::UnsafeFnPointer)
}
ExprKind::Adt(AdtExpr { adt_def, variant_index, .. }) if
{
self.tcx.is_diagnostic_item(rustc_span::sym::mir_cast_ptr_coercion,
adt_def.did()) &&
adt_def.variants()[*variant_index].name ==
rustc_span::sym::ClosureFnPointer
} => {
let ExprKind::Adt(AdtExpr { fields, .. }) =
&expr.kind else {
{
::core::panicking::panic_fmt(format_args!("internal error: entered unreachable code: {0}",
format_args!("already matched")));
}
};
Ok(PointerCoercion::ClosureFnPointer(self.parse_cast_fn_ptr_safety(fields[0].expr)?))
}
ExprKind::Adt(AdtExpr { adt_def, variant_index, .. }) if
{
self.tcx.is_diagnostic_item(rustc_span::sym::mir_cast_ptr_coercion,
adt_def.did()) &&
adt_def.variants()[*variant_index].name ==
rustc_span::sym::MutToConstPointer
} => {
Ok(PointerCoercion::MutToConstPointer)
}
ExprKind::Adt(AdtExpr { adt_def, variant_index, .. }) if
{
self.tcx.is_diagnostic_item(rustc_span::sym::mir_cast_ptr_coercion,
adt_def.did()) &&
adt_def.variants()[*variant_index].name ==
rustc_span::sym::ArrayToPointer
} => {
Ok(PointerCoercion::ArrayToPointer)
}
ExprKind::Adt(AdtExpr { adt_def, variant_index, .. }) if
{
self.tcx.is_diagnostic_item(rustc_span::sym::mir_cast_ptr_coercion,
adt_def.did()) &&
adt_def.variants()[*variant_index].name ==
rustc_span::sym::UnsizePointee
} => {
Ok(PointerCoercion::Unsize)
}
#[allow(unreachable_patterns)]
_ =>
return Err(self.expr_error(expr_id, "pointer coercion kind")),
}
}parse_by_kind!(self, expr_id, expr, "pointer coercion kind",
223 @variant(mir_cast_ptr_coercion, ReifyFnPointer) => {
224 let ExprKind::Adt(AdtExpr { fields, .. }) = &expr.kind else {
225 unreachable!("already matched")
226 };
227 Ok(PointerCoercion::ReifyFnPointer(
228 self.parse_cast_fn_ptr_safety(fields[0].expr)?,
229 ))
230 },
231 @variant(mir_cast_ptr_coercion, UnsafeFnPointer) => {
232 Ok(PointerCoercion::UnsafeFnPointer)
233 },
234 @variant(mir_cast_ptr_coercion, ClosureFnPointer) => {
235 let ExprKind::Adt(AdtExpr { fields, .. }) = &expr.kind else {
236 unreachable!("already matched")
237 };
238 Ok(PointerCoercion::ClosureFnPointer(
239 self.parse_cast_fn_ptr_safety(fields[0].expr)?,
240 ))
241 },
242 @variant(mir_cast_ptr_coercion, MutToConstPointer) => {
243 Ok(PointerCoercion::MutToConstPointer)
244 },
245 @variant(mir_cast_ptr_coercion, ArrayToPointer) => {
246 Ok(PointerCoercion::ArrayToPointer)
247 },
248 @variant(mir_cast_ptr_coercion, UnsizePointee) => {
249 Ok(PointerCoercion::Unsize)
250 },
251 )
252 }
253
254 fn parse_cast_kind(&self, expr_id: ExprId) -> PResult<CastKind> {
255 {
let expr_id = self.preparse(expr_id);
let expr = &self.thir[expr_id];
{
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event /rustc-dev/923c95cdf5ba65cea505aa2ea829f578e1506ed8/compiler/rustc_mir_build/src/builder/custom/parse/instruction.rs:255",
"rustc_mir_build::builder::custom::parse::instruction",
::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("/rustc-dev/923c95cdf5ba65cea505aa2ea829f578e1506ed8/compiler/rustc_mir_build/src/builder/custom/parse/instruction.rs"),
::tracing_core::__macro_support::Option::Some(255u32),
::tracing_core::__macro_support::Option::Some("rustc_mir_build::builder::custom::parse::instruction"),
::tracing_core::field::FieldSet::new(&["message"],
::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::EVENT)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let enabled =
::tracing::Level::DEBUG <=
::tracing::level_filters::STATIC_MAX_LEVEL &&
::tracing::Level::DEBUG <=
::tracing::level_filters::LevelFilter::current() &&
{
let interest = __CALLSITE.interest();
!interest.is_never() &&
::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
interest)
};
if enabled {
(|value_set: ::tracing::field::ValueSet|
{
let meta = __CALLSITE.metadata();
::tracing::Event::dispatch(meta, &value_set);
;
})({
#[allow(unused_imports)]
use ::tracing::field::{debug, display, Value};
__CALLSITE.metadata().fields().value_set_all(&[(::tracing::__macro_support::Option::Some(&format_args!("Trying to parse {0:?} as {1}",
expr.kind, "cast kind") as &dyn ::tracing::field::Value))])
});
} else { ; }
};
let expr = expr;
match &expr.kind {
ExprKind::Adt(AdtExpr { adt_def, variant_index, .. }) if
{
self.tcx.is_diagnostic_item(rustc_span::sym::mir_cast_kind,
adt_def.did()) &&
adt_def.variants()[*variant_index].name ==
rustc_span::sym::PointerExposeProvenance
} => {
Ok(CastKind::PointerExposeProvenance)
}
ExprKind::Adt(AdtExpr { adt_def, variant_index, .. }) if
{
self.tcx.is_diagnostic_item(rustc_span::sym::mir_cast_kind,
adt_def.did()) &&
adt_def.variants()[*variant_index].name ==
rustc_span::sym::PointerWithExposedProvenance
} => {
Ok(CastKind::PointerWithExposedProvenance)
}
ExprKind::Adt(AdtExpr { adt_def, variant_index, .. }) if
{
self.tcx.is_diagnostic_item(rustc_span::sym::mir_cast_kind,
adt_def.did()) &&
adt_def.variants()[*variant_index].name ==
rustc_span::sym::IntToInt
} => {
Ok(CastKind::IntToInt)
}
ExprKind::Adt(AdtExpr { adt_def, variant_index, .. }) if
{
self.tcx.is_diagnostic_item(rustc_span::sym::mir_cast_kind,
adt_def.did()) &&
adt_def.variants()[*variant_index].name ==
rustc_span::sym::FloatToInt
} => {
Ok(CastKind::FloatToInt)
}
ExprKind::Adt(AdtExpr { adt_def, variant_index, .. }) if
{
self.tcx.is_diagnostic_item(rustc_span::sym::mir_cast_kind,
adt_def.did()) &&
adt_def.variants()[*variant_index].name ==
rustc_span::sym::FloatToFloat
} => {
Ok(CastKind::FloatToFloat)
}
ExprKind::Adt(AdtExpr { adt_def, variant_index, .. }) if
{
self.tcx.is_diagnostic_item(rustc_span::sym::mir_cast_kind,
adt_def.did()) &&
adt_def.variants()[*variant_index].name ==
rustc_span::sym::IntToFloat
} => {
Ok(CastKind::IntToFloat)
}
ExprKind::Adt(AdtExpr { adt_def, variant_index, .. }) if
{
self.tcx.is_diagnostic_item(rustc_span::sym::mir_cast_kind,
adt_def.did()) &&
adt_def.variants()[*variant_index].name ==
rustc_span::sym::PtrToPtr
} => {
Ok(CastKind::PtrToPtr)
}
ExprKind::Adt(AdtExpr { adt_def, variant_index, .. }) if
{
self.tcx.is_diagnostic_item(rustc_span::sym::mir_cast_kind,
adt_def.did()) &&
adt_def.variants()[*variant_index].name ==
rustc_span::sym::FnPtrToPtr
} => {
Ok(CastKind::FnPtrToPtr)
}
ExprKind::Adt(AdtExpr { adt_def, variant_index, .. }) if
{
self.tcx.is_diagnostic_item(rustc_span::sym::mir_cast_kind,
adt_def.did()) &&
adt_def.variants()[*variant_index].name ==
rustc_span::sym::Transmute
} => {
Ok(CastKind::Transmute)
}
ExprKind::Adt(AdtExpr { adt_def, variant_index, .. }) if
{
self.tcx.is_diagnostic_item(rustc_span::sym::mir_cast_kind,
adt_def.did()) &&
adt_def.variants()[*variant_index].name ==
rustc_span::sym::BoxDerefTransmute
} => {
Ok(CastKind::BoxDerefTransmute)
}
ExprKind::Adt(AdtExpr { adt_def, variant_index, .. }) if
{
self.tcx.is_diagnostic_item(rustc_span::sym::mir_cast_kind,
adt_def.did()) &&
adt_def.variants()[*variant_index].name ==
rustc_span::sym::Subtype
} => {
Ok(CastKind::Subtype)
}
ExprKind::Adt(AdtExpr { adt_def, variant_index, .. }) if
{
self.tcx.is_diagnostic_item(rustc_span::sym::mir_cast_kind,
adt_def.did()) &&
adt_def.variants()[*variant_index].name ==
rustc_span::sym::PointerCoercion
} => {
let ExprKind::Adt(AdtExpr { fields, .. }) =
&expr.kind else {
{
::core::panicking::panic_fmt(format_args!("internal error: entered unreachable code: {0}",
format_args!("already matched")));
}
};
Ok(CastKind::PointerCoercion(self.parse_cast_pointer_coercion(fields[0].expr)?,
CoercionSource::AsCast))
}
#[allow(unreachable_patterns)]
_ => return Err(self.expr_error(expr_id, "cast kind")),
}
}parse_by_kind!(self, expr_id, expr, "cast kind",
256 @variant(mir_cast_kind, PointerExposeProvenance) => {
257 Ok(CastKind::PointerExposeProvenance)
258 },
259 @variant(mir_cast_kind, PointerWithExposedProvenance) => {
260 Ok(CastKind::PointerWithExposedProvenance)
261 },
262 @variant(mir_cast_kind, IntToInt) => {
263 Ok(CastKind::IntToInt)
264 },
265 @variant(mir_cast_kind, FloatToInt) => {
266 Ok(CastKind::FloatToInt)
267 },
268 @variant(mir_cast_kind, FloatToFloat) => {
269 Ok(CastKind::FloatToFloat)
270 },
271 @variant(mir_cast_kind, IntToFloat) => {
272 Ok(CastKind::IntToFloat)
273 },
274 @variant(mir_cast_kind, PtrToPtr) => {
275 Ok(CastKind::PtrToPtr)
276 },
277 @variant(mir_cast_kind, FnPtrToPtr) => {
278 Ok(CastKind::FnPtrToPtr)
279 },
280 @variant(mir_cast_kind, Transmute) => {
281 Ok(CastKind::Transmute)
282 },
283 @variant(mir_cast_kind, BoxDerefTransmute) => {
284 Ok(CastKind::BoxDerefTransmute)
285 },
286 @variant(mir_cast_kind, Subtype) => {
287 Ok(CastKind::Subtype)
288 },
289 @variant(mir_cast_kind, PointerCoercion) => {
290 let ExprKind::Adt(AdtExpr { fields, .. }) = &expr.kind else {
291 unreachable!("already matched")
292 };
293 Ok(CastKind::PointerCoercion(
294 self.parse_cast_pointer_coercion(fields[0].expr)?,
295 CoercionSource::AsCast,
296 ))
297 },
298 )
299 }
300
301 fn parse_rvalue(&self, expr_id: ExprId) -> PResult<Rvalue<'tcx>> {
302 {
let expr_id = self.preparse(expr_id);
let expr = &self.thir[expr_id];
{
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event /rustc-dev/923c95cdf5ba65cea505aa2ea829f578e1506ed8/compiler/rustc_mir_build/src/builder/custom/parse/instruction.rs:302",
"rustc_mir_build::builder::custom::parse::instruction",
::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("/rustc-dev/923c95cdf5ba65cea505aa2ea829f578e1506ed8/compiler/rustc_mir_build/src/builder/custom/parse/instruction.rs"),
::tracing_core::__macro_support::Option::Some(302u32),
::tracing_core::__macro_support::Option::Some("rustc_mir_build::builder::custom::parse::instruction"),
::tracing_core::field::FieldSet::new(&["message"],
::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::EVENT)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let enabled =
::tracing::Level::DEBUG <=
::tracing::level_filters::STATIC_MAX_LEVEL &&
::tracing::Level::DEBUG <=
::tracing::level_filters::LevelFilter::current() &&
{
let interest = __CALLSITE.interest();
!interest.is_never() &&
::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
interest)
};
if enabled {
(|value_set: ::tracing::field::ValueSet|
{
let meta = __CALLSITE.metadata();
::tracing::Event::dispatch(meta, &value_set);
;
})({
#[allow(unused_imports)]
use ::tracing::field::{debug, display, Value};
__CALLSITE.metadata().fields().value_set_all(&[(::tracing::__macro_support::Option::Some(&format_args!("Trying to parse {0:?} as {1}",
expr.kind, "rvalue") as &dyn ::tracing::field::Value))])
});
} else { ; }
};
let expr = expr;
match &expr.kind {
ExprKind::Call { ty, fun: _, args: args, .. } if
{
match ty.kind() {
ty::FnDef(did, _) => {
self.tcx.is_diagnostic_item(rustc_span::sym::mir_discriminant,
*did)
}
_ => false,
}
} => self.parse_place(args[0]).map(Rvalue::Discriminant),
ExprKind::Call { ty, fun: _, args: args, .. } if
{
match ty.kind() {
ty::FnDef(did, _) => {
self.tcx.is_diagnostic_item(rustc_span::sym::mir_cast_transmute,
*did)
}
_ => false,
}
} => {
let source = self.parse_operand(args[0])?;
Ok(Rvalue::Cast(CastKind::Transmute, source, expr.ty))
}
ExprKind::Call { ty, fun: _, args: args, .. } if
{
match ty.kind() {
ty::FnDef(did, _) => {
self.tcx.is_diagnostic_item(rustc_span::sym::mir_cast_ptr_to_ptr,
*did)
}
_ => false,
}
} => {
let source = self.parse_operand(args[0])?;
Ok(Rvalue::Cast(CastKind::PtrToPtr, source, expr.ty))
}
ExprKind::Call { ty, fun: _, args: args, .. } if
{
match ty.kind() {
ty::FnDef(did, _) => {
self.tcx.is_diagnostic_item(rustc_span::sym::mir_cast_unsize,
*did)
}
_ => false,
}
} => {
let source = self.parse_operand(args[0])?;
let kind =
CastKind::PointerCoercion(ty::adjustment::PointerCoercion::Unsize,
CoercionSource::AsCast);
Ok(Rvalue::Cast(kind, source, expr.ty))
}
ExprKind::Call { ty, fun: _, args: args, .. } if
{
match ty.kind() {
ty::FnDef(did, _) => {
self.tcx.is_diagnostic_item(rustc_span::sym::mir_cast, *did)
}
_ => false,
}
} => {
let source = self.parse_operand(args[0])?;
Ok(Rvalue::Cast(self.parse_cast_kind(args[1])?, source, expr.ty))
}
ExprKind::Call { ty, fun: _, args: args, .. } if
{
match ty.kind() {
ty::FnDef(did, _) => {
self.tcx.is_diagnostic_item(rustc_span::sym::mir_checked,
*did)
}
_ => false,
}
} => {
{
let expr_id = self.preparse(args[0]);
let expr = &self.thir[expr_id];
{
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event /rustc-dev/923c95cdf5ba65cea505aa2ea829f578e1506ed8/compiler/rustc_mir_build/src/builder/custom/parse/instruction.rs:322",
"rustc_mir_build::builder::custom::parse::instruction",
::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("/rustc-dev/923c95cdf5ba65cea505aa2ea829f578e1506ed8/compiler/rustc_mir_build/src/builder/custom/parse/instruction.rs"),
::tracing_core::__macro_support::Option::Some(322u32),
::tracing_core::__macro_support::Option::Some("rustc_mir_build::builder::custom::parse::instruction"),
::tracing_core::field::FieldSet::new(&["message"],
::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::EVENT)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let enabled =
::tracing::Level::DEBUG <=
::tracing::level_filters::STATIC_MAX_LEVEL &&
::tracing::Level::DEBUG <=
::tracing::level_filters::LevelFilter::current() &&
{
let interest = __CALLSITE.interest();
!interest.is_never() &&
::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
interest)
};
if enabled {
(|value_set: ::tracing::field::ValueSet|
{
let meta = __CALLSITE.metadata();
::tracing::Event::dispatch(meta, &value_set);
;
})({
#[allow(unused_imports)]
use ::tracing::field::{debug, display, Value};
__CALLSITE.metadata().fields().value_set_all(&[(::tracing::__macro_support::Option::Some(&format_args!("Trying to parse {0:?} as {1}",
expr.kind, "binary op") as &dyn ::tracing::field::Value))])
});
} else { ; }
};
let _ = expr;
match &expr.kind {
ExprKind::Binary { op, lhs, rhs } => {
if let Some(op_with_overflow) = op.wrapping_to_overflowing()
{
Ok(Rvalue::BinaryOp(op_with_overflow,
Box::new((self.parse_operand(*lhs)?,
self.parse_operand(*rhs)?))))
} else {
Err(self.expr_error(expr_id,
"No WithOverflow form of this operator"))
}
}
#[allow(unreachable_patterns)]
_ => return Err(self.expr_error(expr_id, "binary op")),
}
}
}
ExprKind::Call { ty, fun: _, args: args, .. } if
{
match ty.kind() {
ty::FnDef(did, _) => {
self.tcx.is_diagnostic_item(rustc_span::sym::mir_offset,
*did)
}
_ => false,
}
} => {
let ptr = self.parse_operand(args[0])?;
let offset = self.parse_operand(args[1])?;
Ok(Rvalue::BinaryOp(BinOp::Offset, Box::new((ptr, offset))))
}
ExprKind::Call { ty, fun: _, args: args, .. } if
{
match ty.kind() {
ty::FnDef(did, _) => {
self.tcx.is_diagnostic_item(rustc_span::sym::mir_ptr_metadata,
*did)
}
_ => false,
}
} =>
Ok(Rvalue::UnaryOp(UnOp::PtrMetadata,
self.parse_operand(args[0])?)),
ExprKind::Borrow { borrow_kind, arg } =>
Ok(Rvalue::Ref(self.tcx.lifetimes.re_erased, *borrow_kind,
self.parse_place(*arg)?)),
ExprKind::RawBorrow { mutability, arg } =>
Ok(Rvalue::RawPtr((*mutability).into(), self.parse_place(*arg)?)),
ExprKind::Binary { op, lhs, rhs } =>
Ok(Rvalue::BinaryOp(*op,
Box::new((self.parse_operand(*lhs)?,
self.parse_operand(*rhs)?)))),
ExprKind::Unary { op, arg } =>
Ok(Rvalue::UnaryOp(*op, self.parse_operand(*arg)?)),
ExprKind::Repeat { value, count } =>
Ok(Rvalue::Repeat(self.parse_operand(*value)?, *count)),
ExprKind::Cast { source } => {
let source = self.parse_operand(*source)?;
let source_ty = source.ty(self.body.local_decls(), self.tcx);
let cast_kind = mir_cast_kind(source_ty, expr.ty);
Ok(Rvalue::Cast(cast_kind, source, expr.ty))
}
ExprKind::Tuple { fields } =>
Ok(Rvalue::Aggregate(Box::new(AggregateKind::Tuple),
fields.iter().map(|e|
self.parse_operand(*e)).collect::<Result<_, _>>()?)),
ExprKind::Array { fields } => {
let elem_ty =
expr.ty.builtin_index().expect("ty must be an array");
Ok(Rvalue::Aggregate(Box::new(AggregateKind::Array(elem_ty)),
fields.iter().map(|e|
self.parse_operand(*e)).collect::<Result<_, _>>()?))
}
ExprKind::Adt(AdtExpr { adt_def, variant_index, args, fields, .. }) =>
{
let is_union = adt_def.is_union();
let active_field_index = is_union.then(|| fields[0].name);
Ok(Rvalue::Aggregate(Box::new(AggregateKind::Adt(adt_def.did(),
*variant_index, args, None, active_field_index)),
fields.iter().map(|f|
self.parse_operand(f.expr)).collect::<Result<_, _>>()?))
}
_ =>
self.parse_operand(expr_id).map(|op|
Rvalue::Use(op,
WithRetag::Yes)),
#[allow(unreachable_patterns)]
_ => return Err(self.expr_error(expr_id, "rvalue")),
}
}parse_by_kind!(self, expr_id, expr, "rvalue",
303 @call(mir_discriminant, args) => self.parse_place(args[0]).map(Rvalue::Discriminant),
304 @call(mir_cast_transmute, args) => {
305 let source = self.parse_operand(args[0])?;
306 Ok(Rvalue::Cast(CastKind::Transmute, source, expr.ty))
307 },
308 @call(mir_cast_ptr_to_ptr, args) => {
309 let source = self.parse_operand(args[0])?;
310 Ok(Rvalue::Cast(CastKind::PtrToPtr, source, expr.ty))
311 },
312 @call(mir_cast_unsize, args) => {
313 let source = self.parse_operand(args[0])?;
314 let kind = CastKind::PointerCoercion(ty::adjustment::PointerCoercion::Unsize, CoercionSource::AsCast);
315 Ok(Rvalue::Cast(kind, source, expr.ty))
316 },
317 @call(mir_cast, args) => {
318 let source = self.parse_operand(args[0])?;
319 Ok(Rvalue::Cast(self.parse_cast_kind(args[1])?, source, expr.ty))
320 },
321 @call(mir_checked, args) => {
322 parse_by_kind!(self, args[0], _, "binary op",
323 ExprKind::Binary { op, lhs, rhs } => {
324 if let Some(op_with_overflow) = op.wrapping_to_overflowing() {
325 Ok(Rvalue::BinaryOp(
326 op_with_overflow, Box::new((self.parse_operand(*lhs)?, self.parse_operand(*rhs)?))
327 ))
328 } else {
329 Err(self.expr_error(expr_id, "No WithOverflow form of this operator"))
330 }
331 },
332 )
333 },
334 @call(mir_offset, args) => {
335 let ptr = self.parse_operand(args[0])?;
336 let offset = self.parse_operand(args[1])?;
337 Ok(Rvalue::BinaryOp(BinOp::Offset, Box::new((ptr, offset))))
338 },
339 @call(mir_ptr_metadata, args) => Ok(Rvalue::UnaryOp(UnOp::PtrMetadata, self.parse_operand(args[0])?)),
340 ExprKind::Borrow { borrow_kind, arg } => Ok(
341 Rvalue::Ref(self.tcx.lifetimes.re_erased, *borrow_kind, self.parse_place(*arg)?)
342 ),
343 ExprKind::RawBorrow { mutability, arg } => Ok(
344 Rvalue::RawPtr((*mutability).into(), self.parse_place(*arg)?)
345 ),
346 ExprKind::Binary { op, lhs, rhs } => Ok(
347 Rvalue::BinaryOp(*op, Box::new((self.parse_operand(*lhs)?, self.parse_operand(*rhs)?)))
348 ),
349 ExprKind::Unary { op, arg } => Ok(
350 Rvalue::UnaryOp(*op, self.parse_operand(*arg)?)
351 ),
352 ExprKind::Repeat { value, count } => Ok(
353 Rvalue::Repeat(self.parse_operand(*value)?, *count)
354 ),
355 ExprKind::Cast { source } => {
356 let source = self.parse_operand(*source)?;
357 let source_ty = source.ty(self.body.local_decls(), self.tcx);
358 let cast_kind = mir_cast_kind(source_ty, expr.ty);
359 Ok(Rvalue::Cast(cast_kind, source, expr.ty))
360 },
361 ExprKind::Tuple { fields } => Ok(
362 Rvalue::Aggregate(
363 Box::new(AggregateKind::Tuple),
364 fields.iter().map(|e| self.parse_operand(*e)).collect::<Result<_, _>>()?
365 )
366 ),
367 ExprKind::Array { fields } => {
368 let elem_ty = expr.ty.builtin_index().expect("ty must be an array");
369 Ok(Rvalue::Aggregate(
370 Box::new(AggregateKind::Array(elem_ty)),
371 fields.iter().map(|e| self.parse_operand(*e)).collect::<Result<_, _>>()?
372 ))
373 },
374 ExprKind::Adt(AdtExpr { adt_def, variant_index, args, fields, .. }) => {
375 let is_union = adt_def.is_union();
376 let active_field_index = is_union.then(|| fields[0].name);
377
378 Ok(Rvalue::Aggregate(
379 Box::new(AggregateKind::Adt(adt_def.did(), *variant_index, args, None, active_field_index)),
380 fields.iter().map(|f| self.parse_operand(f.expr)).collect::<Result<_, _>>()?
381 ))
382 },
383 _ => self.parse_operand(expr_id).map(|op| Rvalue::Use(op, WithRetag::Yes)),
384 )
385 }
386
387 pub(crate) fn parse_operand(&self, expr_id: ExprId) -> PResult<Operand<'tcx>> {
388 {
let expr_id = self.preparse(expr_id);
let expr = &self.thir[expr_id];
{
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event /rustc-dev/923c95cdf5ba65cea505aa2ea829f578e1506ed8/compiler/rustc_mir_build/src/builder/custom/parse/instruction.rs:388",
"rustc_mir_build::builder::custom::parse::instruction",
::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("/rustc-dev/923c95cdf5ba65cea505aa2ea829f578e1506ed8/compiler/rustc_mir_build/src/builder/custom/parse/instruction.rs"),
::tracing_core::__macro_support::Option::Some(388u32),
::tracing_core::__macro_support::Option::Some("rustc_mir_build::builder::custom::parse::instruction"),
::tracing_core::field::FieldSet::new(&["message"],
::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::EVENT)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let enabled =
::tracing::Level::DEBUG <=
::tracing::level_filters::STATIC_MAX_LEVEL &&
::tracing::Level::DEBUG <=
::tracing::level_filters::LevelFilter::current() &&
{
let interest = __CALLSITE.interest();
!interest.is_never() &&
::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
interest)
};
if enabled {
(|value_set: ::tracing::field::ValueSet|
{
let meta = __CALLSITE.metadata();
::tracing::Event::dispatch(meta, &value_set);
;
})({
#[allow(unused_imports)]
use ::tracing::field::{debug, display, Value};
__CALLSITE.metadata().fields().value_set_all(&[(::tracing::__macro_support::Option::Some(&format_args!("Trying to parse {0:?} as {1}",
expr.kind, "operand") as &dyn ::tracing::field::Value))])
});
} else { ; }
};
let expr = expr;
match &expr.kind {
ExprKind::Call { ty, fun: _, args: args, .. } if
{
match ty.kind() {
ty::FnDef(did, _) => {
self.tcx.is_diagnostic_item(rustc_span::sym::mir_move, *did)
}
_ => false,
}
} => self.parse_place(args[0]).map(Operand::Move),
ExprKind::Call { ty, fun: _, args: args, .. } if
{
match ty.kind() {
ty::FnDef(did, _) => {
self.tcx.is_diagnostic_item(rustc_span::sym::mir_static,
*did)
}
_ => false,
}
} => self.parse_static(args[0]),
ExprKind::Call { ty, fun: _, args: args, .. } if
{
match ty.kind() {
ty::FnDef(did, _) => {
self.tcx.is_diagnostic_item(rustc_span::sym::mir_static_mut,
*did)
}
_ => false,
}
} => self.parse_static(args[0]),
ExprKind::Literal { .. } | ExprKind::NamedConst { .. } |
ExprKind::NonHirLiteral { .. } | ExprKind::ZstLiteral { .. } |
ExprKind::ConstParam { .. } | ExprKind::ConstBlock { .. } => {
Ok(Operand::Constant(Box::new(as_constant_inner(expr, |_| None,
self.tcx))))
}
_ =>
self.parse_place(expr_id).map(Operand::Copy),
#[allow(unreachable_patterns)]
_ => return Err(self.expr_error(expr_id, "operand")),
}
}parse_by_kind!(self, expr_id, expr, "operand",
389 @call(mir_move, args) => self.parse_place(args[0]).map(Operand::Move),
390 @call(mir_static, args) => self.parse_static(args[0]),
391 @call(mir_static_mut, args) => self.parse_static(args[0]),
392 ExprKind::Literal { .. }
393 | ExprKind::NamedConst { .. }
394 | ExprKind::NonHirLiteral { .. }
395 | ExprKind::ZstLiteral { .. }
396 | ExprKind::ConstParam { .. }
397 | ExprKind::ConstBlock { .. } => {
398 Ok(Operand::Constant(Box::new(
399 as_constant_inner(expr, |_| None, self.tcx)
400 )))
401 },
402 _ => self.parse_place(expr_id).map(Operand::Copy),
403 )
404 }
405
406 fn parse_place(&self, expr_id: ExprId) -> PResult<Place<'tcx>> {
407 self.parse_place_inner(expr_id).map(|(x, _)| x)
408 }
409
410 fn parse_place_inner(&self, expr_id: ExprId) -> PResult<(Place<'tcx>, PlaceTy<'tcx>)> {
411 let (parent, proj) = {
let expr_id = self.preparse(expr_id);
let expr = &self.thir[expr_id];
{
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event /rustc-dev/923c95cdf5ba65cea505aa2ea829f578e1506ed8/compiler/rustc_mir_build/src/builder/custom/parse/instruction.rs:411",
"rustc_mir_build::builder::custom::parse::instruction",
::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("/rustc-dev/923c95cdf5ba65cea505aa2ea829f578e1506ed8/compiler/rustc_mir_build/src/builder/custom/parse/instruction.rs"),
::tracing_core::__macro_support::Option::Some(411u32),
::tracing_core::__macro_support::Option::Some("rustc_mir_build::builder::custom::parse::instruction"),
::tracing_core::field::FieldSet::new(&["message"],
::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::EVENT)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let enabled =
::tracing::Level::DEBUG <=
::tracing::level_filters::STATIC_MAX_LEVEL &&
::tracing::Level::DEBUG <=
::tracing::level_filters::LevelFilter::current() &&
{
let interest = __CALLSITE.interest();
!interest.is_never() &&
::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
interest)
};
if enabled {
(|value_set: ::tracing::field::ValueSet|
{
let meta = __CALLSITE.metadata();
::tracing::Event::dispatch(meta, &value_set);
;
})({
#[allow(unused_imports)]
use ::tracing::field::{debug, display, Value};
__CALLSITE.metadata().fields().value_set_all(&[(::tracing::__macro_support::Option::Some(&format_args!("Trying to parse {0:?} as {1}",
expr.kind, "place") as &dyn ::tracing::field::Value))])
});
} else { ; }
};
let expr = expr;
match &expr.kind {
ExprKind::Call { ty, fun: _, args: args, .. } if
{
match ty.kind() {
ty::FnDef(did, _) => {
self.tcx.is_diagnostic_item(rustc_span::sym::mir_field,
*did)
}
_ => false,
}
} => {
let (parent, place_ty) = self.parse_place_inner(args[0])?;
let field =
FieldIdx::from_u32(self.parse_integer_literal(args[1])? as
u32);
let field_ty =
PlaceTy::field_ty(self.tcx, place_ty.ty,
place_ty.variant_index, field).skip_norm_wip();
let proj = PlaceElem::Field(field, field_ty);
let place = parent.project_deeper(&[proj], self.tcx);
return Ok((place, PlaceTy::from_ty(field_ty)));
}
ExprKind::Call { ty, fun: _, args: args, .. } if
{
match ty.kind() {
ty::FnDef(did, _) => {
self.tcx.is_diagnostic_item(rustc_span::sym::mir_variant,
*did)
}
_ => false,
}
} => {
(args[0],
PlaceElem::Downcast(None,
VariantIdx::from_u32(self.parse_integer_literal(args[1])? as
u32)))
}
ExprKind::Deref { arg } => {
{
let expr_id = self.preparse(*arg);
let expr = &self.thir[expr_id];
{
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event /rustc-dev/923c95cdf5ba65cea505aa2ea829f578e1506ed8/compiler/rustc_mir_build/src/builder/custom/parse/instruction.rs:428",
"rustc_mir_build::builder::custom::parse::instruction",
::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("/rustc-dev/923c95cdf5ba65cea505aa2ea829f578e1506ed8/compiler/rustc_mir_build/src/builder/custom/parse/instruction.rs"),
::tracing_core::__macro_support::Option::Some(428u32),
::tracing_core::__macro_support::Option::Some("rustc_mir_build::builder::custom::parse::instruction"),
::tracing_core::field::FieldSet::new(&["message"],
::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::EVENT)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let enabled =
::tracing::Level::DEBUG <=
::tracing::level_filters::STATIC_MAX_LEVEL &&
::tracing::Level::DEBUG <=
::tracing::level_filters::LevelFilter::current() &&
{
let interest = __CALLSITE.interest();
!interest.is_never() &&
::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
interest)
};
if enabled {
(|value_set: ::tracing::field::ValueSet|
{
let meta = __CALLSITE.metadata();
::tracing::Event::dispatch(meta, &value_set);
;
})({
#[allow(unused_imports)]
use ::tracing::field::{debug, display, Value};
__CALLSITE.metadata().fields().value_set_all(&[(::tracing::__macro_support::Option::Some(&format_args!("Trying to parse {0:?} as {1}",
expr.kind, "does not matter") as
&dyn ::tracing::field::Value))])
});
} else { ; }
};
let _ = expr;
match &expr.kind {
ExprKind::Call { ty, fun: _, args: args, .. } if
{
match ty.kind() {
ty::FnDef(did, _) => {
self.tcx.is_diagnostic_item(rustc_span::sym::mir_make_place,
*did)
}
_ => false,
}
} => return self.parse_place_inner(args[0]),
_ =>
(*arg,
PlaceElem::Deref),
#[allow(unreachable_patterns)]
_ =>
return Err(self.expr_error(expr_id, "does not matter")),
}
}
}
ExprKind::Index { lhs, index } =>
(*lhs, PlaceElem::Index(self.parse_local(*index)?)),
ExprKind::Field { lhs, name: field, .. } =>
(*lhs, PlaceElem::Field(*field, expr.ty)),
_ => {
let place = self.parse_local(expr_id).map(Place::from)?;
return Ok((place, PlaceTy::from_ty(expr.ty)))
}
#[allow(unreachable_patterns)]
_ => return Err(self.expr_error(expr_id, "place")),
}
}parse_by_kind!(self, expr_id, expr, "place",
412 @call(mir_field, args) => {
413 let (parent, place_ty) = self.parse_place_inner(args[0])?;
414 let field = FieldIdx::from_u32(self.parse_integer_literal(args[1])? as u32);
415 let field_ty = PlaceTy::field_ty(self.tcx, place_ty.ty, place_ty.variant_index, field)
416 .skip_norm_wip();
417 let proj = PlaceElem::Field(field, field_ty);
418 let place = parent.project_deeper(&[proj], self.tcx);
419 return Ok((place, PlaceTy::from_ty(field_ty)));
420 },
421 @call(mir_variant, args) => {
422 (args[0], PlaceElem::Downcast(
423 None,
424 VariantIdx::from_u32(self.parse_integer_literal(args[1])? as u32)
425 ))
426 },
427 ExprKind::Deref { arg } => {
428 parse_by_kind!(self, *arg, _, "does not matter",
429 @call(mir_make_place, args) => return self.parse_place_inner(args[0]),
430 _ => (*arg, PlaceElem::Deref),
431 )
432 },
433 ExprKind::Index { lhs, index } => (*lhs, PlaceElem::Index(self.parse_local(*index)?)),
434 ExprKind::Field { lhs, name: field, .. } => (*lhs, PlaceElem::Field(*field, expr.ty)),
435 _ => {
436 let place = self.parse_local(expr_id).map(Place::from)?;
437 return Ok((place, PlaceTy::from_ty(expr.ty)))
438 },
439 );
440 let (parent, ty) = self.parse_place_inner(parent)?;
441 let place = parent.project_deeper(&[proj], self.tcx);
442 let ty = ty.projection_ty(self.tcx, proj);
443 Ok((place, ty))
444 }
445
446 fn parse_local(&self, expr_id: ExprId) -> PResult<Local> {
447 {
let expr_id = self.preparse(expr_id);
let expr = &self.thir[expr_id];
{
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event /rustc-dev/923c95cdf5ba65cea505aa2ea829f578e1506ed8/compiler/rustc_mir_build/src/builder/custom/parse/instruction.rs:447",
"rustc_mir_build::builder::custom::parse::instruction",
::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("/rustc-dev/923c95cdf5ba65cea505aa2ea829f578e1506ed8/compiler/rustc_mir_build/src/builder/custom/parse/instruction.rs"),
::tracing_core::__macro_support::Option::Some(447u32),
::tracing_core::__macro_support::Option::Some("rustc_mir_build::builder::custom::parse::instruction"),
::tracing_core::field::FieldSet::new(&["message"],
::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::EVENT)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let enabled =
::tracing::Level::DEBUG <=
::tracing::level_filters::STATIC_MAX_LEVEL &&
::tracing::Level::DEBUG <=
::tracing::level_filters::LevelFilter::current() &&
{
let interest = __CALLSITE.interest();
!interest.is_never() &&
::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
interest)
};
if enabled {
(|value_set: ::tracing::field::ValueSet|
{
let meta = __CALLSITE.metadata();
::tracing::Event::dispatch(meta, &value_set);
;
})({
#[allow(unused_imports)]
use ::tracing::field::{debug, display, Value};
__CALLSITE.metadata().fields().value_set_all(&[(::tracing::__macro_support::Option::Some(&format_args!("Trying to parse {0:?} as {1}",
expr.kind, "local") as &dyn ::tracing::field::Value))])
});
} else { ; }
};
let _ = expr;
match &expr.kind {
ExprKind::VarRef { id } =>
Ok(self.local_map[id]),
#[allow(unreachable_patterns)]
_ => return Err(self.expr_error(expr_id, "local")),
}
}parse_by_kind!(self, expr_id, _, "local",
448 ExprKind::VarRef { id } => Ok(self.local_map[id]),
449 )
450 }
451
452 fn parse_block(&self, expr_id: ExprId) -> PResult<BasicBlock> {
453 {
let expr_id = self.preparse(expr_id);
let expr = &self.thir[expr_id];
{
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event /rustc-dev/923c95cdf5ba65cea505aa2ea829f578e1506ed8/compiler/rustc_mir_build/src/builder/custom/parse/instruction.rs:453",
"rustc_mir_build::builder::custom::parse::instruction",
::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("/rustc-dev/923c95cdf5ba65cea505aa2ea829f578e1506ed8/compiler/rustc_mir_build/src/builder/custom/parse/instruction.rs"),
::tracing_core::__macro_support::Option::Some(453u32),
::tracing_core::__macro_support::Option::Some("rustc_mir_build::builder::custom::parse::instruction"),
::tracing_core::field::FieldSet::new(&["message"],
::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::EVENT)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let enabled =
::tracing::Level::DEBUG <=
::tracing::level_filters::STATIC_MAX_LEVEL &&
::tracing::Level::DEBUG <=
::tracing::level_filters::LevelFilter::current() &&
{
let interest = __CALLSITE.interest();
!interest.is_never() &&
::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
interest)
};
if enabled {
(|value_set: ::tracing::field::ValueSet|
{
let meta = __CALLSITE.metadata();
::tracing::Event::dispatch(meta, &value_set);
;
})({
#[allow(unused_imports)]
use ::tracing::field::{debug, display, Value};
__CALLSITE.metadata().fields().value_set_all(&[(::tracing::__macro_support::Option::Some(&format_args!("Trying to parse {0:?} as {1}",
expr.kind, "basic block") as
&dyn ::tracing::field::Value))])
});
} else { ; }
};
let _ = expr;
match &expr.kind {
ExprKind::VarRef { id } =>
Ok(self.block_map[id]),
#[allow(unreachable_patterns)]
_ => return Err(self.expr_error(expr_id, "basic block")),
}
}parse_by_kind!(self, expr_id, _, "basic block",
454 ExprKind::VarRef { id } => Ok(self.block_map[id]),
455 )
456 }
457
458 fn parse_static(&self, expr_id: ExprId) -> PResult<Operand<'tcx>> {
459 let expr_id = {
let expr_id = self.preparse(expr_id);
let expr = &self.thir[expr_id];
{
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event /rustc-dev/923c95cdf5ba65cea505aa2ea829f578e1506ed8/compiler/rustc_mir_build/src/builder/custom/parse/instruction.rs:459",
"rustc_mir_build::builder::custom::parse::instruction",
::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("/rustc-dev/923c95cdf5ba65cea505aa2ea829f578e1506ed8/compiler/rustc_mir_build/src/builder/custom/parse/instruction.rs"),
::tracing_core::__macro_support::Option::Some(459u32),
::tracing_core::__macro_support::Option::Some("rustc_mir_build::builder::custom::parse::instruction"),
::tracing_core::field::FieldSet::new(&["message"],
::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::EVENT)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let enabled =
::tracing::Level::DEBUG <=
::tracing::level_filters::STATIC_MAX_LEVEL &&
::tracing::Level::DEBUG <=
::tracing::level_filters::LevelFilter::current() &&
{
let interest = __CALLSITE.interest();
!interest.is_never() &&
::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
interest)
};
if enabled {
(|value_set: ::tracing::field::ValueSet|
{
let meta = __CALLSITE.metadata();
::tracing::Event::dispatch(meta, &value_set);
;
})({
#[allow(unused_imports)]
use ::tracing::field::{debug, display, Value};
__CALLSITE.metadata().fields().value_set_all(&[(::tracing::__macro_support::Option::Some(&format_args!("Trying to parse {0:?} as {1}",
expr.kind, "static") as &dyn ::tracing::field::Value))])
});
} else { ; }
};
let _ = expr;
match &expr.kind {
ExprKind::Deref { arg } =>
*arg,
#[allow(unreachable_patterns)]
_ => return Err(self.expr_error(expr_id, "static")),
}
}parse_by_kind!(self, expr_id, _, "static",
460 ExprKind::Deref { arg } => *arg,
461 );
462
463 {
let expr_id = self.preparse(expr_id);
let expr = &self.thir[expr_id];
{
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event /rustc-dev/923c95cdf5ba65cea505aa2ea829f578e1506ed8/compiler/rustc_mir_build/src/builder/custom/parse/instruction.rs:463",
"rustc_mir_build::builder::custom::parse::instruction",
::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("/rustc-dev/923c95cdf5ba65cea505aa2ea829f578e1506ed8/compiler/rustc_mir_build/src/builder/custom/parse/instruction.rs"),
::tracing_core::__macro_support::Option::Some(463u32),
::tracing_core::__macro_support::Option::Some("rustc_mir_build::builder::custom::parse::instruction"),
::tracing_core::field::FieldSet::new(&["message"],
::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::EVENT)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let enabled =
::tracing::Level::DEBUG <=
::tracing::level_filters::STATIC_MAX_LEVEL &&
::tracing::Level::DEBUG <=
::tracing::level_filters::LevelFilter::current() &&
{
let interest = __CALLSITE.interest();
!interest.is_never() &&
::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
interest)
};
if enabled {
(|value_set: ::tracing::field::ValueSet|
{
let meta = __CALLSITE.metadata();
::tracing::Event::dispatch(meta, &value_set);
;
})({
#[allow(unused_imports)]
use ::tracing::field::{debug, display, Value};
__CALLSITE.metadata().fields().value_set_all(&[(::tracing::__macro_support::Option::Some(&format_args!("Trying to parse {0:?} as {1}",
expr.kind, "static") as &dyn ::tracing::field::Value))])
});
} else { ; }
};
let expr = expr;
match &expr.kind {
ExprKind::StaticRef { alloc_id, ty, .. } => {
let const_val =
ConstValue::Scalar(Scalar::from_pointer((*alloc_id).into(),
&self.tcx));
let const_ = Const::Val(const_val, *ty);
Ok(Operand::Constant(Box::new(ConstOperand {
span: expr.span,
user_ty: None,
const_,
})))
}
#[allow(unreachable_patterns)]
_ => return Err(self.expr_error(expr_id, "static")),
}
}parse_by_kind!(self, expr_id, expr, "static",
464 ExprKind::StaticRef { alloc_id, ty, .. } => {
465 let const_val =
466 ConstValue::Scalar(Scalar::from_pointer((*alloc_id).into(), &self.tcx));
467 let const_ = Const::Val(const_val, *ty);
468
469 Ok(Operand::Constant(Box::new(ConstOperand {
470 span: expr.span,
471 user_ty: None,
472 const_
473 })))
474 },
475 )
476 }
477
478 fn parse_integer_literal(&self, expr_id: ExprId) -> PResult<u128> {
479 {
let expr_id = self.preparse(expr_id);
let expr = &self.thir[expr_id];
{
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event /rustc-dev/923c95cdf5ba65cea505aa2ea829f578e1506ed8/compiler/rustc_mir_build/src/builder/custom/parse/instruction.rs:479",
"rustc_mir_build::builder::custom::parse::instruction",
::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("/rustc-dev/923c95cdf5ba65cea505aa2ea829f578e1506ed8/compiler/rustc_mir_build/src/builder/custom/parse/instruction.rs"),
::tracing_core::__macro_support::Option::Some(479u32),
::tracing_core::__macro_support::Option::Some("rustc_mir_build::builder::custom::parse::instruction"),
::tracing_core::field::FieldSet::new(&["message"],
::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::EVENT)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let enabled =
::tracing::Level::DEBUG <=
::tracing::level_filters::STATIC_MAX_LEVEL &&
::tracing::Level::DEBUG <=
::tracing::level_filters::LevelFilter::current() &&
{
let interest = __CALLSITE.interest();
!interest.is_never() &&
::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
interest)
};
if enabled {
(|value_set: ::tracing::field::ValueSet|
{
let meta = __CALLSITE.metadata();
::tracing::Event::dispatch(meta, &value_set);
;
})({
#[allow(unused_imports)]
use ::tracing::field::{debug, display, Value};
__CALLSITE.metadata().fields().value_set_all(&[(::tracing::__macro_support::Option::Some(&format_args!("Trying to parse {0:?} as {1}",
expr.kind, "constant") as &dyn ::tracing::field::Value))])
});
} else { ; }
};
let expr = expr;
match &expr.kind {
ExprKind::Literal { .. } | ExprKind::NamedConst { .. } |
ExprKind::NonHirLiteral { .. } | ExprKind::ConstBlock { .. } =>
Ok({
let value = as_constant_inner(expr, |_| None, self.tcx);
value.const_.eval_bits(self.tcx, self.typing_env)
}),
#[allow(unreachable_patterns)]
_ => return Err(self.expr_error(expr_id, "constant")),
}
}parse_by_kind!(self, expr_id, expr, "constant",
480 ExprKind::Literal { .. }
481 | ExprKind::NamedConst { .. }
482 | ExprKind::NonHirLiteral { .. }
483 | ExprKind::ConstBlock { .. } => Ok({
484 let value = as_constant_inner(expr, |_| None, self.tcx);
485 value.const_.eval_bits(self.tcx, self.typing_env)
486 }),
487 )
488 }
489}