mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-23 07:14:28 +00:00
Remove in_band_lifetimes
from rustc_mir_transform
This one is a heavy `'tcx` user. Two interesting ones: This one had the `'tcx` declared on the function, despite the trait taking a `'tcx`: ```diff -impl Visitor<'_> for UsedLocals { +impl<'tcx> Visitor<'tcx> for UsedLocals { fn visit_statement(&mut self, statement: &Statement<'tcx>, location: Location) { ``` This one use in-band for one, and underscore for the other: ```diff -pub fn remove_dead_blocks(tcx: TyCtxt<'tcx>, body: &mut Body<'_>) { +pub fn remove_dead_blocks<'tcx>(tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) { ```
This commit is contained in:
parent
0b6f079e49
commit
a124924061
@ -34,7 +34,7 @@ fn is_stable(place: PlaceRef<'_>) -> bool {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Determine whether this type may be a reference (or box), and thus needs retagging.
|
/// Determine whether this type may be a reference (or box), and thus needs retagging.
|
||||||
fn may_be_reference(ty: Ty<'tcx>) -> bool {
|
fn may_be_reference(ty: Ty<'_>) -> bool {
|
||||||
match ty.kind() {
|
match ty.kind() {
|
||||||
// Primitive types that are not references
|
// Primitive types that are not references
|
||||||
ty::Bool
|
ty::Bool
|
||||||
|
@ -23,7 +23,7 @@ struct ConstMutationChecker<'a, 'tcx> {
|
|||||||
target_local: Option<Local>,
|
target_local: Option<Local>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a, 'tcx> ConstMutationChecker<'a, 'tcx> {
|
impl<'tcx> ConstMutationChecker<'_, 'tcx> {
|
||||||
fn is_const_item(&self, local: Local) -> Option<DefId> {
|
fn is_const_item(&self, local: Local) -> Option<DefId> {
|
||||||
if let Some(box LocalInfo::ConstRef { def_id }) = self.body.local_decls[local].local_info {
|
if let Some(box LocalInfo::ConstRef { def_id }) = self.body.local_decls[local].local_info {
|
||||||
Some(def_id)
|
Some(def_id)
|
||||||
@ -95,7 +95,7 @@ impl<'a, 'tcx> ConstMutationChecker<'a, 'tcx> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a, 'tcx> Visitor<'tcx> for ConstMutationChecker<'a, 'tcx> {
|
impl<'tcx> Visitor<'tcx> for ConstMutationChecker<'_, 'tcx> {
|
||||||
fn visit_statement(&mut self, stmt: &Statement<'tcx>, loc: Location) {
|
fn visit_statement(&mut self, stmt: &Statement<'tcx>, loc: Location) {
|
||||||
if let StatementKind::Assign(box (lhs, _)) = &stmt.kind {
|
if let StatementKind::Assign(box (lhs, _)) = &stmt.kind {
|
||||||
// Check for assignment to fields of a constant
|
// Check for assignment to fields of a constant
|
||||||
|
@ -66,7 +66,7 @@ fn builtin_derive_def_id(tcx: TyCtxt<'_>, def_id: DefId) -> Option<DefId> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a, 'tcx> Visitor<'tcx> for PackedRefChecker<'a, 'tcx> {
|
impl<'tcx> Visitor<'tcx> for PackedRefChecker<'_, 'tcx> {
|
||||||
fn visit_terminator(&mut self, terminator: &Terminator<'tcx>, location: Location) {
|
fn visit_terminator(&mut self, terminator: &Terminator<'tcx>, location: Location) {
|
||||||
// Make sure we know where in the MIR we are.
|
// Make sure we know where in the MIR we are.
|
||||||
self.source_info = terminator.source_info;
|
self.source_info = terminator.source_info;
|
||||||
|
@ -46,7 +46,7 @@ impl<'a, 'tcx> UnsafetyChecker<'a, 'tcx> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a, 'tcx> Visitor<'tcx> for UnsafetyChecker<'a, 'tcx> {
|
impl<'tcx> Visitor<'tcx> for UnsafetyChecker<'_, 'tcx> {
|
||||||
fn visit_terminator(&mut self, terminator: &Terminator<'tcx>, location: Location) {
|
fn visit_terminator(&mut self, terminator: &Terminator<'tcx>, location: Location) {
|
||||||
self.source_info = terminator.source_info;
|
self.source_info = terminator.source_info;
|
||||||
match terminator.kind {
|
match terminator.kind {
|
||||||
@ -244,7 +244,7 @@ impl<'a, 'tcx> Visitor<'tcx> for UnsafetyChecker<'a, 'tcx> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a, 'tcx> UnsafetyChecker<'a, 'tcx> {
|
impl<'tcx> UnsafetyChecker<'_, 'tcx> {
|
||||||
fn require_unsafe(&mut self, kind: UnsafetyViolationKind, details: UnsafetyViolationDetails) {
|
fn require_unsafe(&mut self, kind: UnsafetyViolationKind, details: UnsafetyViolationDetails) {
|
||||||
// Violations can turn out to be `UnsafeFn` during analysis, but they should not start out as such.
|
// Violations can turn out to be `UnsafeFn` during analysis, but they should not start out as such.
|
||||||
assert_ne!(kind, UnsafetyViolationKind::UnsafeFn);
|
assert_ne!(kind, UnsafetyViolationKind::UnsafeFn);
|
||||||
@ -397,7 +397,7 @@ struct UnusedUnsafeVisitor<'a> {
|
|||||||
unsafe_blocks: &'a mut Vec<(hir::HirId, bool)>,
|
unsafe_blocks: &'a mut Vec<(hir::HirId, bool)>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a, 'tcx> intravisit::Visitor<'tcx> for UnusedUnsafeVisitor<'a> {
|
impl<'tcx> intravisit::Visitor<'tcx> for UnusedUnsafeVisitor<'_> {
|
||||||
type Map = intravisit::ErasedMap<'tcx>;
|
type Map = intravisit::ErasedMap<'tcx>;
|
||||||
|
|
||||||
fn nested_visit_map(&mut self) -> intravisit::NestedVisitorMap<Self::Map> {
|
fn nested_visit_map(&mut self) -> intravisit::NestedVisitorMap<Self::Map> {
|
||||||
|
@ -89,7 +89,7 @@ fn find_optimization_oportunities<'tcx>(body: &Body<'tcx>) -> Vec<(Local, Consta
|
|||||||
eligable_locals
|
eligable_locals
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'tcx> Visitor<'tcx> for LocalUseVisitor {
|
impl Visitor<'_> for LocalUseVisitor {
|
||||||
fn visit_local(&mut self, local: &Local, context: PlaceContext, location: Location) {
|
fn visit_local(&mut self, local: &Local, context: PlaceContext, location: Location) {
|
||||||
if context.is_mutating_use() {
|
if context.is_mutating_use() {
|
||||||
self.local_mutating_uses[*local] = self.local_mutating_uses[*local].saturating_add(1);
|
self.local_mutating_uses[*local] = self.local_mutating_uses[*local].saturating_add(1);
|
||||||
|
@ -54,7 +54,7 @@ impl<'tcx> MirPass<'tcx> for ConstGoto {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a, 'tcx> Visitor<'tcx> for ConstGotoOptimizationFinder<'a, 'tcx> {
|
impl<'tcx> Visitor<'tcx> for ConstGotoOptimizationFinder<'_, 'tcx> {
|
||||||
fn visit_terminator(&mut self, terminator: &Terminator<'tcx>, location: Location) {
|
fn visit_terminator(&mut self, terminator: &Terminator<'tcx>, location: Location) {
|
||||||
let _: Option<_> = try {
|
let _: Option<_> = try {
|
||||||
let target = terminator.kind.as_goto()?;
|
let target = terminator.kind.as_goto()?;
|
||||||
|
@ -171,7 +171,7 @@ struct ConstPropMachine<'mir, 'tcx> {
|
|||||||
can_const_prop: IndexVec<Local, ConstPropMode>,
|
can_const_prop: IndexVec<Local, ConstPropMode>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'mir, 'tcx> ConstPropMachine<'mir, 'tcx> {
|
impl ConstPropMachine<'_, '_> {
|
||||||
fn new(
|
fn new(
|
||||||
only_propagate_inside_block_locals: BitSet<Local>,
|
only_propagate_inside_block_locals: BitSet<Local>,
|
||||||
can_const_prop: IndexVec<Local, ConstPropMode>,
|
can_const_prop: IndexVec<Local, ConstPropMode>,
|
||||||
@ -308,14 +308,14 @@ impl<'mir, 'tcx> interpret::Machine<'mir, 'tcx> for ConstPropMachine<'mir, 'tcx>
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
fn stack(
|
fn stack<'a>(
|
||||||
ecx: &'a InterpCx<'mir, 'tcx, Self>,
|
ecx: &'a InterpCx<'mir, 'tcx, Self>,
|
||||||
) -> &'a [Frame<'mir, 'tcx, Self::PointerTag, Self::FrameExtra>] {
|
) -> &'a [Frame<'mir, 'tcx, Self::PointerTag, Self::FrameExtra>] {
|
||||||
&ecx.machine.stack
|
&ecx.machine.stack
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
fn stack_mut(
|
fn stack_mut<'a>(
|
||||||
ecx: &'a mut InterpCx<'mir, 'tcx, Self>,
|
ecx: &'a mut InterpCx<'mir, 'tcx, Self>,
|
||||||
) -> &'a mut Vec<Frame<'mir, 'tcx, Self::PointerTag, Self::FrameExtra>> {
|
) -> &'a mut Vec<Frame<'mir, 'tcx, Self::PointerTag, Self::FrameExtra>> {
|
||||||
&mut ecx.machine.stack
|
&mut ecx.machine.stack
|
||||||
@ -336,7 +336,7 @@ struct ConstPropagator<'mir, 'tcx> {
|
|||||||
source_info: Option<SourceInfo>,
|
source_info: Option<SourceInfo>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'mir, 'tcx> LayoutOfHelpers<'tcx> for ConstPropagator<'mir, 'tcx> {
|
impl<'tcx> LayoutOfHelpers<'tcx> for ConstPropagator<'_, 'tcx> {
|
||||||
type LayoutOfResult = Result<TyAndLayout<'tcx>, LayoutError<'tcx>>;
|
type LayoutOfResult = Result<TyAndLayout<'tcx>, LayoutError<'tcx>>;
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
@ -345,21 +345,21 @@ impl<'mir, 'tcx> LayoutOfHelpers<'tcx> for ConstPropagator<'mir, 'tcx> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'mir, 'tcx> HasDataLayout for ConstPropagator<'mir, 'tcx> {
|
impl HasDataLayout for ConstPropagator<'_, '_> {
|
||||||
#[inline]
|
#[inline]
|
||||||
fn data_layout(&self) -> &TargetDataLayout {
|
fn data_layout(&self) -> &TargetDataLayout {
|
||||||
&self.tcx.data_layout
|
&self.tcx.data_layout
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'mir, 'tcx> ty::layout::HasTyCtxt<'tcx> for ConstPropagator<'mir, 'tcx> {
|
impl<'tcx> ty::layout::HasTyCtxt<'tcx> for ConstPropagator<'_, 'tcx> {
|
||||||
#[inline]
|
#[inline]
|
||||||
fn tcx(&self) -> TyCtxt<'tcx> {
|
fn tcx(&self) -> TyCtxt<'tcx> {
|
||||||
self.tcx
|
self.tcx
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'mir, 'tcx> ty::layout::HasParamEnv<'tcx> for ConstPropagator<'mir, 'tcx> {
|
impl<'tcx> ty::layout::HasParamEnv<'tcx> for ConstPropagator<'_, 'tcx> {
|
||||||
#[inline]
|
#[inline]
|
||||||
fn param_env(&self) -> ty::ParamEnv<'tcx> {
|
fn param_env(&self) -> ty::ParamEnv<'tcx> {
|
||||||
self.param_env
|
self.param_env
|
||||||
@ -971,7 +971,7 @@ struct CanConstProp {
|
|||||||
|
|
||||||
impl CanConstProp {
|
impl CanConstProp {
|
||||||
/// Returns true if `local` can be propagated
|
/// Returns true if `local` can be propagated
|
||||||
fn check(
|
fn check<'tcx>(
|
||||||
tcx: TyCtxt<'tcx>,
|
tcx: TyCtxt<'tcx>,
|
||||||
param_env: ParamEnv<'tcx>,
|
param_env: ParamEnv<'tcx>,
|
||||||
body: &Body<'tcx>,
|
body: &Body<'tcx>,
|
||||||
@ -1019,7 +1019,7 @@ impl CanConstProp {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'tcx> Visitor<'tcx> for CanConstProp {
|
impl Visitor<'_> for CanConstProp {
|
||||||
fn visit_local(&mut self, &local: &Local, context: PlaceContext, _: Location) {
|
fn visit_local(&mut self, &local: &Local, context: PlaceContext, _: Location) {
|
||||||
use rustc_middle::mir::visit::PlaceContext::*;
|
use rustc_middle::mir::visit::PlaceContext::*;
|
||||||
match context {
|
match context {
|
||||||
@ -1079,7 +1079,7 @@ impl<'tcx> Visitor<'tcx> for CanConstProp {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'mir, 'tcx> MutVisitor<'tcx> for ConstPropagator<'mir, 'tcx> {
|
impl<'tcx> MutVisitor<'tcx> for ConstPropagator<'_, 'tcx> {
|
||||||
fn tcx(&self) -> TyCtxt<'tcx> {
|
fn tcx(&self) -> TyCtxt<'tcx> {
|
||||||
self.tcx
|
self.tcx
|
||||||
}
|
}
|
||||||
|
@ -629,7 +629,7 @@ impl UsedExpressions {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Generates the MIR pass `CoverageSpan`-specific spanview dump file.
|
/// Generates the MIR pass `CoverageSpan`-specific spanview dump file.
|
||||||
pub(super) fn dump_coverage_spanview(
|
pub(super) fn dump_coverage_spanview<'tcx>(
|
||||||
tcx: TyCtxt<'tcx>,
|
tcx: TyCtxt<'tcx>,
|
||||||
mir_body: &mir::Body<'tcx>,
|
mir_body: &mir::Body<'tcx>,
|
||||||
basic_coverage_blocks: &CoverageGraph,
|
basic_coverage_blocks: &CoverageGraph,
|
||||||
@ -651,7 +651,7 @@ pub(super) fn dump_coverage_spanview(
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Converts the computed `BasicCoverageBlockData`s into `SpanViewable`s.
|
/// Converts the computed `BasicCoverageBlockData`s into `SpanViewable`s.
|
||||||
fn span_viewables(
|
fn span_viewables<'tcx>(
|
||||||
tcx: TyCtxt<'tcx>,
|
tcx: TyCtxt<'tcx>,
|
||||||
mir_body: &mir::Body<'tcx>,
|
mir_body: &mir::Body<'tcx>,
|
||||||
basic_coverage_blocks: &CoverageGraph,
|
basic_coverage_blocks: &CoverageGraph,
|
||||||
@ -670,7 +670,7 @@ fn span_viewables(
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Generates the MIR pass coverage-specific graphviz dump file.
|
/// Generates the MIR pass coverage-specific graphviz dump file.
|
||||||
pub(super) fn dump_coverage_graphviz(
|
pub(super) fn dump_coverage_graphviz<'tcx>(
|
||||||
tcx: TyCtxt<'tcx>,
|
tcx: TyCtxt<'tcx>,
|
||||||
mir_body: &mir::Body<'tcx>,
|
mir_body: &mir::Body<'tcx>,
|
||||||
pass_name: &str,
|
pass_name: &str,
|
||||||
@ -750,7 +750,7 @@ pub(super) fn dump_coverage_graphviz(
|
|||||||
.expect("Unexpected error writing BasicCoverageBlock graphviz DOT file");
|
.expect("Unexpected error writing BasicCoverageBlock graphviz DOT file");
|
||||||
}
|
}
|
||||||
|
|
||||||
fn bcb_to_string_sections(
|
fn bcb_to_string_sections<'tcx>(
|
||||||
tcx: TyCtxt<'tcx>,
|
tcx: TyCtxt<'tcx>,
|
||||||
mir_body: &mir::Body<'tcx>,
|
mir_body: &mir::Body<'tcx>,
|
||||||
debug_counters: &DebugCounters,
|
debug_counters: &DebugCounters,
|
||||||
@ -817,7 +817,7 @@ fn bcb_to_string_sections(
|
|||||||
|
|
||||||
/// Returns a simple string representation of a `TerminatorKind` variant, independent of any
|
/// Returns a simple string representation of a `TerminatorKind` variant, independent of any
|
||||||
/// values it might hold.
|
/// values it might hold.
|
||||||
pub(super) fn term_type(kind: &TerminatorKind<'tcx>) -> &'static str {
|
pub(super) fn term_type(kind: &TerminatorKind<'_>) -> &'static str {
|
||||||
match kind {
|
match kind {
|
||||||
TerminatorKind::Goto { .. } => "Goto",
|
TerminatorKind::Goto { .. } => "Goto",
|
||||||
TerminatorKind::SwitchInt { .. } => "SwitchInt",
|
TerminatorKind::SwitchInt { .. } => "SwitchInt",
|
||||||
|
@ -27,7 +27,7 @@ pub(super) struct CoverageGraph {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl CoverageGraph {
|
impl CoverageGraph {
|
||||||
pub fn from_mir(mir_body: &mir::Body<'tcx>) -> Self {
|
pub fn from_mir(mir_body: &mir::Body<'_>) -> Self {
|
||||||
let (bcbs, bb_to_bcb) = Self::compute_basic_coverage_blocks(mir_body);
|
let (bcbs, bb_to_bcb) = Self::compute_basic_coverage_blocks(mir_body);
|
||||||
|
|
||||||
// Pre-transform MIR `BasicBlock` successors and predecessors into the BasicCoverageBlock
|
// Pre-transform MIR `BasicBlock` successors and predecessors into the BasicCoverageBlock
|
||||||
@ -74,7 +74,7 @@ impl CoverageGraph {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn compute_basic_coverage_blocks(
|
fn compute_basic_coverage_blocks(
|
||||||
mir_body: &mir::Body<'tcx>,
|
mir_body: &mir::Body<'_>,
|
||||||
) -> (
|
) -> (
|
||||||
IndexVec<BasicCoverageBlock, BasicCoverageBlockData>,
|
IndexVec<BasicCoverageBlock, BasicCoverageBlockData>,
|
||||||
IndexVec<BasicBlock, Option<BasicCoverageBlock>>,
|
IndexVec<BasicBlock, Option<BasicCoverageBlock>>,
|
||||||
@ -267,7 +267,7 @@ impl graph::WithSuccessors for CoverageGraph {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl graph::GraphPredecessors<'graph> for CoverageGraph {
|
impl<'graph> graph::GraphPredecessors<'graph> for CoverageGraph {
|
||||||
type Item = BasicCoverageBlock;
|
type Item = BasicCoverageBlock;
|
||||||
type Iter = std::iter::Copied<std::slice::Iter<'graph, BasicCoverageBlock>>;
|
type Iter = std::iter::Copied<std::slice::Iter<'graph, BasicCoverageBlock>>;
|
||||||
}
|
}
|
||||||
|
@ -443,7 +443,7 @@ impl<'a, 'tcx> Instrumentor<'a, 'tcx> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn inject_edge_counter_basic_block(
|
fn inject_edge_counter_basic_block(
|
||||||
mir_body: &mut mir::Body<'tcx>,
|
mir_body: &mut mir::Body<'_>,
|
||||||
from_bb: BasicBlock,
|
from_bb: BasicBlock,
|
||||||
to_bb: BasicBlock,
|
to_bb: BasicBlock,
|
||||||
) -> BasicBlock {
|
) -> BasicBlock {
|
||||||
@ -466,7 +466,7 @@ fn inject_edge_counter_basic_block(
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn inject_statement(
|
fn inject_statement(
|
||||||
mir_body: &mut mir::Body<'tcx>,
|
mir_body: &mut mir::Body<'_>,
|
||||||
counter_kind: CoverageKind,
|
counter_kind: CoverageKind,
|
||||||
bb: BasicBlock,
|
bb: BasicBlock,
|
||||||
some_code_region: Option<CodeRegion>,
|
some_code_region: Option<CodeRegion>,
|
||||||
@ -488,7 +488,7 @@ fn inject_statement(
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Non-code expressions are injected into the coverage map, without generating executable code.
|
// Non-code expressions are injected into the coverage map, without generating executable code.
|
||||||
fn inject_intermediate_expression(mir_body: &mut mir::Body<'tcx>, expression: CoverageKind) {
|
fn inject_intermediate_expression(mir_body: &mut mir::Body<'_>, expression: CoverageKind) {
|
||||||
debug_assert!(matches!(expression, CoverageKind::Expression { .. }));
|
debug_assert!(matches!(expression, CoverageKind::Expression { .. }));
|
||||||
debug!(" injecting non-code expression {:?}", expression);
|
debug!(" injecting non-code expression {:?}", expression);
|
||||||
let inject_in_bb = mir::START_BLOCK;
|
let inject_in_bb = mir::START_BLOCK;
|
||||||
|
@ -137,7 +137,7 @@ fn coverageinfo<'tcx>(tcx: TyCtxt<'tcx>, instance_def: ty::InstanceDef<'tcx>) ->
|
|||||||
coverage_visitor.info
|
coverage_visitor.info
|
||||||
}
|
}
|
||||||
|
|
||||||
fn covered_file_name<'tcx>(tcx: TyCtxt<'tcx>, def_id: DefId) -> Option<Symbol> {
|
fn covered_file_name(tcx: TyCtxt<'_>, def_id: DefId) -> Option<Symbol> {
|
||||||
if tcx.is_mir_available(def_id) {
|
if tcx.is_mir_available(def_id) {
|
||||||
let body = mir_body(tcx, def_id);
|
let body = mir_body(tcx, def_id);
|
||||||
for bb_data in body.basic_blocks().iter() {
|
for bb_data in body.basic_blocks().iter() {
|
||||||
|
@ -21,7 +21,7 @@ pub(super) enum CoverageStatement {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl CoverageStatement {
|
impl CoverageStatement {
|
||||||
pub fn format(&self, tcx: TyCtxt<'tcx>, mir_body: &'a mir::Body<'tcx>) -> String {
|
pub fn format<'tcx>(&self, tcx: TyCtxt<'tcx>, mir_body: &mir::Body<'tcx>) -> String {
|
||||||
match *self {
|
match *self {
|
||||||
Self::Statement(bb, span, stmt_index) => {
|
Self::Statement(bb, span, stmt_index) => {
|
||||||
let stmt = &mir_body[bb].statements[stmt_index];
|
let stmt = &mir_body[bb].statements[stmt_index];
|
||||||
@ -86,7 +86,7 @@ impl CoverageSpan {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn for_statement(
|
pub fn for_statement(
|
||||||
statement: &Statement<'tcx>,
|
statement: &Statement<'_>,
|
||||||
span: Span,
|
span: Span,
|
||||||
expn_span: Span,
|
expn_span: Span,
|
||||||
bcb: BasicCoverageBlock,
|
bcb: BasicCoverageBlock,
|
||||||
@ -151,7 +151,7 @@ impl CoverageSpan {
|
|||||||
self.bcb == other.bcb
|
self.bcb == other.bcb
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn format(&self, tcx: TyCtxt<'tcx>, mir_body: &'a mir::Body<'tcx>) -> String {
|
pub fn format<'tcx>(&self, tcx: TyCtxt<'tcx>, mir_body: &mir::Body<'tcx>) -> String {
|
||||||
format!(
|
format!(
|
||||||
"{}\n {}",
|
"{}\n {}",
|
||||||
source_range_no_file(tcx, &self.span),
|
source_range_no_file(tcx, &self.span),
|
||||||
@ -159,10 +159,10 @@ impl CoverageSpan {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn format_coverage_statements(
|
pub fn format_coverage_statements<'tcx>(
|
||||||
&self,
|
&self,
|
||||||
tcx: TyCtxt<'tcx>,
|
tcx: TyCtxt<'tcx>,
|
||||||
mir_body: &'a mir::Body<'tcx>,
|
mir_body: &mir::Body<'tcx>,
|
||||||
) -> String {
|
) -> String {
|
||||||
let mut sorted_coverage_statements = self.coverage_statements.clone();
|
let mut sorted_coverage_statements = self.coverage_statements.clone();
|
||||||
sorted_coverage_statements.sort_unstable_by_key(|covstmt| match *covstmt {
|
sorted_coverage_statements.sort_unstable_by_key(|covstmt| match *covstmt {
|
||||||
@ -803,7 +803,7 @@ impl<'a, 'tcx> CoverageSpans<'a, 'tcx> {
|
|||||||
|
|
||||||
/// If the MIR `Statement` has a span contributive to computing coverage spans,
|
/// If the MIR `Statement` has a span contributive to computing coverage spans,
|
||||||
/// return it; otherwise return `None`.
|
/// return it; otherwise return `None`.
|
||||||
pub(super) fn filtered_statement_span(statement: &'a Statement<'tcx>) -> Option<Span> {
|
pub(super) fn filtered_statement_span(statement: &Statement<'_>) -> Option<Span> {
|
||||||
match statement.kind {
|
match statement.kind {
|
||||||
// These statements have spans that are often outside the scope of the executed source code
|
// These statements have spans that are often outside the scope of the executed source code
|
||||||
// for their parent `BasicBlock`.
|
// for their parent `BasicBlock`.
|
||||||
@ -847,7 +847,7 @@ pub(super) fn filtered_statement_span(statement: &'a Statement<'tcx>) -> Option<
|
|||||||
|
|
||||||
/// If the MIR `Terminator` has a span contributive to computing coverage spans,
|
/// If the MIR `Terminator` has a span contributive to computing coverage spans,
|
||||||
/// return it; otherwise return `None`.
|
/// return it; otherwise return `None`.
|
||||||
pub(super) fn filtered_terminator_span(terminator: &'a Terminator<'tcx>) -> Option<Span> {
|
pub(super) fn filtered_terminator_span(terminator: &Terminator<'_>) -> Option<Span> {
|
||||||
match terminator.kind {
|
match terminator.kind {
|
||||||
// These terminators have spans that don't positively contribute to computing a reasonable
|
// These terminators have spans that don't positively contribute to computing a reasonable
|
||||||
// span of actually executed source code. (For example, SwitchInt terminators extracted from
|
// span of actually executed source code. (For example, SwitchInt terminators extracted from
|
||||||
|
@ -180,7 +180,7 @@ impl<'tcx> MockBlocks<'tcx> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn debug_basic_blocks(mir_body: &Body<'tcx>) -> String {
|
fn debug_basic_blocks<'tcx>(mir_body: &Body<'tcx>) -> String {
|
||||||
format!(
|
format!(
|
||||||
"{:?}",
|
"{:?}",
|
||||||
mir_body
|
mir_body
|
||||||
@ -273,7 +273,7 @@ fn print_coverage_graphviz(
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Create a mock `Body` with a simple flow.
|
/// Create a mock `Body` with a simple flow.
|
||||||
fn goto_switchint() -> Body<'a> {
|
fn goto_switchint<'a>() -> Body<'a> {
|
||||||
let mut blocks = MockBlocks::new();
|
let mut blocks = MockBlocks::new();
|
||||||
let start = blocks.call(None);
|
let start = blocks.call(None);
|
||||||
let goto = blocks.goto(Some(start));
|
let goto = blocks.goto(Some(start));
|
||||||
@ -363,7 +363,7 @@ fn test_covgraph_goto_switchint() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Create a mock `Body` with a loop.
|
/// Create a mock `Body` with a loop.
|
||||||
fn switchint_then_loop_else_return() -> Body<'a> {
|
fn switchint_then_loop_else_return<'a>() -> Body<'a> {
|
||||||
let mut blocks = MockBlocks::new();
|
let mut blocks = MockBlocks::new();
|
||||||
let start = blocks.call(None);
|
let start = blocks.call(None);
|
||||||
let switchint = blocks.switchint(Some(start));
|
let switchint = blocks.switchint(Some(start));
|
||||||
@ -449,7 +449,7 @@ fn test_covgraph_switchint_then_loop_else_return() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Create a mock `Body` with nested loops.
|
/// Create a mock `Body` with nested loops.
|
||||||
fn switchint_loop_then_inner_loop_else_break() -> Body<'a> {
|
fn switchint_loop_then_inner_loop_else_break<'a>() -> Body<'a> {
|
||||||
let mut blocks = MockBlocks::new();
|
let mut blocks = MockBlocks::new();
|
||||||
let start = blocks.call(None);
|
let start = blocks.call(None);
|
||||||
let switchint = blocks.switchint(Some(start));
|
let switchint = blocks.switchint(Some(start));
|
||||||
|
@ -54,7 +54,7 @@ impl<'tcx> MutVisitor<'tcx> for OptApplier<'tcx> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn find_duplicates<'a, 'tcx>(body: &'a Body<'tcx>) -> FxHashMap<BasicBlock, BasicBlock> {
|
fn find_duplicates(body: &Body<'_>) -> FxHashMap<BasicBlock, BasicBlock> {
|
||||||
let mut duplicates = FxHashMap::default();
|
let mut duplicates = FxHashMap::default();
|
||||||
|
|
||||||
let bbs_to_go_through =
|
let bbs_to_go_through =
|
||||||
@ -102,7 +102,7 @@ struct BasicBlockHashable<'tcx, 'a> {
|
|||||||
basic_block_data: &'a BasicBlockData<'tcx>,
|
basic_block_data: &'a BasicBlockData<'tcx>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'tcx, 'a> Hash for BasicBlockHashable<'tcx, 'a> {
|
impl Hash for BasicBlockHashable<'_, '_> {
|
||||||
fn hash<H: Hasher>(&self, state: &mut H) {
|
fn hash<H: Hasher>(&self, state: &mut H) {
|
||||||
hash_statements(state, self.basic_block_data.statements.iter());
|
hash_statements(state, self.basic_block_data.statements.iter());
|
||||||
// Note that since we only hash the kind, we lose span information if we deduplicate the blocks
|
// Note that since we only hash the kind, we lose span information if we deduplicate the blocks
|
||||||
@ -110,9 +110,9 @@ impl<'tcx, 'a> Hash for BasicBlockHashable<'tcx, 'a> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'tcx, 'a> Eq for BasicBlockHashable<'tcx, 'a> {}
|
impl Eq for BasicBlockHashable<'_, '_> {}
|
||||||
|
|
||||||
impl<'tcx, 'a> PartialEq for BasicBlockHashable<'tcx, 'a> {
|
impl PartialEq for BasicBlockHashable<'_, '_> {
|
||||||
fn eq(&self, other: &Self) -> bool {
|
fn eq(&self, other: &Self) -> bool {
|
||||||
self.basic_block_data.statements.len() == other.basic_block_data.statements.len()
|
self.basic_block_data.statements.len() == other.basic_block_data.statements.len()
|
||||||
&& &self.basic_block_data.terminator().kind == &other.basic_block_data.terminator().kind
|
&& &self.basic_block_data.terminator().kind == &other.basic_block_data.terminator().kind
|
||||||
@ -132,7 +132,7 @@ fn hash_statements<'a, 'tcx, H: Hasher>(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn statement_hash<'tcx, H: Hasher>(hasher: &mut H, stmt: &StatementKind<'tcx>) {
|
fn statement_hash<H: Hasher>(hasher: &mut H, stmt: &StatementKind<'_>) {
|
||||||
match stmt {
|
match stmt {
|
||||||
StatementKind::Assign(box (place, rvalue)) => {
|
StatementKind::Assign(box (place, rvalue)) => {
|
||||||
place.hash(hasher);
|
place.hash(hasher);
|
||||||
@ -142,14 +142,14 @@ fn statement_hash<'tcx, H: Hasher>(hasher: &mut H, stmt: &StatementKind<'tcx>) {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
fn rvalue_hash<H: Hasher>(hasher: &mut H, rvalue: &Rvalue<'tcx>) {
|
fn rvalue_hash<H: Hasher>(hasher: &mut H, rvalue: &Rvalue<'_>) {
|
||||||
match rvalue {
|
match rvalue {
|
||||||
Rvalue::Use(op) => operand_hash(hasher, op),
|
Rvalue::Use(op) => operand_hash(hasher, op),
|
||||||
x => x.hash(hasher),
|
x => x.hash(hasher),
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
fn operand_hash<H: Hasher>(hasher: &mut H, operand: &Operand<'tcx>) {
|
fn operand_hash<H: Hasher>(hasher: &mut H, operand: &Operand<'_>) {
|
||||||
match operand {
|
match operand {
|
||||||
Operand::Constant(box Constant { user_ty: _, literal, span: _ }) => literal.hash(hasher),
|
Operand::Constant(box Constant { user_ty: _, literal, span: _ }) => literal.hash(hasher),
|
||||||
x => x.hash(hasher),
|
x => x.hash(hasher),
|
||||||
@ -168,7 +168,7 @@ fn statement_eq<'tcx>(lhs: &StatementKind<'tcx>, rhs: &StatementKind<'tcx>) -> b
|
|||||||
res
|
res
|
||||||
}
|
}
|
||||||
|
|
||||||
fn rvalue_eq(lhs: &Rvalue<'tcx>, rhs: &Rvalue<'tcx>) -> bool {
|
fn rvalue_eq<'tcx>(lhs: &Rvalue<'tcx>, rhs: &Rvalue<'tcx>) -> bool {
|
||||||
let res = match (lhs, rhs) {
|
let res = match (lhs, rhs) {
|
||||||
(Rvalue::Use(op1), Rvalue::Use(op2)) => operand_eq(op1, op2),
|
(Rvalue::Use(op1), Rvalue::Use(op2)) => operand_eq(op1, op2),
|
||||||
(x, y) => x == y,
|
(x, y) => x == y,
|
||||||
@ -177,7 +177,7 @@ fn rvalue_eq(lhs: &Rvalue<'tcx>, rhs: &Rvalue<'tcx>) -> bool {
|
|||||||
res
|
res
|
||||||
}
|
}
|
||||||
|
|
||||||
fn operand_eq(lhs: &Operand<'tcx>, rhs: &Operand<'tcx>) -> bool {
|
fn operand_eq<'tcx>(lhs: &Operand<'tcx>, rhs: &Operand<'tcx>) -> bool {
|
||||||
let res = match (lhs, rhs) {
|
let res = match (lhs, rhs) {
|
||||||
(
|
(
|
||||||
Operand::Constant(box Constant { user_ty: _, literal, span: _ }),
|
Operand::Constant(box Constant { user_ty: _, literal, span: _ }),
|
||||||
|
@ -241,7 +241,7 @@ struct Replacements<'tcx> {
|
|||||||
kill: BitSet<Local>,
|
kill: BitSet<Local>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Replacements<'tcx> {
|
impl<'tcx> Replacements<'tcx> {
|
||||||
fn new(locals: usize) -> Self {
|
fn new(locals: usize) -> Self {
|
||||||
Self { map: IndexVec::from_elem_n(None, locals), kill: BitSet::new_empty(locals) }
|
Self { map: IndexVec::from_elem_n(None, locals), kill: BitSet::new_empty(locals) }
|
||||||
}
|
}
|
||||||
@ -298,7 +298,7 @@ struct Replacer<'tcx> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl<'tcx> MutVisitor<'tcx> for Replacer<'tcx> {
|
impl<'tcx> MutVisitor<'tcx> for Replacer<'tcx> {
|
||||||
fn tcx<'a>(&'a self) -> TyCtxt<'tcx> {
|
fn tcx(&self) -> TyCtxt<'tcx> {
|
||||||
self.tcx
|
self.tcx
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -372,7 +372,7 @@ struct Conflicts<'a> {
|
|||||||
unified_locals: InPlaceUnificationTable<UnifyLocal>,
|
unified_locals: InPlaceUnificationTable<UnifyLocal>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Conflicts<'a> {
|
impl<'a> Conflicts<'a> {
|
||||||
fn build<'tcx>(
|
fn build<'tcx>(
|
||||||
tcx: TyCtxt<'tcx>,
|
tcx: TyCtxt<'tcx>,
|
||||||
body: &'_ Body<'tcx>,
|
body: &'_ Body<'tcx>,
|
||||||
@ -820,10 +820,7 @@ struct CandidateAssignment<'tcx> {
|
|||||||
/// comment) and also throw out assignments that involve a local that has its address taken or is
|
/// comment) and also throw out assignments that involve a local that has its address taken or is
|
||||||
/// otherwise ineligible (eg. locals used as array indices are ignored because we cannot propagate
|
/// otherwise ineligible (eg. locals used as array indices are ignored because we cannot propagate
|
||||||
/// arbitrary places into array indices).
|
/// arbitrary places into array indices).
|
||||||
fn find_candidates<'a, 'tcx>(
|
fn find_candidates<'tcx>(tcx: TyCtxt<'tcx>, body: &Body<'tcx>) -> Vec<CandidateAssignment<'tcx>> {
|
||||||
tcx: TyCtxt<'tcx>,
|
|
||||||
body: &'a Body<'tcx>,
|
|
||||||
) -> Vec<CandidateAssignment<'tcx>> {
|
|
||||||
let mut visitor = FindAssignments {
|
let mut visitor = FindAssignments {
|
||||||
tcx,
|
tcx,
|
||||||
body,
|
body,
|
||||||
@ -843,7 +840,7 @@ struct FindAssignments<'a, 'tcx> {
|
|||||||
locals_used_as_array_index: BitSet<Local>,
|
locals_used_as_array_index: BitSet<Local>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a, 'tcx> Visitor<'tcx> for FindAssignments<'a, 'tcx> {
|
impl<'tcx> Visitor<'tcx> for FindAssignments<'_, 'tcx> {
|
||||||
fn visit_statement(&mut self, statement: &Statement<'tcx>, location: Location) {
|
fn visit_statement(&mut self, statement: &Statement<'tcx>, location: Location) {
|
||||||
if let StatementKind::Assign(box (
|
if let StatementKind::Assign(box (
|
||||||
dest,
|
dest,
|
||||||
|
@ -167,7 +167,7 @@ impl<'tcx> MirPass<'tcx> for EarlyOtherwiseBranch {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn is_switch<'tcx>(terminator: &Terminator<'tcx>) -> bool {
|
fn is_switch(terminator: &Terminator<'_>) -> bool {
|
||||||
matches!(terminator.kind, TerminatorKind::SwitchInt { .. })
|
matches!(terminator.kind, TerminatorKind::SwitchInt { .. })
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -208,7 +208,7 @@ struct OptimizationInfo<'tcx> {
|
|||||||
second_switch_info: SwitchDiscriminantInfo<'tcx>,
|
second_switch_info: SwitchDiscriminantInfo<'tcx>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a, 'tcx> Helper<'a, 'tcx> {
|
impl<'tcx> Helper<'_, 'tcx> {
|
||||||
pub fn go(
|
pub fn go(
|
||||||
&self,
|
&self,
|
||||||
bb: &BasicBlockData<'tcx>,
|
bb: &BasicBlockData<'tcx>,
|
||||||
|
@ -149,13 +149,13 @@ struct Elaborator<'a, 'b, 'tcx> {
|
|||||||
ctxt: &'a mut ElaborateDropsCtxt<'b, 'tcx>,
|
ctxt: &'a mut ElaborateDropsCtxt<'b, 'tcx>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a, 'b, 'tcx> fmt::Debug for Elaborator<'a, 'b, 'tcx> {
|
impl fmt::Debug for Elaborator<'_, '_, '_> {
|
||||||
fn fmt(&self, _f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
fn fmt(&self, _f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a, 'b, 'tcx> DropElaborator<'a, 'tcx> for Elaborator<'a, 'b, 'tcx> {
|
impl<'a, 'tcx> DropElaborator<'a, 'tcx> for Elaborator<'a, '_, 'tcx> {
|
||||||
type Path = MovePathIndex;
|
type Path = MovePathIndex;
|
||||||
|
|
||||||
fn patch(&mut self) -> &mut MirPatch<'tcx> {
|
fn patch(&mut self) -> &mut MirPatch<'tcx> {
|
||||||
|
@ -27,7 +27,7 @@ struct FunctionItemRefChecker<'a, 'tcx> {
|
|||||||
body: &'a Body<'tcx>,
|
body: &'a Body<'tcx>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a, 'tcx> Visitor<'tcx> for FunctionItemRefChecker<'a, 'tcx> {
|
impl<'tcx> Visitor<'tcx> for FunctionItemRefChecker<'_, 'tcx> {
|
||||||
/// Emits a lint for function reference arguments bound by `fmt::Pointer` or passed to
|
/// Emits a lint for function reference arguments bound by `fmt::Pointer` or passed to
|
||||||
/// `transmute`. This only handles arguments in calls outside macro expansions to avoid double
|
/// `transmute`. This only handles arguments in calls outside macro expansions to avoid double
|
||||||
/// counting function references formatted as pointers by macros.
|
/// counting function references formatted as pointers by macros.
|
||||||
@ -92,7 +92,7 @@ impl<'a, 'tcx> Visitor<'tcx> for FunctionItemRefChecker<'a, 'tcx> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a, 'tcx> FunctionItemRefChecker<'a, 'tcx> {
|
impl<'tcx> FunctionItemRefChecker<'_, 'tcx> {
|
||||||
/// Emits a lint for function reference arguments bound by `fmt::Pointer` in calls to the
|
/// Emits a lint for function reference arguments bound by `fmt::Pointer` in calls to the
|
||||||
/// function defined by `def_id` with the substitutions `substs_ref`.
|
/// function defined by `def_id` with the substitutions `substs_ref`.
|
||||||
fn check_bound_args(
|
fn check_bound_args(
|
||||||
|
@ -233,7 +233,7 @@ struct TransformVisitor<'tcx> {
|
|||||||
new_ret_local: Local,
|
new_ret_local: Local,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl TransformVisitor<'tcx> {
|
impl<'tcx> TransformVisitor<'tcx> {
|
||||||
// Make a GeneratorState variant assignment. `core::ops::GeneratorState` only has single
|
// Make a GeneratorState variant assignment. `core::ops::GeneratorState` only has single
|
||||||
// element tuple variants, so we can just write to the downcasted first field and then set the
|
// element tuple variants, so we can just write to the downcasted first field and then set the
|
||||||
// discriminant to the appropriate variant.
|
// discriminant to the appropriate variant.
|
||||||
@ -295,7 +295,7 @@ impl TransformVisitor<'tcx> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl MutVisitor<'tcx> for TransformVisitor<'tcx> {
|
impl<'tcx> MutVisitor<'tcx> for TransformVisitor<'tcx> {
|
||||||
fn tcx(&self) -> TyCtxt<'tcx> {
|
fn tcx(&self) -> TyCtxt<'tcx> {
|
||||||
self.tcx
|
self.tcx
|
||||||
}
|
}
|
||||||
@ -446,7 +446,7 @@ struct LivenessInfo {
|
|||||||
storage_liveness: IndexVec<BasicBlock, Option<BitSet<Local>>>,
|
storage_liveness: IndexVec<BasicBlock, Option<BitSet<Local>>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
fn locals_live_across_suspend_points(
|
fn locals_live_across_suspend_points<'tcx>(
|
||||||
tcx: TyCtxt<'tcx>,
|
tcx: TyCtxt<'tcx>,
|
||||||
body: &Body<'tcx>,
|
body: &Body<'tcx>,
|
||||||
always_live_locals: &storage::AlwaysLiveLocals,
|
always_live_locals: &storage::AlwaysLiveLocals,
|
||||||
@ -613,7 +613,7 @@ impl ops::Deref for GeneratorSavedLocals {
|
|||||||
/// time. Generates a bitset for every local of all the other locals that may be
|
/// time. Generates a bitset for every local of all the other locals that may be
|
||||||
/// StorageLive simultaneously with that local. This is used in the layout
|
/// StorageLive simultaneously with that local. This is used in the layout
|
||||||
/// computation; see `GeneratorLayout` for more.
|
/// computation; see `GeneratorLayout` for more.
|
||||||
fn compute_storage_conflicts(
|
fn compute_storage_conflicts<'mir, 'tcx>(
|
||||||
body: &'mir Body<'tcx>,
|
body: &'mir Body<'tcx>,
|
||||||
saved_locals: &GeneratorSavedLocals,
|
saved_locals: &GeneratorSavedLocals,
|
||||||
always_live_locals: storage::AlwaysLiveLocals,
|
always_live_locals: storage::AlwaysLiveLocals,
|
||||||
@ -672,7 +672,9 @@ struct StorageConflictVisitor<'mir, 'tcx, 's> {
|
|||||||
local_conflicts: BitMatrix<Local, Local>,
|
local_conflicts: BitMatrix<Local, Local>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl rustc_mir_dataflow::ResultsVisitor<'mir, 'tcx> for StorageConflictVisitor<'mir, 'tcx, '_> {
|
impl<'mir, 'tcx> rustc_mir_dataflow::ResultsVisitor<'mir, 'tcx>
|
||||||
|
for StorageConflictVisitor<'mir, 'tcx, '_>
|
||||||
|
{
|
||||||
type FlowState = BitSet<Local>;
|
type FlowState = BitSet<Local>;
|
||||||
|
|
||||||
fn visit_statement_before_primary_effect(
|
fn visit_statement_before_primary_effect(
|
||||||
@ -694,7 +696,7 @@ impl rustc_mir_dataflow::ResultsVisitor<'mir, 'tcx> for StorageConflictVisitor<'
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'body, 'tcx, 's> StorageConflictVisitor<'body, 'tcx, 's> {
|
impl StorageConflictVisitor<'_, '_, '_> {
|
||||||
fn apply_state(&mut self, flow_state: &BitSet<Local>, loc: Location) {
|
fn apply_state(&mut self, flow_state: &BitSet<Local>, loc: Location) {
|
||||||
// Ignore unreachable blocks.
|
// Ignore unreachable blocks.
|
||||||
if self.body.basic_blocks()[loc.block].terminator().kind == TerminatorKind::Unreachable {
|
if self.body.basic_blocks()[loc.block].terminator().kind == TerminatorKind::Unreachable {
|
||||||
@ -1398,7 +1400,7 @@ impl EnsureGeneratorFieldAssignmentsNeverAlias<'_> {
|
|||||||
self.saved_locals.get(place.local)
|
self.saved_locals.get(place.local)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn check_assigned_place(&mut self, place: Place<'tcx>, f: impl FnOnce(&mut Self)) {
|
fn check_assigned_place(&mut self, place: Place<'_>, f: impl FnOnce(&mut Self)) {
|
||||||
if let Some(assigned_local) = self.saved_local_for_direct_place(place) {
|
if let Some(assigned_local) = self.saved_local_for_direct_place(place) {
|
||||||
assert!(self.assigned_local.is_none(), "`check_assigned_place` must not recurse");
|
assert!(self.assigned_local.is_none(), "`check_assigned_place` must not recurse");
|
||||||
|
|
||||||
@ -1409,7 +1411,7 @@ impl EnsureGeneratorFieldAssignmentsNeverAlias<'_> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Visitor<'tcx> for EnsureGeneratorFieldAssignmentsNeverAlias<'_> {
|
impl<'tcx> Visitor<'tcx> for EnsureGeneratorFieldAssignmentsNeverAlias<'_> {
|
||||||
fn visit_place(&mut self, place: &Place<'tcx>, context: PlaceContext, location: Location) {
|
fn visit_place(&mut self, place: &Place<'tcx>, context: PlaceContext, location: Location) {
|
||||||
let lhs = match self.assigned_local {
|
let lhs = match self.assigned_local {
|
||||||
Some(l) => l,
|
Some(l) => l,
|
||||||
|
@ -57,7 +57,7 @@ impl<'tcx> MirPass<'tcx> for Inline {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn inline(tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) -> bool {
|
fn inline<'tcx>(tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) -> bool {
|
||||||
let def_id = body.source.def_id();
|
let def_id = body.source.def_id();
|
||||||
let hir_id = tcx.hir().local_def_id_to_hir_id(def_id.expect_local());
|
let hir_id = tcx.hir().local_def_id_to_hir_id(def_id.expect_local());
|
||||||
|
|
||||||
@ -95,7 +95,7 @@ struct Inliner<'tcx> {
|
|||||||
changed: bool,
|
changed: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Inliner<'tcx> {
|
impl<'tcx> Inliner<'tcx> {
|
||||||
fn process_blocks(&mut self, caller_body: &mut Body<'tcx>, blocks: Range<BasicBlock>) {
|
fn process_blocks(&mut self, caller_body: &mut Body<'tcx>, blocks: Range<BasicBlock>) {
|
||||||
for bb in blocks {
|
for bb in blocks {
|
||||||
let bb_data = &caller_body[bb];
|
let bb_data = &caller_body[bb];
|
||||||
@ -786,7 +786,7 @@ struct Integrator<'a, 'tcx> {
|
|||||||
always_live_locals: BitSet<Local>,
|
always_live_locals: BitSet<Local>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a, 'tcx> Integrator<'a, 'tcx> {
|
impl Integrator<'_, '_> {
|
||||||
fn map_local(&self, local: Local) -> Local {
|
fn map_local(&self, local: Local) -> Local {
|
||||||
let new = if local == RETURN_PLACE {
|
let new = if local == RETURN_PLACE {
|
||||||
self.destination.local
|
self.destination.local
|
||||||
@ -815,7 +815,7 @@ impl<'a, 'tcx> Integrator<'a, 'tcx> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a, 'tcx> MutVisitor<'tcx> for Integrator<'a, 'tcx> {
|
impl<'tcx> MutVisitor<'tcx> for Integrator<'_, 'tcx> {
|
||||||
fn tcx(&self) -> TyCtxt<'tcx> {
|
fn tcx(&self) -> TyCtxt<'tcx> {
|
||||||
self.tcx
|
self.tcx
|
||||||
}
|
}
|
||||||
|
@ -10,7 +10,7 @@ use rustc_session::Limit;
|
|||||||
// FIXME: check whether it is cheaper to precompute the entire call graph instead of invoking
|
// FIXME: check whether it is cheaper to precompute the entire call graph instead of invoking
|
||||||
// this query riddiculously often.
|
// this query riddiculously often.
|
||||||
#[instrument(level = "debug", skip(tcx, root, target))]
|
#[instrument(level = "debug", skip(tcx, root, target))]
|
||||||
crate fn mir_callgraph_reachable(
|
crate fn mir_callgraph_reachable<'tcx>(
|
||||||
tcx: TyCtxt<'tcx>,
|
tcx: TyCtxt<'tcx>,
|
||||||
(root, target): (ty::Instance<'tcx>, LocalDefId),
|
(root, target): (ty::Instance<'tcx>, LocalDefId),
|
||||||
) -> bool {
|
) -> bool {
|
||||||
@ -33,7 +33,7 @@ crate fn mir_callgraph_reachable(
|
|||||||
level = "debug",
|
level = "debug",
|
||||||
skip(tcx, param_env, target, stack, seen, recursion_limiter, caller, recursion_limit)
|
skip(tcx, param_env, target, stack, seen, recursion_limiter, caller, recursion_limit)
|
||||||
)]
|
)]
|
||||||
fn process(
|
fn process<'tcx>(
|
||||||
tcx: TyCtxt<'tcx>,
|
tcx: TyCtxt<'tcx>,
|
||||||
param_env: ty::ParamEnv<'tcx>,
|
param_env: ty::ParamEnv<'tcx>,
|
||||||
caller: ty::Instance<'tcx>,
|
caller: ty::Instance<'tcx>,
|
||||||
|
@ -38,7 +38,7 @@ struct InstCombineContext<'tcx, 'a> {
|
|||||||
local_decls: &'a LocalDecls<'tcx>,
|
local_decls: &'a LocalDecls<'tcx>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'tcx, 'a> InstCombineContext<'tcx, 'a> {
|
impl<'tcx> InstCombineContext<'tcx, '_> {
|
||||||
fn should_combine(&self, source_info: &SourceInfo, rvalue: &Rvalue<'tcx>) -> bool {
|
fn should_combine(&self, source_info: &SourceInfo, rvalue: &Rvalue<'tcx>) -> bool {
|
||||||
self.tcx.consider_optimizing(|| {
|
self.tcx.consider_optimizing(|| {
|
||||||
format!("InstCombine - Rvalue: {:?} SourceInfo: {:?}", rvalue, source_info)
|
format!("InstCombine - Rvalue: {:?} SourceInfo: {:?}", rvalue, source_info)
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
#![feature(box_patterns)]
|
#![feature(box_patterns)]
|
||||||
#![feature(box_syntax)]
|
#![feature(box_syntax)]
|
||||||
#![feature(crate_visibility_modifier)]
|
#![feature(crate_visibility_modifier)]
|
||||||
#![feature(in_band_lifetimes)]
|
|
||||||
#![feature(iter_zip)]
|
#![feature(iter_zip)]
|
||||||
#![feature(let_else)]
|
#![feature(let_else)]
|
||||||
#![feature(map_try_insert)]
|
#![feature(map_try_insert)]
|
||||||
@ -150,7 +149,7 @@ fn mir_keys(tcx: TyCtxt<'_>, (): ()) -> FxHashSet<LocalDefId> {
|
|||||||
tcx: TyCtxt<'tcx>,
|
tcx: TyCtxt<'tcx>,
|
||||||
set: &'a mut FxHashSet<LocalDefId>,
|
set: &'a mut FxHashSet<LocalDefId>,
|
||||||
}
|
}
|
||||||
impl<'a, 'tcx> Visitor<'tcx> for GatherCtors<'a, 'tcx> {
|
impl<'tcx> Visitor<'tcx> for GatherCtors<'_, 'tcx> {
|
||||||
fn visit_variant_data(
|
fn visit_variant_data(
|
||||||
&mut self,
|
&mut self,
|
||||||
v: &'tcx hir::VariantData<'tcx>,
|
v: &'tcx hir::VariantData<'tcx>,
|
||||||
@ -243,7 +242,7 @@ fn mir_const<'tcx>(
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Compute the main MIR body and the list of MIR bodies of the promoteds.
|
/// Compute the main MIR body and the list of MIR bodies of the promoteds.
|
||||||
fn mir_promoted(
|
fn mir_promoted<'tcx>(
|
||||||
tcx: TyCtxt<'tcx>,
|
tcx: TyCtxt<'tcx>,
|
||||||
def: ty::WithOptConstParam<LocalDefId>,
|
def: ty::WithOptConstParam<LocalDefId>,
|
||||||
) -> (&'tcx Steal<Body<'tcx>>, &'tcx Steal<IndexVec<Promoted, Body<'tcx>>>) {
|
) -> (&'tcx Steal<Body<'tcx>>, &'tcx Steal<IndexVec<Promoted, Body<'tcx>>>) {
|
||||||
|
@ -135,7 +135,7 @@ impl<'tcx> MirPass<'tcx> for LowerIntrinsics {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn resolve_rust_intrinsic(
|
fn resolve_rust_intrinsic<'tcx>(
|
||||||
tcx: TyCtxt<'tcx>,
|
tcx: TyCtxt<'tcx>,
|
||||||
func_ty: Ty<'tcx>,
|
func_ty: Ty<'tcx>,
|
||||||
) -> Option<(Symbol, SubstsRef<'tcx>)> {
|
) -> Option<(Symbol, SubstsRef<'tcx>)> {
|
||||||
@ -148,7 +148,7 @@ fn resolve_rust_intrinsic(
|
|||||||
None
|
None
|
||||||
}
|
}
|
||||||
|
|
||||||
fn validate_simd_shuffle(tcx: TyCtxt<'tcx>, args: &[Operand<'tcx>], span: Span) {
|
fn validate_simd_shuffle<'tcx>(tcx: TyCtxt<'tcx>, args: &[Operand<'tcx>], span: Span) {
|
||||||
match &args[2] {
|
match &args[2] {
|
||||||
Operand::Constant(_) => {} // all good
|
Operand::Constant(_) => {} // all good
|
||||||
_ => {
|
_ => {
|
||||||
|
@ -85,7 +85,7 @@ struct Patcher<'a, 'tcx> {
|
|||||||
statement_idx: usize,
|
statement_idx: usize,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a, 'tcx> Patcher<'a, 'tcx> {
|
impl<'tcx> Patcher<'_, 'tcx> {
|
||||||
fn patch_expand_statement(
|
fn patch_expand_statement(
|
||||||
&mut self,
|
&mut self,
|
||||||
statement: &mut Statement<'tcx>,
|
statement: &mut Statement<'tcx>,
|
||||||
|
@ -165,7 +165,7 @@ struct RenameToReturnPlace<'tcx> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Replaces all uses of `self.to_rename` with `_0`.
|
/// Replaces all uses of `self.to_rename` with `_0`.
|
||||||
impl MutVisitor<'tcx> for RenameToReturnPlace<'tcx> {
|
impl<'tcx> MutVisitor<'tcx> for RenameToReturnPlace<'tcx> {
|
||||||
fn tcx(&self) -> TyCtxt<'tcx> {
|
fn tcx(&self) -> TyCtxt<'tcx> {
|
||||||
self.tcx
|
self.tcx
|
||||||
}
|
}
|
||||||
@ -221,7 +221,7 @@ impl IsReturnPlaceRead {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Visitor<'tcx> for IsReturnPlaceRead {
|
impl<'tcx> Visitor<'tcx> for IsReturnPlaceRead {
|
||||||
fn visit_local(&mut self, &l: &Local, ctxt: PlaceContext, _: Location) {
|
fn visit_local(&mut self, &l: &Local, ctxt: PlaceContext, _: Location) {
|
||||||
if l == mir::RETURN_PLACE && ctxt.is_use() && !ctxt.is_place_assignment() {
|
if l == mir::RETURN_PLACE && ctxt.is_use() && !ctxt.is_place_assignment() {
|
||||||
self.0 = true;
|
self.0 = true;
|
||||||
|
@ -28,7 +28,7 @@ pub trait MirLint<'tcx> {
|
|||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
pub struct Lint<T>(pub T);
|
pub struct Lint<T>(pub T);
|
||||||
|
|
||||||
impl<T> MirPass<'tcx> for Lint<T>
|
impl<'tcx, T> MirPass<'tcx> for Lint<T>
|
||||||
where
|
where
|
||||||
T: MirLint<'tcx>,
|
T: MirLint<'tcx>,
|
||||||
{
|
{
|
||||||
@ -51,7 +51,7 @@ where
|
|||||||
|
|
||||||
pub struct WithMinOptLevel<T>(pub u32, pub T);
|
pub struct WithMinOptLevel<T>(pub u32, pub T);
|
||||||
|
|
||||||
impl<T> MirPass<'tcx> for WithMinOptLevel<T>
|
impl<'tcx, T> MirPass<'tcx> for WithMinOptLevel<T>
|
||||||
where
|
where
|
||||||
T: MirPass<'tcx>,
|
T: MirPass<'tcx>,
|
||||||
{
|
{
|
||||||
@ -72,7 +72,7 @@ where
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn run_passes(tcx: TyCtxt<'tcx>, body: &'mir mut Body<'tcx>, passes: &[&dyn MirPass<'tcx>]) {
|
pub fn run_passes<'tcx>(tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>, passes: &[&dyn MirPass<'tcx>]) {
|
||||||
let start_phase = body.phase;
|
let start_phase = body.phase;
|
||||||
let mut cnt = 0;
|
let mut cnt = 0;
|
||||||
|
|
||||||
@ -119,11 +119,11 @@ pub fn run_passes(tcx: TyCtxt<'tcx>, body: &'mir mut Body<'tcx>, passes: &[&dyn
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn validate_body(tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>, when: String) {
|
pub fn validate_body<'tcx>(tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>, when: String) {
|
||||||
validate::Validator { when, mir_phase: body.phase }.run_pass(tcx, body);
|
validate::Validator { when, mir_phase: body.phase }.run_pass(tcx, body);
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn dump_mir(
|
pub fn dump_mir<'tcx>(
|
||||||
tcx: TyCtxt<'tcx>,
|
tcx: TyCtxt<'tcx>,
|
||||||
body: &Body<'tcx>,
|
body: &Body<'tcx>,
|
||||||
phase: MirPhase,
|
phase: MirPhase,
|
||||||
|
@ -86,7 +86,7 @@ impl<'tcx> MirPass<'tcx> for RemoveUninitDrops {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn is_needs_drop_and_init(
|
fn is_needs_drop_and_init<'tcx>(
|
||||||
tcx: TyCtxt<'tcx>,
|
tcx: TyCtxt<'tcx>,
|
||||||
param_env: ParamEnv<'tcx>,
|
param_env: ParamEnv<'tcx>,
|
||||||
maybe_inits: &BitSet<MovePathIndex>,
|
maybe_inits: &BitSet<MovePathIndex>,
|
||||||
@ -158,7 +158,7 @@ fn is_needs_drop_and_init(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn variant_needs_drop(
|
fn variant_needs_drop<'tcx>(
|
||||||
tcx: TyCtxt<'tcx>,
|
tcx: TyCtxt<'tcx>,
|
||||||
param_env: ParamEnv<'tcx>,
|
param_env: ParamEnv<'tcx>,
|
||||||
substs: SubstsRef<'tcx>,
|
substs: SubstsRef<'tcx>,
|
||||||
|
@ -12,7 +12,7 @@ impl<'a, 'tcx> RequiredConstsVisitor<'a, 'tcx> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a, 'tcx> Visitor<'tcx> for RequiredConstsVisitor<'a, 'tcx> {
|
impl<'tcx> Visitor<'tcx> for RequiredConstsVisitor<'_, 'tcx> {
|
||||||
fn visit_constant(&mut self, constant: &Constant<'tcx>, _: Location) {
|
fn visit_constant(&mut self, constant: &Constant<'tcx>, _: Location) {
|
||||||
if let Some(ct) = constant.literal.const_for_ty() {
|
if let Some(ct) = constant.literal.const_for_ty() {
|
||||||
if let ConstKind::Unevaluated(_) = ct.val {
|
if let ConstKind::Unevaluated(_) = ct.val {
|
||||||
|
@ -59,7 +59,7 @@ impl<'tcx> MirPass<'tcx> for SeparateConstSwitch {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Returns the amount of blocks that were duplicated
|
/// Returns the amount of blocks that were duplicated
|
||||||
pub fn separate_const_switch<'tcx>(body: &mut Body<'tcx>) -> usize {
|
pub fn separate_const_switch(body: &mut Body<'_>) -> usize {
|
||||||
let mut new_blocks: SmallVec<[(BasicBlock, BasicBlock); 6]> = SmallVec::new();
|
let mut new_blocks: SmallVec<[(BasicBlock, BasicBlock); 6]> = SmallVec::new();
|
||||||
let predecessors = body.predecessors();
|
let predecessors = body.predecessors();
|
||||||
'block_iter: for (block_id, block) in body.basic_blocks().iter_enumerated() {
|
'block_iter: for (block_id, block) in body.basic_blocks().iter_enumerated() {
|
||||||
|
@ -247,7 +247,7 @@ pub struct DropShimElaborator<'a, 'tcx> {
|
|||||||
pub param_env: ty::ParamEnv<'tcx>,
|
pub param_env: ty::ParamEnv<'tcx>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a, 'tcx> fmt::Debug for DropShimElaborator<'a, 'tcx> {
|
impl fmt::Debug for DropShimElaborator<'_, '_> {
|
||||||
fn fmt(&self, _f: &mut fmt::Formatter<'_>) -> Result<(), fmt::Error> {
|
fn fmt(&self, _f: &mut fmt::Formatter<'_>) -> Result<(), fmt::Error> {
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
@ -337,7 +337,7 @@ struct CloneShimBuilder<'tcx> {
|
|||||||
sig: ty::FnSig<'tcx>,
|
sig: ty::FnSig<'tcx>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl CloneShimBuilder<'tcx> {
|
impl<'tcx> CloneShimBuilder<'tcx> {
|
||||||
fn new(tcx: TyCtxt<'tcx>, def_id: DefId, self_ty: Ty<'tcx>) -> Self {
|
fn new(tcx: TyCtxt<'tcx>, def_id: DefId, self_ty: Ty<'tcx>) -> Self {
|
||||||
// we must subst the self_ty because it's
|
// we must subst the self_ty because it's
|
||||||
// otherwise going to be TySelf and we can't index
|
// otherwise going to be TySelf and we can't index
|
||||||
|
@ -47,7 +47,7 @@ impl SimplifyCfg {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn simplify_cfg(tcx: TyCtxt<'tcx>, body: &mut Body<'_>) {
|
pub fn simplify_cfg<'tcx>(tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
|
||||||
CfgSimplifier::new(body).simplify();
|
CfgSimplifier::new(body).simplify();
|
||||||
remove_dead_blocks(tcx, body);
|
remove_dead_blocks(tcx, body);
|
||||||
|
|
||||||
@ -262,7 +262,7 @@ impl<'a, 'tcx> CfgSimplifier<'a, 'tcx> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn remove_dead_blocks(tcx: TyCtxt<'tcx>, body: &mut Body<'_>) {
|
pub fn remove_dead_blocks<'tcx>(tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
|
||||||
let reachable = traversal::reachable_as_bitset(body);
|
let reachable = traversal::reachable_as_bitset(body);
|
||||||
let num_blocks = body.basic_blocks().len();
|
let num_blocks = body.basic_blocks().len();
|
||||||
if num_blocks == reachable.count() {
|
if num_blocks == reachable.count() {
|
||||||
@ -454,7 +454,7 @@ impl UsedLocals {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Updates the use counts to reflect the removal of given statement.
|
/// Updates the use counts to reflect the removal of given statement.
|
||||||
fn statement_removed(&mut self, statement: &Statement<'tcx>) {
|
fn statement_removed(&mut self, statement: &Statement<'_>) {
|
||||||
self.increment = false;
|
self.increment = false;
|
||||||
|
|
||||||
// The location of the statement is irrelevant.
|
// The location of the statement is irrelevant.
|
||||||
@ -463,7 +463,7 @@ impl UsedLocals {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Visits a left-hand side of an assignment.
|
/// Visits a left-hand side of an assignment.
|
||||||
fn visit_lhs(&mut self, place: &Place<'tcx>, location: Location) {
|
fn visit_lhs(&mut self, place: &Place<'_>, location: Location) {
|
||||||
if place.is_indirect() {
|
if place.is_indirect() {
|
||||||
// A use, not a definition.
|
// A use, not a definition.
|
||||||
self.visit_place(place, PlaceContext::MutatingUse(MutatingUseContext::Store), location);
|
self.visit_place(place, PlaceContext::MutatingUse(MutatingUseContext::Store), location);
|
||||||
@ -480,7 +480,7 @@ impl UsedLocals {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Visitor<'_> for UsedLocals {
|
impl<'tcx> Visitor<'tcx> for UsedLocals {
|
||||||
fn visit_statement(&mut self, statement: &Statement<'tcx>, location: Location) {
|
fn visit_statement(&mut self, statement: &Statement<'tcx>, location: Location) {
|
||||||
match statement.kind {
|
match statement.kind {
|
||||||
StatementKind::LlvmInlineAsm(..)
|
StatementKind::LlvmInlineAsm(..)
|
||||||
@ -518,7 +518,7 @@ impl Visitor<'_> for UsedLocals {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Removes unused definitions. Updates the used locals to reflect the changes made.
|
/// Removes unused definitions. Updates the used locals to reflect the changes made.
|
||||||
fn remove_unused_definitions<'a, 'tcx>(used_locals: &'a mut UsedLocals, body: &mut Body<'tcx>) {
|
fn remove_unused_definitions(used_locals: &mut UsedLocals, body: &mut Body<'_>) {
|
||||||
// The use counts are updated as we remove the statements. A local might become unused
|
// The use counts are updated as we remove the statements. A local might become unused
|
||||||
// during the retain operation, leading to a temporary inconsistency (storage statements or
|
// during the retain operation, leading to a temporary inconsistency (storage statements or
|
||||||
// definitions referencing the local might remain). For correctness it is crucial that this
|
// definitions referencing the local might remain). For correctness it is crucial that this
|
||||||
|
@ -148,7 +148,7 @@ struct OptimizationFinder<'a, 'tcx> {
|
|||||||
body: &'a Body<'tcx>,
|
body: &'a Body<'tcx>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a, 'tcx> OptimizationFinder<'a, 'tcx> {
|
impl<'tcx> OptimizationFinder<'_, 'tcx> {
|
||||||
fn find_optimizations(&self) -> Vec<OptimizationInfo<'tcx>> {
|
fn find_optimizations(&self) -> Vec<OptimizationInfo<'tcx>> {
|
||||||
self.body
|
self.body
|
||||||
.basic_blocks()
|
.basic_blocks()
|
||||||
|
@ -102,7 +102,7 @@ fn get_arm_identity_info<'a, 'tcx>(
|
|||||||
|
|
||||||
type StmtIter<'a, 'tcx> = Peekable<Enumerate<Iter<'a, Statement<'tcx>>>>;
|
type StmtIter<'a, 'tcx> = Peekable<Enumerate<Iter<'a, Statement<'tcx>>>>;
|
||||||
|
|
||||||
fn is_storage_stmt<'tcx>(stmt: &Statement<'tcx>) -> bool {
|
fn is_storage_stmt(stmt: &Statement<'_>) -> bool {
|
||||||
matches!(stmt.kind, StatementKind::StorageLive(_) | StatementKind::StorageDead(_))
|
matches!(stmt.kind, StatementKind::StorageLive(_) | StatementKind::StorageDead(_))
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -122,8 +122,8 @@ fn get_arm_identity_info<'a, 'tcx>(
|
|||||||
|
|
||||||
/// Eats consecutive `StorageLive` and `StorageDead` Statements.
|
/// Eats consecutive `StorageLive` and `StorageDead` Statements.
|
||||||
/// The iterator `stmt_iter` is not advanced if none were found.
|
/// The iterator `stmt_iter` is not advanced if none were found.
|
||||||
fn try_eat_storage_stmts<'a, 'tcx>(
|
fn try_eat_storage_stmts(
|
||||||
stmt_iter: &mut StmtIter<'a, 'tcx>,
|
stmt_iter: &mut StmtIter<'_, '_>,
|
||||||
storage_live_stmts: &mut Vec<(usize, Local)>,
|
storage_live_stmts: &mut Vec<(usize, Local)>,
|
||||||
storage_dead_stmts: &mut Vec<(usize, Local)>,
|
storage_dead_stmts: &mut Vec<(usize, Local)>,
|
||||||
) {
|
) {
|
||||||
@ -136,7 +136,7 @@ fn get_arm_identity_info<'a, 'tcx>(
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
fn is_tmp_storage_stmt<'tcx>(stmt: &Statement<'tcx>) -> bool {
|
fn is_tmp_storage_stmt(stmt: &Statement<'_>) -> bool {
|
||||||
use rustc_middle::mir::StatementKind::Assign;
|
use rustc_middle::mir::StatementKind::Assign;
|
||||||
if let Assign(box (place, Rvalue::Use(Operand::Copy(p) | Operand::Move(p)))) = &stmt.kind {
|
if let Assign(box (place, Rvalue::Use(Operand::Copy(p) | Operand::Move(p)))) = &stmt.kind {
|
||||||
place.as_local().is_some() && p.as_local().is_some()
|
place.as_local().is_some() && p.as_local().is_some()
|
||||||
@ -147,8 +147,8 @@ fn get_arm_identity_info<'a, 'tcx>(
|
|||||||
|
|
||||||
/// Eats consecutive `Assign` Statements.
|
/// Eats consecutive `Assign` Statements.
|
||||||
// The iterator `stmt_iter` is not advanced if none were found.
|
// The iterator `stmt_iter` is not advanced if none were found.
|
||||||
fn try_eat_assign_tmp_stmts<'a, 'tcx>(
|
fn try_eat_assign_tmp_stmts(
|
||||||
stmt_iter: &mut StmtIter<'a, 'tcx>,
|
stmt_iter: &mut StmtIter<'_, '_>,
|
||||||
tmp_assigns: &mut Vec<(Local, Local)>,
|
tmp_assigns: &mut Vec<(Local, Local)>,
|
||||||
nop_stmts: &mut Vec<usize>,
|
nop_stmts: &mut Vec<usize>,
|
||||||
) {
|
) {
|
||||||
@ -163,9 +163,9 @@ fn get_arm_identity_info<'a, 'tcx>(
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
fn find_storage_live_dead_stmts_for_local<'tcx>(
|
fn find_storage_live_dead_stmts_for_local(
|
||||||
local: Local,
|
local: Local,
|
||||||
stmts: &[Statement<'tcx>],
|
stmts: &[Statement<'_>],
|
||||||
) -> Option<(usize, usize)> {
|
) -> Option<(usize, usize)> {
|
||||||
trace!("looking for {:?}", local);
|
trace!("looking for {:?}", local);
|
||||||
let mut storage_live_stmt = None;
|
let mut storage_live_stmt = None;
|
||||||
@ -452,14 +452,14 @@ struct LocalUseCounter {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl LocalUseCounter {
|
impl LocalUseCounter {
|
||||||
fn get_local_uses<'tcx>(body: &Body<'tcx>) -> IndexVec<Local, usize> {
|
fn get_local_uses(body: &Body<'_>) -> IndexVec<Local, usize> {
|
||||||
let mut counter = LocalUseCounter { local_uses: IndexVec::from_elem(0, &body.local_decls) };
|
let mut counter = LocalUseCounter { local_uses: IndexVec::from_elem(0, &body.local_decls) };
|
||||||
counter.visit_body(body);
|
counter.visit_body(body);
|
||||||
counter.local_uses
|
counter.local_uses
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'tcx> Visitor<'tcx> for LocalUseCounter {
|
impl Visitor<'_> for LocalUseCounter {
|
||||||
fn visit_local(&mut self, local: &Local, context: PlaceContext, _location: Location) {
|
fn visit_local(&mut self, local: &Local, context: PlaceContext, _location: Location) {
|
||||||
if context.is_storage_marker()
|
if context.is_storage_marker()
|
||||||
|| context == PlaceContext::NonUse(NonUseContext::VarDebugInfo)
|
|| context == PlaceContext::NonUse(NonUseContext::VarDebugInfo)
|
||||||
@ -510,7 +510,7 @@ fn match_set_variant_field<'tcx>(stmt: &Statement<'tcx>) -> Option<(Local, Local
|
|||||||
/// ```rust
|
/// ```rust
|
||||||
/// discriminant(_LOCAL_TO_SET) = VAR_IDX;
|
/// discriminant(_LOCAL_TO_SET) = VAR_IDX;
|
||||||
/// ```
|
/// ```
|
||||||
fn match_set_discr<'tcx>(stmt: &Statement<'tcx>) -> Option<(Local, VariantIdx)> {
|
fn match_set_discr(stmt: &Statement<'_>) -> Option<(Local, VariantIdx)> {
|
||||||
match &stmt.kind {
|
match &stmt.kind {
|
||||||
StatementKind::SetDiscriminant { place, variant_index } => {
|
StatementKind::SetDiscriminant { place, variant_index } => {
|
||||||
Some((place.as_local()?, *variant_index))
|
Some((place.as_local()?, *variant_index))
|
||||||
@ -588,7 +588,7 @@ struct SimplifyBranchSameOptimizationFinder<'a, 'tcx> {
|
|||||||
tcx: TyCtxt<'tcx>,
|
tcx: TyCtxt<'tcx>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a, 'tcx> SimplifyBranchSameOptimizationFinder<'a, 'tcx> {
|
impl<'tcx> SimplifyBranchSameOptimizationFinder<'_, 'tcx> {
|
||||||
fn find(&self) -> Vec<SimplifyBranchSameOptimization> {
|
fn find(&self) -> Vec<SimplifyBranchSameOptimization> {
|
||||||
self.body
|
self.body
|
||||||
.basic_blocks()
|
.basic_blocks()
|
||||||
|
@ -64,7 +64,7 @@ impl MirPass<'_> for UnreachablePropagation {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn remove_successors<F>(
|
fn remove_successors<'tcx, F>(
|
||||||
terminator_kind: &TerminatorKind<'tcx>,
|
terminator_kind: &TerminatorKind<'tcx>,
|
||||||
predicate: F,
|
predicate: F,
|
||||||
) -> Option<TerminatorKind<'tcx>>
|
) -> Option<TerminatorKind<'tcx>>
|
||||||
|
Loading…
Reference in New Issue
Block a user