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