@@ -3,7 +3,7 @@ use rustc_data_structures::graph::dominators::{self, Dominators};
3
3
use rustc_data_structures:: graph:: { self , GraphSuccessors , WithNumNodes , WithStartNode } ;
4
4
use rustc_index:: bit_set:: BitSet ;
5
5
use rustc_index:: { IndexSlice , IndexVec } ;
6
- use rustc_middle:: mir:: { self , BasicBlock , TerminatorKind } ;
6
+ use rustc_middle:: mir:: { self , BasicBlock , Terminator , TerminatorKind } ;
7
7
8
8
use std:: cmp:: Ordering ;
9
9
use std:: collections:: VecDeque ;
@@ -38,7 +38,7 @@ impl CoverageGraph {
38
38
}
39
39
let bcb_data = & bcbs[ bcb] ;
40
40
let mut bcb_successors = Vec :: new ( ) ;
41
- for successor in bcb_filtered_successors ( mir_body, bcb_data. last_bb ( ) )
41
+ for successor in bcb_filtered_successors ( mir_body[ bcb_data. last_bb ( ) ] . terminator ( ) )
42
42
. filter_map ( |successor_bb| bb_to_bcb[ successor_bb] )
43
43
{
44
44
if !seen[ successor] {
@@ -91,7 +91,10 @@ impl CoverageGraph {
91
91
// `catch_unwind()` handlers.
92
92
93
93
let mut basic_blocks = Vec :: new ( ) ;
94
- for bb in short_circuit_preorder ( mir_body, bcb_filtered_successors) {
94
+ let filtered_successors = |bb| bcb_filtered_successors ( mir_body[ bb] . terminator ( ) ) ;
95
+ for bb in short_circuit_preorder ( mir_body, filtered_successors)
96
+ . filter ( |& bb| mir_body[ bb] . terminator ( ) . kind != TerminatorKind :: Unreachable )
97
+ {
95
98
if let Some ( last) = basic_blocks. last ( ) {
96
99
let predecessors = & mir_body. basic_blocks . predecessors ( ) [ bb] ;
97
100
if predecessors. len ( ) > 1 || !predecessors. contains ( last) {
@@ -347,15 +350,12 @@ impl BasicCoverageBlockData {
347
350
}
348
351
349
352
// Returns the subset of a block's successors that are relevant to the coverage
350
- // graph, i.e. those that do not represent unwinds or unreachable branches .
353
+ // graph, i.e. those that do not represent unwinds or false edges .
351
354
// FIXME(#78544): MIR InstrumentCoverage: Improve coverage of `#[should_panic]` tests and
352
355
// `catch_unwind()` handlers.
353
356
fn bcb_filtered_successors < ' a , ' tcx > (
354
- body : & ' a mir:: Body < ' tcx > ,
355
- bb : BasicBlock ,
357
+ terminator : & ' a Terminator < ' tcx > ,
356
358
) -> impl Iterator < Item = BasicBlock > + Captures < ' a > + Captures < ' tcx > {
357
- let terminator = body[ bb] . terminator ( ) ;
358
-
359
359
let take_n_successors = match terminator. kind {
360
360
// SwitchInt successors are never unwinds, so all of them should be traversed.
361
361
TerminatorKind :: SwitchInt { .. } => usize:: MAX ,
@@ -364,10 +364,7 @@ fn bcb_filtered_successors<'a, 'tcx>(
364
364
_ => 1 ,
365
365
} ;
366
366
367
- terminator
368
- . successors ( )
369
- . take ( take_n_successors)
370
- . filter ( move |& successor| body[ successor] . terminator ( ) . kind != TerminatorKind :: Unreachable )
367
+ terminator. successors ( ) . take ( take_n_successors)
371
368
}
372
369
373
370
/// Maintains separate worklists for each loop in the BasicCoverageBlock CFG, plus one for the
@@ -544,7 +541,7 @@ fn short_circuit_preorder<'a, 'tcx, F, Iter>(
544
541
filtered_successors : F ,
545
542
) -> impl Iterator < Item = BasicBlock > + Captures < ' a > + Captures < ' tcx >
546
543
where
547
- F : Fn ( & ' a mir :: Body < ' tcx > , BasicBlock ) -> Iter ,
544
+ F : Fn ( BasicBlock ) -> Iter ,
548
545
Iter : Iterator < Item = BasicBlock > ,
549
546
{
550
547
let mut visited = BitSet :: new_empty ( body. basic_blocks . len ( ) ) ;
@@ -556,7 +553,7 @@ where
556
553
continue ;
557
554
}
558
555
559
- worklist. extend ( filtered_successors ( body , bb) ) ;
556
+ worklist. extend ( filtered_successors ( bb) ) ;
560
557
561
558
return Some ( bb) ;
562
559
}
0 commit comments