Skip to content

Commit e1b5fb4

Browse files
author
zhuyunxing
committed
coverage. Add mcdc test for if and put mcdc warnings in alphabetical order
1 parent 639844c commit e1b5fb4

File tree

4 files changed

+467
-2
lines changed

4 files changed

+467
-2
lines changed

compiler/rustc_mir_build/messages.ftl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,8 @@ mir_build_deref_raw_pointer_requires_unsafe_unsafe_op_in_unsafe_fn_allowed =
9797
.note = raw pointers may be null, dangling or unaligned; they can violate aliasing rules and cause data races: all of these are undefined behavior
9898
.label = dereference of raw pointer
9999
100+
mir_build_exceeds_mcdc_condition_num_limit = Conditions number of the decision ({$conditions_num}) exceeds limit ({$max_conditions_num}). MCDC analysis will not count this expression.
101+
100102
mir_build_extern_static_requires_unsafe =
101103
use of extern static is unsafe and requires unsafe block
102104
.note = extern statics are not controlled by the Rust type system: invalid data, aliasing violations or data races will cause undefined behavior
@@ -406,5 +408,3 @@ mir_build_unused_unsafe_enclosing_block_label = because it's nested under this `
406408
mir_build_variant_defined_here = not covered
407409
408410
mir_build_wrap_suggestion = consider wrapping the function body in an unsafe block
409-
410-
mir_build_exceeds_mcdc_condition_num_limit = Conditions number of the decision ({$conditions_num}) exceeds limit ({$max_conditions_num}). MCDC analysis will not count this expression.

tests/coverage/mcdc_if.cov-map

Lines changed: 170 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,170 @@
1+
Function name: mcdc_if::mcdc_check_a
2+
Raw bytes (64): 0x[01, 01, 04, 01, 05, 09, 02, 0d, 0f, 09, 02, 08, 01, 0e, 01, 01, 09, 28, 00, 02, 01, 08, 00, 0e, 30, 05, 02, 01, 02, 00, 00, 08, 00, 09, 05, 00, 0d, 00, 0e, 30, 0d, 09, 02, 00, 00, 00, 0d, 00, 0e, 0d, 00, 0f, 02, 06, 0f, 02, 0c, 02, 06, 0b, 03, 01, 00, 02]
3+
Number of files: 1
4+
- file 0 => global file 1
5+
Number of expressions: 4
6+
- expression 0 operands: lhs = Counter(0), rhs = Counter(1)
7+
- expression 1 operands: lhs = Counter(2), rhs = Expression(0, Sub)
8+
- expression 2 operands: lhs = Counter(3), rhs = Expression(3, Add)
9+
- expression 3 operands: lhs = Counter(2), rhs = Expression(0, Sub)
10+
Number of file 0 mappings: 8
11+
- Code(Counter(0)) at (prev + 14, 1) to (start + 1, 9)
12+
- MCDCDecision { bitmap_idx: 0, conditions_num: 2 } at (prev + 1, 8) to (start + 0, 14)
13+
- MCDCBranch { true: Counter(1), false: Expression(0, Sub), condition_id: 1, true_next_id: 2, false_next_id: 0 } at (prev + 0, 8) to (start + 0, 9)
14+
true = c1
15+
false = (c0 - c1)
16+
- Code(Counter(1)) at (prev + 0, 13) to (start + 0, 14)
17+
- MCDCBranch { true: Counter(3), false: Counter(2), condition_id: 2, true_next_id: 0, false_next_id: 0 } at (prev + 0, 13) to (start + 0, 14)
18+
true = c3
19+
false = c2
20+
- Code(Counter(3)) at (prev + 0, 15) to (start + 2, 6)
21+
- Code(Expression(3, Add)) at (prev + 2, 12) to (start + 2, 6)
22+
= (c2 + (c0 - c1))
23+
- Code(Expression(2, Add)) at (prev + 3, 1) to (start + 0, 2)
24+
= (c3 + (c2 + (c0 - c1)))
25+
26+
Function name: mcdc_if::mcdc_check_b
27+
Raw bytes (64): 0x[01, 01, 04, 01, 05, 09, 02, 0d, 0f, 09, 02, 08, 01, 16, 01, 01, 09, 28, 00, 02, 01, 08, 00, 0e, 30, 05, 02, 01, 02, 00, 00, 08, 00, 09, 05, 00, 0d, 00, 0e, 30, 0d, 09, 02, 00, 00, 00, 0d, 00, 0e, 0d, 00, 0f, 02, 06, 0f, 02, 0c, 02, 06, 0b, 03, 01, 00, 02]
28+
Number of files: 1
29+
- file 0 => global file 1
30+
Number of expressions: 4
31+
- expression 0 operands: lhs = Counter(0), rhs = Counter(1)
32+
- expression 1 operands: lhs = Counter(2), rhs = Expression(0, Sub)
33+
- expression 2 operands: lhs = Counter(3), rhs = Expression(3, Add)
34+
- expression 3 operands: lhs = Counter(2), rhs = Expression(0, Sub)
35+
Number of file 0 mappings: 8
36+
- Code(Counter(0)) at (prev + 22, 1) to (start + 1, 9)
37+
- MCDCDecision { bitmap_idx: 0, conditions_num: 2 } at (prev + 1, 8) to (start + 0, 14)
38+
- MCDCBranch { true: Counter(1), false: Expression(0, Sub), condition_id: 1, true_next_id: 2, false_next_id: 0 } at (prev + 0, 8) to (start + 0, 9)
39+
true = c1
40+
false = (c0 - c1)
41+
- Code(Counter(1)) at (prev + 0, 13) to (start + 0, 14)
42+
- MCDCBranch { true: Counter(3), false: Counter(2), condition_id: 2, true_next_id: 0, false_next_id: 0 } at (prev + 0, 13) to (start + 0, 14)
43+
true = c3
44+
false = c2
45+
- Code(Counter(3)) at (prev + 0, 15) to (start + 2, 6)
46+
- Code(Expression(3, Add)) at (prev + 2, 12) to (start + 2, 6)
47+
= (c2 + (c0 - c1))
48+
- Code(Expression(2, Add)) at (prev + 3, 1) to (start + 0, 2)
49+
= (c3 + (c2 + (c0 - c1)))
50+
51+
Function name: mcdc_if::mcdc_check_both
52+
Raw bytes (64): 0x[01, 01, 04, 01, 05, 09, 02, 0d, 0f, 09, 02, 08, 01, 1e, 01, 01, 09, 28, 00, 02, 01, 08, 00, 0e, 30, 05, 02, 01, 02, 00, 00, 08, 00, 09, 05, 00, 0d, 00, 0e, 30, 0d, 09, 02, 00, 00, 00, 0d, 00, 0e, 0d, 00, 0f, 02, 06, 0f, 02, 0c, 02, 06, 0b, 03, 01, 00, 02]
53+
Number of files: 1
54+
- file 0 => global file 1
55+
Number of expressions: 4
56+
- expression 0 operands: lhs = Counter(0), rhs = Counter(1)
57+
- expression 1 operands: lhs = Counter(2), rhs = Expression(0, Sub)
58+
- expression 2 operands: lhs = Counter(3), rhs = Expression(3, Add)
59+
- expression 3 operands: lhs = Counter(2), rhs = Expression(0, Sub)
60+
Number of file 0 mappings: 8
61+
- Code(Counter(0)) at (prev + 30, 1) to (start + 1, 9)
62+
- MCDCDecision { bitmap_idx: 0, conditions_num: 2 } at (prev + 1, 8) to (start + 0, 14)
63+
- MCDCBranch { true: Counter(1), false: Expression(0, Sub), condition_id: 1, true_next_id: 2, false_next_id: 0 } at (prev + 0, 8) to (start + 0, 9)
64+
true = c1
65+
false = (c0 - c1)
66+
- Code(Counter(1)) at (prev + 0, 13) to (start + 0, 14)
67+
- MCDCBranch { true: Counter(3), false: Counter(2), condition_id: 2, true_next_id: 0, false_next_id: 0 } at (prev + 0, 13) to (start + 0, 14)
68+
true = c3
69+
false = c2
70+
- Code(Counter(3)) at (prev + 0, 15) to (start + 2, 6)
71+
- Code(Expression(3, Add)) at (prev + 2, 12) to (start + 2, 6)
72+
= (c2 + (c0 - c1))
73+
- Code(Expression(2, Add)) at (prev + 3, 1) to (start + 0, 2)
74+
= (c3 + (c2 + (c0 - c1)))
75+
76+
Function name: mcdc_if::mcdc_check_neither
77+
Raw bytes (64): 0x[01, 01, 04, 01, 05, 09, 02, 0d, 0f, 09, 02, 08, 01, 06, 01, 01, 09, 28, 00, 02, 01, 08, 00, 0e, 30, 05, 02, 01, 02, 00, 00, 08, 00, 09, 05, 00, 0d, 00, 0e, 30, 0d, 09, 02, 00, 00, 00, 0d, 00, 0e, 0d, 00, 0f, 02, 06, 0f, 02, 0c, 02, 06, 0b, 03, 01, 00, 02]
78+
Number of files: 1
79+
- file 0 => global file 1
80+
Number of expressions: 4
81+
- expression 0 operands: lhs = Counter(0), rhs = Counter(1)
82+
- expression 1 operands: lhs = Counter(2), rhs = Expression(0, Sub)
83+
- expression 2 operands: lhs = Counter(3), rhs = Expression(3, Add)
84+
- expression 3 operands: lhs = Counter(2), rhs = Expression(0, Sub)
85+
Number of file 0 mappings: 8
86+
- Code(Counter(0)) at (prev + 6, 1) to (start + 1, 9)
87+
- MCDCDecision { bitmap_idx: 0, conditions_num: 2 } at (prev + 1, 8) to (start + 0, 14)
88+
- MCDCBranch { true: Counter(1), false: Expression(0, Sub), condition_id: 1, true_next_id: 2, false_next_id: 0 } at (prev + 0, 8) to (start + 0, 9)
89+
true = c1
90+
false = (c0 - c1)
91+
- Code(Counter(1)) at (prev + 0, 13) to (start + 0, 14)
92+
- MCDCBranch { true: Counter(3), false: Counter(2), condition_id: 2, true_next_id: 0, false_next_id: 0 } at (prev + 0, 13) to (start + 0, 14)
93+
true = c3
94+
false = c2
95+
- Code(Counter(3)) at (prev + 0, 15) to (start + 2, 6)
96+
- Code(Expression(3, Add)) at (prev + 2, 12) to (start + 2, 6)
97+
= (c2 + (c0 - c1))
98+
- Code(Expression(2, Add)) at (prev + 3, 1) to (start + 0, 2)
99+
= (c3 + (c2 + (c0 - c1)))
100+
101+
Function name: mcdc_if::mcdc_check_not_tree_decision
102+
Raw bytes (87): 0x[01, 01, 08, 01, 05, 02, 09, 05, 09, 0d, 1e, 02, 09, 11, 1b, 0d, 1e, 02, 09, 0a, 01, 30, 01, 03, 0a, 28, 00, 03, 03, 08, 00, 15, 30, 05, 02, 01, 02, 03, 00, 09, 00, 0a, 02, 00, 0e, 00, 0f, 30, 09, 1e, 03, 02, 00, 00, 0e, 00, 0f, 0b, 00, 14, 00, 15, 30, 11, 0d, 02, 00, 00, 00, 14, 00, 15, 11, 00, 16, 02, 06, 1b, 02, 0c, 02, 06, 17, 03, 01, 00, 02]
103+
Number of files: 1
104+
- file 0 => global file 1
105+
Number of expressions: 8
106+
- expression 0 operands: lhs = Counter(0), rhs = Counter(1)
107+
- expression 1 operands: lhs = Expression(0, Sub), rhs = Counter(2)
108+
- expression 2 operands: lhs = Counter(1), rhs = Counter(2)
109+
- expression 3 operands: lhs = Counter(3), rhs = Expression(7, Sub)
110+
- expression 4 operands: lhs = Expression(0, Sub), rhs = Counter(2)
111+
- expression 5 operands: lhs = Counter(4), rhs = Expression(6, Add)
112+
- expression 6 operands: lhs = Counter(3), rhs = Expression(7, Sub)
113+
- expression 7 operands: lhs = Expression(0, Sub), rhs = Counter(2)
114+
Number of file 0 mappings: 10
115+
- Code(Counter(0)) at (prev + 48, 1) to (start + 3, 10)
116+
- MCDCDecision { bitmap_idx: 0, conditions_num: 3 } at (prev + 3, 8) to (start + 0, 21)
117+
- MCDCBranch { true: Counter(1), false: Expression(0, Sub), condition_id: 1, true_next_id: 2, false_next_id: 3 } at (prev + 0, 9) to (start + 0, 10)
118+
true = c1
119+
false = (c0 - c1)
120+
- Code(Expression(0, Sub)) at (prev + 0, 14) to (start + 0, 15)
121+
= (c0 - c1)
122+
- MCDCBranch { true: Counter(2), false: Expression(7, Sub), condition_id: 3, true_next_id: 2, false_next_id: 0 } at (prev + 0, 14) to (start + 0, 15)
123+
true = c2
124+
false = ((c0 - c1) - c2)
125+
- Code(Expression(2, Add)) at (prev + 0, 20) to (start + 0, 21)
126+
= (c1 + c2)
127+
- MCDCBranch { true: Counter(4), false: Counter(3), condition_id: 2, true_next_id: 0, false_next_id: 0 } at (prev + 0, 20) to (start + 0, 21)
128+
true = c4
129+
false = c3
130+
- Code(Counter(4)) at (prev + 0, 22) to (start + 2, 6)
131+
- Code(Expression(6, Add)) at (prev + 2, 12) to (start + 2, 6)
132+
= (c3 + ((c0 - c1) - c2))
133+
- Code(Expression(5, Add)) at (prev + 3, 1) to (start + 0, 2)
134+
= (c4 + (c3 + ((c0 - c1) - c2)))
135+
136+
Function name: mcdc_if::mcdc_check_tree_decision
137+
Raw bytes (87): 0x[01, 01, 08, 01, 05, 05, 0d, 05, 0d, 0d, 11, 09, 02, 1b, 1f, 0d, 11, 09, 02, 0a, 01, 26, 01, 03, 09, 28, 00, 03, 03, 08, 00, 15, 30, 05, 02, 01, 02, 00, 00, 08, 00, 09, 05, 00, 0e, 00, 0f, 30, 0d, 0a, 02, 00, 03, 00, 0e, 00, 0f, 0a, 00, 13, 00, 14, 30, 11, 09, 03, 00, 00, 00, 13, 00, 14, 1b, 00, 16, 02, 06, 1f, 02, 0c, 02, 06, 17, 03, 01, 00, 02]
138+
Number of files: 1
139+
- file 0 => global file 1
140+
Number of expressions: 8
141+
- expression 0 operands: lhs = Counter(0), rhs = Counter(1)
142+
- expression 1 operands: lhs = Counter(1), rhs = Counter(3)
143+
- expression 2 operands: lhs = Counter(1), rhs = Counter(3)
144+
- expression 3 operands: lhs = Counter(3), rhs = Counter(4)
145+
- expression 4 operands: lhs = Counter(2), rhs = Expression(0, Sub)
146+
- expression 5 operands: lhs = Expression(6, Add), rhs = Expression(7, Add)
147+
- expression 6 operands: lhs = Counter(3), rhs = Counter(4)
148+
- expression 7 operands: lhs = Counter(2), rhs = Expression(0, Sub)
149+
Number of file 0 mappings: 10
150+
- Code(Counter(0)) at (prev + 38, 1) to (start + 3, 9)
151+
- MCDCDecision { bitmap_idx: 0, conditions_num: 3 } at (prev + 3, 8) to (start + 0, 21)
152+
- MCDCBranch { true: Counter(1), false: Expression(0, Sub), condition_id: 1, true_next_id: 2, false_next_id: 0 } at (prev + 0, 8) to (start + 0, 9)
153+
true = c1
154+
false = (c0 - c1)
155+
- Code(Counter(1)) at (prev + 0, 14) to (start + 0, 15)
156+
- MCDCBranch { true: Counter(3), false: Expression(2, Sub), condition_id: 2, true_next_id: 0, false_next_id: 3 } at (prev + 0, 14) to (start + 0, 15)
157+
true = c3
158+
false = (c1 - c3)
159+
- Code(Expression(2, Sub)) at (prev + 0, 19) to (start + 0, 20)
160+
= (c1 - c3)
161+
- MCDCBranch { true: Counter(4), false: Counter(2), condition_id: 3, true_next_id: 0, false_next_id: 0 } at (prev + 0, 19) to (start + 0, 20)
162+
true = c4
163+
false = c2
164+
- Code(Expression(6, Add)) at (prev + 0, 22) to (start + 2, 6)
165+
= (c3 + c4)
166+
- Code(Expression(7, Add)) at (prev + 2, 12) to (start + 2, 6)
167+
= (c2 + (c0 - c1))
168+
- Code(Expression(5, Add)) at (prev + 3, 1) to (start + 0, 2)
169+
= ((c3 + c4) + (c2 + (c0 - c1)))
170+

tests/coverage/mcdc_if.coverage

Lines changed: 208 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,208 @@
1+
LL| |#![feature(coverage_attribute)]
2+
LL| |//@ edition: 2021
3+
LL| |//@ compile-flags: -Zcoverage-options=mcdc
4+
LL| |//@ llvm-cov-flags: --show-mcdc
5+
LL| |
6+
LL| 2|fn mcdc_check_neither(a: bool, b: bool) {
7+
LL| 2| if a && b {
8+
^0
9+
------------------
10+
|---> MC/DC Decision Region (7:8) to (7:14)
11+
|
12+
| Number of Conditions: 2
13+
| Condition C1 --> (7:8)
14+
| Condition C2 --> (7:13)
15+
|
16+
| Executed MC/DC Test Vectors:
17+
|
18+
| C1, C2 Result
19+
| 1 { F, - = F }
20+
|
21+
| C1-Pair: not covered
22+
| C2-Pair: not covered
23+
| MC/DC Coverage for Decision: 0.00%
24+
|
25+
------------------
26+
LL| 0| say("a and b");
27+
LL| 2| } else {
28+
LL| 2| say("not both");
29+
LL| 2| }
30+
LL| 2|}
31+
LL| |
32+
LL| 2|fn mcdc_check_a(a: bool, b: bool) {
33+
LL| 2| if a && b {
34+
^1
35+
------------------
36+
|---> MC/DC Decision Region (15:8) to (15:14)
37+
|
38+
| Number of Conditions: 2
39+
| Condition C1 --> (15:8)
40+
| Condition C2 --> (15:13)
41+
|
42+
| Executed MC/DC Test Vectors:
43+
|
44+
| C1, C2 Result
45+
| 1 { F, - = F }
46+
| 2 { T, T = T }
47+
|
48+
| C1-Pair: covered: (1,2)
49+
| C2-Pair: not covered
50+
| MC/DC Coverage for Decision: 50.00%
51+
|
52+
------------------
53+
LL| 1| say("a and b");
54+
LL| 1| } else {
55+
LL| 1| say("not both");
56+
LL| 1| }
57+
LL| 2|}
58+
LL| |
59+
LL| 2|fn mcdc_check_b(a: bool, b: bool) {
60+
LL| 2| if a && b {
61+
------------------
62+
|---> MC/DC Decision Region (23:8) to (23:14)
63+
|
64+
| Number of Conditions: 2
65+
| Condition C1 --> (23:8)
66+
| Condition C2 --> (23:13)
67+
|
68+
| Executed MC/DC Test Vectors:
69+
|
70+
| C1, C2 Result
71+
| 1 { T, F = F }
72+
| 2 { T, T = T }
73+
|
74+
| C1-Pair: not covered
75+
| C2-Pair: covered: (1,2)
76+
| MC/DC Coverage for Decision: 50.00%
77+
|
78+
------------------
79+
LL| 1| say("a and b");
80+
LL| 1| } else {
81+
LL| 1| say("not both");
82+
LL| 1| }
83+
LL| 2|}
84+
LL| |
85+
LL| 3|fn mcdc_check_both(a: bool, b: bool) {
86+
LL| 3| if a && b {
87+
^2
88+
------------------
89+
|---> MC/DC Decision Region (31:8) to (31:14)
90+
|
91+
| Number of Conditions: 2
92+
| Condition C1 --> (31:8)
93+
| Condition C2 --> (31:13)
94+
|
95+
| Executed MC/DC Test Vectors:
96+
|
97+
| C1, C2 Result
98+
| 1 { F, - = F }
99+
| 2 { T, F = F }
100+
| 3 { T, T = T }
101+
|
102+
| C1-Pair: covered: (1,3)
103+
| C2-Pair: covered: (2,3)
104+
| MC/DC Coverage for Decision: 100.00%
105+
|
106+
------------------
107+
LL| 1| say("a and b");
108+
LL| 2| } else {
109+
LL| 2| say("not both");
110+
LL| 2| }
111+
LL| 3|}
112+
LL| |
113+
LL| 4|fn mcdc_check_tree_decision(a: bool, b: bool, c: bool) {
114+
LL| 4| // This expression is intentionally written in a way
115+
LL| 4| // where 100% branch coverage indicates 100% mcdc coverage.
116+
LL| 4| if a && (b || c) {
117+
^3 ^2
118+
------------------
119+
|---> MC/DC Decision Region (41:8) to (41:21)
120+
|
121+
| Number of Conditions: 3
122+
| Condition C1 --> (41:8)
123+
| Condition C2 --> (41:14)
124+
| Condition C3 --> (41:19)
125+
|
126+
| Executed MC/DC Test Vectors:
127+
|
128+
| C1, C2, C3 Result
129+
| 1 { F, -, - = F }
130+
| 2 { T, F, F = F }
131+
| 3 { T, T, - = T }
132+
| 4 { T, F, T = T }
133+
|
134+
| C1-Pair: covered: (1,3)
135+
| C2-Pair: covered: (2,3)
136+
| C3-Pair: covered: (2,4)
137+
| MC/DC Coverage for Decision: 100.00%
138+
|
139+
------------------
140+
LL| 2| say("pass");
141+
LL| 2| } else {
142+
LL| 2| say("reject");
143+
LL| 2| }
144+
LL| 4|}
145+
LL| |
146+
LL| 4|fn mcdc_check_not_tree_decision(a: bool, b: bool, c: bool) {
147+
LL| 4| // Contradict to `mcdc_check_tree_decision`,
148+
LL| 4| // 100% branch coverage of this expression does not mean indicates 100% mcdc coverage.
149+
LL| 4| if (a || b) && c {
150+
^1
151+
------------------
152+
|---> MC/DC Decision Region (51:8) to (51:21)
153+
|
154+
| Number of Conditions: 3
155+
| Condition C1 --> (51:9)
156+
| Condition C2 --> (51:14)
157+
| Condition C3 --> (51:20)
158+
|
159+
| Executed MC/DC Test Vectors:
160+
|
161+
| C1, C2, C3 Result
162+
| 1 { T, -, F = F }
163+
| 2 { T, -, T = T }
164+
| 3 { F, T, T = T }
165+
|
166+
| C1-Pair: not covered
167+
| C2-Pair: not covered
168+
| C3-Pair: covered: (1,2)
169+
| MC/DC Coverage for Decision: 33.33%
170+
|
171+
------------------
172+
LL| 2| say("pass");
173+
LL| 2| } else {
174+
LL| 2| say("reject");
175+
LL| 2| }
176+
LL| 4|}
177+
LL| |
178+
LL| |#[coverage(off)]
179+
LL| |fn main() {
180+
LL| | mcdc_check_neither(false, false);
181+
LL| | mcdc_check_neither(false, true);
182+
LL| |
183+
LL| | mcdc_check_a(true, true);
184+
LL| | mcdc_check_a(false, true);
185+
LL| |
186+
LL| | mcdc_check_b(true, true);
187+
LL| | mcdc_check_b(true, false);
188+
LL| |
189+
LL| | mcdc_check_both(false, true);
190+
LL| | mcdc_check_both(true, true);
191+
LL| | mcdc_check_both(true, false);
192+
LL| |
193+
LL| | mcdc_check_tree_decision(false, true, true);
194+
LL| | mcdc_check_tree_decision(true, true, false);
195+
LL| | mcdc_check_tree_decision(true, false, false);
196+
LL| | mcdc_check_tree_decision(true, false, true);
197+
LL| |
198+
LL| | mcdc_check_not_tree_decision(false, true, true);
199+
LL| | mcdc_check_not_tree_decision(true, true, false);
200+
LL| | mcdc_check_not_tree_decision(true, false, false);
201+
LL| | mcdc_check_not_tree_decision(true, false, true);
202+
LL| |}
203+
LL| |
204+
LL| |#[coverage(off)]
205+
LL| |fn say(message: &str) {
206+
LL| | core::hint::black_box(message);
207+
LL| |}
208+

0 commit comments

Comments
 (0)