Skip to content

Commit f4075fb

Browse files
committed
coverage: Add a mir-opt test for branch coverage of match arms
1 parent efcadae commit f4075fb

File tree

2 files changed

+166
-0
lines changed

2 files changed

+166
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,138 @@
1+
- // MIR for `main` before InstrumentCoverage
2+
+ // MIR for `main` after InstrumentCoverage
3+
4+
fn main() -> () {
5+
let mut _0: ();
6+
let mut _1: Enum;
7+
let mut _2: isize;
8+
let _3: u32;
9+
let mut _4: u32;
10+
let _5: u32;
11+
let mut _6: u32;
12+
let _7: u32;
13+
let mut _8: u32;
14+
let _9: u32;
15+
let mut _10: u32;
16+
scope 1 {
17+
debug d => _3;
18+
}
19+
scope 2 {
20+
debug c => _5;
21+
}
22+
scope 3 {
23+
debug b => _7;
24+
}
25+
scope 4 {
26+
debug a => _9;
27+
}
28+
29+
+ coverage ExpressionId(0) => Expression { lhs: Counter(1), op: Add, rhs: Counter(2) };
30+
+ coverage ExpressionId(1) => Expression { lhs: Expression(0), op: Add, rhs: Counter(3) };
31+
+ coverage ExpressionId(2) => Expression { lhs: Counter(0), op: Subtract, rhs: Expression(1) };
32+
+ coverage ExpressionId(3) => Expression { lhs: Counter(3), op: Add, rhs: Counter(2) };
33+
+ coverage ExpressionId(4) => Expression { lhs: Expression(3), op: Add, rhs: Counter(1) };
34+
+ coverage ExpressionId(5) => Expression { lhs: Expression(4), op: Add, rhs: Expression(2) };
35+
+ coverage Code(Counter(0)) => $DIR/branch_match_arms.rs:15:1 - 16:21;
36+
+ coverage Code(Counter(3)) => $DIR/branch_match_arms.rs:17:17 - 17:33;
37+
+ coverage Code(Counter(2)) => $DIR/branch_match_arms.rs:18:17 - 18:33;
38+
+ coverage Code(Counter(1)) => $DIR/branch_match_arms.rs:19:17 - 19:33;
39+
+ coverage Code(Expression(2)) => $DIR/branch_match_arms.rs:20:17 - 20:33;
40+
+ coverage Code(Expression(5)) => $DIR/branch_match_arms.rs:22:1 - 22:2;
41+
+
42+
bb0: {
43+
+ Coverage::CounterIncrement(0);
44+
StorageLive(_1);
45+
_1 = Enum::A(const 0_u32);
46+
PlaceMention(_1);
47+
_2 = discriminant(_1);
48+
switchInt(move _2) -> [0: bb5, 1: bb4, 2: bb3, 3: bb2, otherwise: bb1];
49+
}
50+
51+
bb1: {
52+
FakeRead(ForMatchedPlace(None), _1);
53+
unreachable;
54+
}
55+
56+
bb2: {
57+
+ Coverage::CounterIncrement(3);
58+
falseEdge -> [real: bb6, imaginary: bb3];
59+
}
60+
61+
bb3: {
62+
+ Coverage::CounterIncrement(2);
63+
falseEdge -> [real: bb8, imaginary: bb4];
64+
}
65+
66+
bb4: {
67+
+ Coverage::CounterIncrement(1);
68+
falseEdge -> [real: bb10, imaginary: bb5];
69+
}
70+
71+
bb5: {
72+
+ Coverage::ExpressionUsed(2);
73+
StorageLive(_9);
74+
_9 = ((_1 as A).0: u32);
75+
StorageLive(_10);
76+
_10 = _9;
77+
_0 = consume(move _10) -> [return: bb12, unwind: bb14];
78+
}
79+
80+
bb6: {
81+
StorageLive(_3);
82+
_3 = ((_1 as D).0: u32);
83+
StorageLive(_4);
84+
_4 = _3;
85+
_0 = consume(move _4) -> [return: bb7, unwind: bb14];
86+
}
87+
88+
bb7: {
89+
StorageDead(_4);
90+
StorageDead(_3);
91+
goto -> bb13;
92+
}
93+
94+
bb8: {
95+
StorageLive(_5);
96+
_5 = ((_1 as C).0: u32);
97+
StorageLive(_6);
98+
_6 = _5;
99+
_0 = consume(move _6) -> [return: bb9, unwind: bb14];
100+
}
101+
102+
bb9: {
103+
StorageDead(_6);
104+
StorageDead(_5);
105+
goto -> bb13;
106+
}
107+
108+
bb10: {
109+
StorageLive(_7);
110+
_7 = ((_1 as B).0: u32);
111+
StorageLive(_8);
112+
_8 = _7;
113+
_0 = consume(move _8) -> [return: bb11, unwind: bb14];
114+
}
115+
116+
bb11: {
117+
StorageDead(_8);
118+
StorageDead(_7);
119+
goto -> bb13;
120+
}
121+
122+
bb12: {
123+
StorageDead(_10);
124+
StorageDead(_9);
125+
goto -> bb13;
126+
}
127+
128+
bb13: {
129+
+ Coverage::ExpressionUsed(5);
130+
StorageDead(_1);
131+
return;
132+
}
133+
134+
bb14 (cleanup): {
135+
resume;
136+
}
137+
}
138+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
#![feature(coverage_attribute)]
2+
//@ unit-test: InstrumentCoverage
3+
//@ compile-flags: -Cinstrument-coverage -Zno-profiler-runtime -Zcoverage-options=branch
4+
// skip-filecheck
5+
6+
// EMIT_MIR branch_match_arms.main.InstrumentCoverage.diff
7+
8+
enum Enum {
9+
A(u32),
10+
B(u32),
11+
C(u32),
12+
D(u32),
13+
}
14+
15+
fn main() {
16+
match Enum::A(0) {
17+
Enum::D(d) => consume(d),
18+
Enum::C(c) => consume(c),
19+
Enum::B(b) => consume(b),
20+
Enum::A(a) => consume(a),
21+
}
22+
}
23+
24+
#[inline(never)]
25+
#[coverage(off)]
26+
fn consume(x: u32) {
27+
core::hint::black_box(x);
28+
}

0 commit comments

Comments
 (0)