rust/tests/coverage
Jubilee feb879394a
Rollup merge of #118666 - Zalathar:body-closure, r=cjgillot
coverage: Simplify the heuristic for ignoring `async fn` return spans

The code for extracting coverage spans from MIR has a special heuristic for dealing with `async fn`, so that the function's closing brace does not have a confusing double count.

The code implementing that heuristic is currently mixed in with the code for flushing remaining spans after the main refinement loop, making the refinement code harder to understand.

We can solve that by hoisting the heuristic to an earlier stage, after the spans have been extracted and sorted but before they have been processed by the refinement loop.

The coverage tests verify that the heuristic is still effective, so coverage mappings/reports for `async fn` have not changed.

---

This PR also has the side-effect of fixing the `None some_prev` panic that started appearing after #118525.

The old code assumed that `prev` would always be present after the refinement loop. That was only true if the list of collected spans was non-empty, but prior to #118525 that didn't seem to come up in practice. After that change, the list of collected spans could be empty in some specific circumstances, leading to panics.

The new code uses an `if let` to inspect `prev`, which correctly does nothing if there is no span present.
2023-12-09 00:48:10 -08:00
..
auxiliary coverage: Regression test for #117788 2023-11-13 12:31:44 +11:00
abort.cov-map coverage: Migrate tests/coverage-map into tests/coverage 2023-11-07 11:15:19 +11:00
abort.coverage coverage: Migrate tests/run-coverage into tests/coverage 2023-11-07 11:15:19 +11:00
abort.rs coverage: Migrate tests/run-coverage into tests/coverage 2023-11-07 11:15:19 +11:00
assert.cov-map coverage: Migrate tests/coverage-map into tests/coverage 2023-11-07 11:15:19 +11:00
assert.coverage coverage: Migrate tests/run-coverage into tests/coverage 2023-11-07 11:15:19 +11:00
assert.rs coverage: Migrate tests/run-coverage into tests/coverage 2023-11-07 11:15:19 +11:00
async2.cov-map coverage: Skip spans that can't be un-expanded back to the function body 2023-12-03 12:35:33 +11:00
async2.coverage coverage: Migrate tests/run-coverage into tests/coverage 2023-11-07 11:15:19 +11:00
async2.rs coverage: Migrate tests/run-coverage into tests/coverage 2023-11-07 11:15:19 +11:00
async.cov-map coverage: Skip spans that can't be un-expanded back to the function body 2023-12-03 12:35:33 +11:00
async.coverage coverage: Migrate tests/run-coverage into tests/coverage 2023-11-07 11:15:19 +11:00
async.rs coverage: Migrate tests/run-coverage into tests/coverage 2023-11-07 11:15:19 +11:00
bad_counter_ids.cov-map coverage: Migrate tests/coverage-map into tests/coverage 2023-11-07 11:15:19 +11:00
bad_counter_ids.coverage coverage: Migrate tests/run-coverage into tests/coverage 2023-11-07 11:15:19 +11:00
bad_counter_ids.rs coverage: Migrate tests/run-coverage into tests/coverage 2023-11-07 11:15:19 +11:00
closure_bug.cov-map coverage: Migrate tests/coverage-map into tests/coverage 2023-11-07 11:15:19 +11:00
closure_bug.coverage coverage: Migrate tests/run-coverage into tests/coverage 2023-11-07 11:15:19 +11:00
closure_bug.rs coverage: Migrate tests/run-coverage into tests/coverage 2023-11-07 11:15:19 +11:00
closure_macro_async.cov-map coverage: Migrate tests/coverage-map into tests/coverage 2023-11-07 11:15:19 +11:00
closure_macro_async.coverage coverage: Migrate tests/run-coverage into tests/coverage 2023-11-07 11:15:19 +11:00
closure_macro_async.rs coverage: Migrate tests/run-coverage into tests/coverage 2023-11-07 11:15:19 +11:00
closure_macro.cov-map coverage: Migrate tests/coverage-map into tests/coverage 2023-11-07 11:15:19 +11:00
closure_macro.coverage coverage: Migrate tests/run-coverage into tests/coverage 2023-11-07 11:15:19 +11:00
closure_macro.rs coverage: Migrate tests/run-coverage into tests/coverage 2023-11-07 11:15:19 +11:00
closure.cov-map coverage: Migrate tests/coverage-map into tests/coverage 2023-11-07 11:15:19 +11:00
closure.coverage coverage: Migrate tests/run-coverage into tests/coverage 2023-11-07 11:15:19 +11:00
closure.rs coverage: Migrate tests/run-coverage into tests/coverage 2023-11-07 11:15:19 +11:00
conditions.cov-map coverage: Simplify building coverage expressions based on sums 2023-11-25 12:29:20 +11:00
conditions.coverage coverage: Migrate tests/run-coverage into tests/coverage 2023-11-07 11:15:19 +11:00
conditions.rs coverage: Migrate tests/run-coverage into tests/coverage 2023-11-07 11:15:19 +11:00
continue.cov-map coverage: Simplify building coverage expressions based on sums 2023-11-25 12:29:20 +11:00
continue.coverage coverage: Migrate tests/run-coverage into tests/coverage 2023-11-07 11:15:19 +11:00
continue.rs coverage: Migrate tests/run-coverage into tests/coverage 2023-11-07 11:15:19 +11:00
coroutine.cov-map coverage: Simplify building coverage expressions based on sums 2023-11-25 12:29:20 +11:00
coroutine.coverage coverage: Migrate tests/run-coverage into tests/coverage 2023-11-07 11:15:19 +11:00
coroutine.rs coverage: Migrate tests/run-coverage into tests/coverage 2023-11-07 11:15:19 +11:00
dead_code.cov-map coverage: Migrate tests/coverage-map into tests/coverage 2023-11-07 11:15:19 +11:00
dead_code.coverage coverage: Migrate tests/run-coverage into tests/coverage 2023-11-07 11:15:19 +11:00
dead_code.rs coverage: Migrate tests/run-coverage into tests/coverage 2023-11-07 11:15:19 +11:00
drop_trait.cov-map coverage: Migrate tests/coverage-map into tests/coverage 2023-11-07 11:15:19 +11:00
drop_trait.coverage coverage: Migrate tests/run-coverage into tests/coverage 2023-11-07 11:15:19 +11:00
drop_trait.rs coverage: Migrate tests/run-coverage into tests/coverage 2023-11-07 11:15:19 +11:00
fn_sig_into_try.cov-map coverage: Migrate tests/coverage-map into tests/coverage 2023-11-07 11:15:19 +11:00
fn_sig_into_try.coverage coverage: Migrate tests/run-coverage into tests/coverage 2023-11-07 11:15:19 +11:00
fn_sig_into_try.rs coverage: Migrate tests/run-coverage into tests/coverage 2023-11-07 11:15:19 +11:00
generics.cov-map coverage: Migrate tests/coverage-map into tests/coverage 2023-11-07 11:15:19 +11:00
generics.coverage coverage: Migrate tests/run-coverage into tests/coverage 2023-11-07 11:15:19 +11:00
generics.rs coverage: Migrate tests/run-coverage into tests/coverage 2023-11-07 11:15:19 +11:00
if_else.cov-map coverage: Migrate tests/coverage-map into tests/coverage 2023-11-07 11:15:19 +11:00
if_else.coverage coverage: Migrate tests/run-coverage into tests/coverage 2023-11-07 11:15:19 +11:00
if_else.rs coverage: Migrate tests/run-coverage into tests/coverage 2023-11-07 11:15:19 +11:00
if_not.cov-map coverage: Use SpanMarker to mark the full condition of if ! 2023-12-08 22:40:49 +11:00
if_not.coverage coverage: Use SpanMarker to mark the full condition of if ! 2023-12-08 22:40:49 +11:00
if_not.rs coverage: Add a dedicated test for coverage of if ! 2023-12-08 22:40:49 +11:00
if.cov-map coverage: Migrate tests/coverage-map into tests/coverage 2023-11-07 11:15:19 +11:00
if.coverage coverage: Migrate tests/run-coverage into tests/coverage 2023-11-07 11:15:19 +11:00
if.rs coverage: Migrate tests/run-coverage into tests/coverage 2023-11-07 11:15:19 +11:00
inline-dead.cov-map coverage: Migrate tests/coverage-map into tests/coverage 2023-11-07 11:15:19 +11:00
inline-dead.coverage coverage: Migrate tests/run-coverage into tests/coverage 2023-11-07 11:15:19 +11:00
inline-dead.rs coverage: Migrate tests/run-coverage into tests/coverage 2023-11-07 11:15:19 +11:00
inline.cov-map coverage: Skip spans that can't be un-expanded back to the function body 2023-12-03 12:35:33 +11:00
inline.coverage coverage: Skip spans that can't be un-expanded back to the function body 2023-12-03 12:35:33 +11:00
inline.rs coverage: Migrate tests/run-coverage into tests/coverage 2023-11-07 11:15:19 +11:00
inner_items.cov-map coverage: Migrate tests/coverage-map into tests/coverage 2023-11-07 11:15:19 +11:00
inner_items.coverage coverage: Migrate tests/run-coverage into tests/coverage 2023-11-07 11:15:19 +11:00
inner_items.rs coverage: Migrate tests/run-coverage into tests/coverage 2023-11-07 11:15:19 +11:00
issue-83601.cov-map coverage: Migrate tests/coverage-map into tests/coverage 2023-11-07 11:15:19 +11:00
issue-83601.coverage coverage: Migrate tests/run-coverage into tests/coverage 2023-11-07 11:15:19 +11:00
issue-83601.rs coverage: Migrate tests/run-coverage into tests/coverage 2023-11-07 11:15:19 +11:00
issue-84561.cov-map coverage: Migrate tests/coverage-map into tests/coverage 2023-11-07 11:15:19 +11:00
issue-84561.coverage coverage: Migrate tests/run-coverage into tests/coverage 2023-11-07 11:15:19 +11:00
issue-84561.rs coverage: Migrate tests/run-coverage into tests/coverage 2023-11-07 11:15:19 +11:00
issue-85461.cov-map coverage: Migrate tests/coverage-map into tests/coverage 2023-11-07 11:15:19 +11:00
issue-85461.coverage coverage: Migrate tests/run-coverage into tests/coverage 2023-11-07 11:15:19 +11:00
issue-85461.rs coverage: Migrate tests/run-coverage into tests/coverage 2023-11-07 11:15:19 +11:00
issue-93054.cov-map coverage: Migrate tests/coverage-map into tests/coverage 2023-11-07 11:15:19 +11:00
issue-93054.coverage coverage: Migrate tests/run-coverage into tests/coverage 2023-11-07 11:15:19 +11:00
issue-93054.rs coverage: Migrate tests/run-coverage into tests/coverage 2023-11-07 11:15:19 +11:00
lazy_boolean.cov-map coverage: Use SpanMarker to mark the full condition of if ! 2023-12-08 22:40:49 +11:00
lazy_boolean.coverage coverage: Use SpanMarker to mark the full condition of if ! 2023-12-08 22:40:49 +11:00
lazy_boolean.rs coverage: Migrate tests/run-coverage into tests/coverage 2023-11-07 11:15:19 +11:00
long_and_wide.cov-map coverage: Migrate tests/coverage-map into tests/coverage 2023-11-07 11:15:19 +11:00
long_and_wide.coverage coverage: Migrate tests/run-coverage into tests/coverage 2023-11-07 11:15:19 +11:00
long_and_wide.rs coverage: Migrate tests/run-coverage into tests/coverage 2023-11-07 11:15:19 +11:00
loop_break_value.cov-map coverage: Migrate tests/coverage-map into tests/coverage 2023-11-07 11:15:19 +11:00
loop_break_value.coverage coverage: Migrate tests/run-coverage into tests/coverage 2023-11-07 11:15:19 +11:00
loop_break_value.rs coverage: Migrate tests/run-coverage into tests/coverage 2023-11-07 11:15:19 +11:00
loops_branches.cov-map coverage: Simplify building coverage expressions based on sums 2023-11-25 12:29:20 +11:00
loops_branches.coverage coverage: Migrate tests/run-coverage into tests/coverage 2023-11-07 11:15:19 +11:00
loops_branches.rs coverage: Migrate tests/run-coverage into tests/coverage 2023-11-07 11:15:19 +11:00
macro_name_span.cov-map coverage: Regression test for #117788 2023-11-13 12:31:44 +11:00
macro_name_span.coverage coverage: Regression test for #117788 2023-11-13 12:31:44 +11:00
macro_name_span.rs coverage: Regression test for #117788 2023-11-13 12:31:44 +11:00
match_or_pattern.cov-map coverage: Migrate tests/coverage-map into tests/coverage 2023-11-07 11:15:19 +11:00
match_or_pattern.coverage coverage: Migrate tests/run-coverage into tests/coverage 2023-11-07 11:15:19 +11:00
match_or_pattern.rs coverage: Migrate tests/run-coverage into tests/coverage 2023-11-07 11:15:19 +11:00
nested_loops.cov-map coverage: Migrate tests/coverage-map into tests/coverage 2023-11-07 11:15:19 +11:00
nested_loops.coverage coverage: Migrate tests/run-coverage into tests/coverage 2023-11-07 11:15:19 +11:00
nested_loops.rs coverage: Migrate tests/run-coverage into tests/coverage 2023-11-07 11:15:19 +11:00
no_cov_crate.cov-map coverage: Migrate tests/coverage-map into tests/coverage 2023-11-07 11:15:19 +11:00
no_cov_crate.coverage coverage: Migrate tests/run-coverage into tests/coverage 2023-11-07 11:15:19 +11:00
no_cov_crate.rs coverage: Migrate tests/run-coverage into tests/coverage 2023-11-07 11:15:19 +11:00
no_spans.cov-map coverage: Regression test for unwrapping prev when there are no spans 2023-12-08 22:49:12 +11:00
no_spans.coverage coverage: Regression test for unwrapping prev when there are no spans 2023-12-08 22:49:12 +11:00
no_spans.rs coverage: Regression test for unwrapping prev when there are no spans 2023-12-08 22:49:12 +11:00
overflow.cov-map coverage: Migrate tests/coverage-map into tests/coverage 2023-11-07 11:15:19 +11:00
overflow.coverage coverage: Migrate tests/run-coverage into tests/coverage 2023-11-07 11:15:19 +11:00
overflow.rs coverage: Migrate tests/run-coverage into tests/coverage 2023-11-07 11:15:19 +11:00
panic_unwind.cov-map coverage: Migrate tests/coverage-map into tests/coverage 2023-11-07 11:15:19 +11:00
panic_unwind.coverage coverage: Migrate tests/run-coverage into tests/coverage 2023-11-07 11:15:19 +11:00
panic_unwind.rs coverage: Migrate tests/run-coverage into tests/coverage 2023-11-07 11:15:19 +11:00
partial_eq.cov-map coverage: Migrate tests/coverage-map into tests/coverage 2023-11-07 11:15:19 +11:00
partial_eq.coverage coverage: Migrate tests/run-coverage into tests/coverage 2023-11-07 11:15:19 +11:00
partial_eq.rs coverage: Migrate tests/run-coverage into tests/coverage 2023-11-07 11:15:19 +11:00
README.md coverage: Rename the run-coverage test mode to coverage-run 2023-11-08 16:41:24 +11:00
simple_loop.cov-map coverage: Migrate tests/coverage-map into tests/coverage 2023-11-07 11:15:19 +11:00
simple_loop.coverage coverage: Migrate tests/run-coverage into tests/coverage 2023-11-07 11:15:19 +11:00
simple_loop.rs coverage: Migrate tests/run-coverage into tests/coverage 2023-11-07 11:15:19 +11:00
simple_match.cov-map coverage: Migrate tests/coverage-map into tests/coverage 2023-11-07 11:15:19 +11:00
simple_match.coverage coverage: Migrate tests/run-coverage into tests/coverage 2023-11-07 11:15:19 +11:00
simple_match.rs coverage: Migrate tests/run-coverage into tests/coverage 2023-11-07 11:15:19 +11:00
sort_groups.cov-map coverage: Migrate tests/coverage-map into tests/coverage 2023-11-07 11:15:19 +11:00
sort_groups.coverage coverage: Migrate tests/run-coverage into tests/coverage 2023-11-07 11:15:19 +11:00
sort_groups.rs coverage: Migrate tests/run-coverage into tests/coverage 2023-11-07 11:15:19 +11:00
test_harness.cov-map coverage: Migrate tests/coverage-map into tests/coverage 2023-11-07 11:15:19 +11:00
test_harness.coverage coverage: Migrate tests/run-coverage into tests/coverage 2023-11-07 11:15:19 +11:00
test_harness.rs coverage: Migrate tests/run-coverage into tests/coverage 2023-11-07 11:15:19 +11:00
thin-lto.cov-map Add thinlto support to codegen, assembly and coverage tests 2023-11-30 18:48:03 +08:00
thin-lto.coverage Add thinlto support to codegen, assembly and coverage tests 2023-11-30 18:48:03 +08:00
thin-lto.rs Add thinlto support to codegen, assembly and coverage tests 2023-11-30 18:48:03 +08:00
tight_inf_loop.cov-map coverage: Migrate tests/coverage-map into tests/coverage 2023-11-07 11:15:19 +11:00
tight_inf_loop.coverage coverage: Migrate tests/run-coverage into tests/coverage 2023-11-07 11:15:19 +11:00
tight_inf_loop.rs coverage: Migrate tests/run-coverage into tests/coverage 2023-11-07 11:15:19 +11:00
trivial.cov-map coverage: Migrate tests/coverage-map into tests/coverage 2023-11-07 11:15:19 +11:00
trivial.coverage coverage: Migrate tests/run-coverage into tests/coverage 2023-11-07 11:15:19 +11:00
trivial.rs coverage: Migrate tests/run-coverage into tests/coverage 2023-11-07 11:15:19 +11:00
try_error_result.cov-map coverage: Simplify building coverage expressions based on sums 2023-11-25 12:29:20 +11:00
try_error_result.coverage coverage: Migrate tests/run-coverage into tests/coverage 2023-11-07 11:15:19 +11:00
try_error_result.rs coverage: Migrate tests/run-coverage into tests/coverage 2023-11-07 11:15:19 +11:00
unreachable.cov-map coverage: Skip spans that can't be un-expanded back to the function body 2023-12-03 12:35:33 +11:00
unreachable.coverage coverage: Skip spans that can't be un-expanded back to the function body 2023-12-03 12:35:33 +11:00
unreachable.rs coverage: Migrate tests/run-coverage into tests/coverage 2023-11-07 11:15:19 +11:00
unused_mod.cov-map coverage: Migrate tests/coverage-map into tests/coverage 2023-11-07 11:15:19 +11:00
unused_mod.coverage coverage: Migrate tests/run-coverage into tests/coverage 2023-11-07 11:15:19 +11:00
unused_mod.rs coverage: Migrate tests/run-coverage into tests/coverage 2023-11-07 11:15:19 +11:00
unused.cov-map coverage: Migrate tests/coverage-map into tests/coverage 2023-11-07 11:15:19 +11:00
unused.coverage coverage: Migrate tests/run-coverage into tests/coverage 2023-11-07 11:15:19 +11:00
unused.rs coverage: Migrate tests/run-coverage into tests/coverage 2023-11-07 11:15:19 +11:00
uses_crate.cov-map coverage: Migrate tests/coverage-map into tests/coverage 2023-11-07 11:15:19 +11:00
uses_crate.coverage coverage: Migrate tests/run-coverage into tests/coverage 2023-11-07 11:15:19 +11:00
uses_crate.rs coverage: Migrate tests/run-coverage into tests/coverage 2023-11-07 11:15:19 +11:00
uses_inline_crate.cov-map coverage: Migrate tests/coverage-map into tests/coverage 2023-11-07 11:15:19 +11:00
uses_inline_crate.coverage coverage: Migrate tests/run-coverage into tests/coverage 2023-11-07 11:15:19 +11:00
uses_inline_crate.rs coverage: Migrate tests/run-coverage into tests/coverage 2023-11-07 11:15:19 +11:00
while_early_ret.cov-map coverage: Migrate tests/coverage-map into tests/coverage 2023-11-07 11:15:19 +11:00
while_early_ret.coverage coverage: Migrate tests/run-coverage into tests/coverage 2023-11-07 11:15:19 +11:00
while_early_ret.rs coverage: Migrate tests/run-coverage into tests/coverage 2023-11-07 11:15:19 +11:00
while.cov-map coverage: Migrate tests/coverage-map into tests/coverage 2023-11-07 11:15:19 +11:00
while.coverage coverage: Migrate tests/run-coverage into tests/coverage 2023-11-07 11:15:19 +11:00
while.rs coverage: Migrate tests/run-coverage into tests/coverage 2023-11-07 11:15:19 +11:00
yield.cov-map coverage: Migrate tests/coverage-map into tests/coverage 2023-11-07 11:15:19 +11:00
yield.coverage coverage: Migrate tests/run-coverage into tests/coverage 2023-11-07 11:15:19 +11:00
yield.rs coverage: Migrate tests/run-coverage into tests/coverage 2023-11-07 11:15:19 +11:00

The tests in this directory are shared by two different test modes, and can be run in multiple different ways:

  • ./x.py test coverage-map (compiles to LLVM IR and checks coverage mappings)
  • ./x.py test coverage-run (runs a test binary and checks its coverage report)
  • ./x.py test coverage (runs both coverage-map and coverage-run)

Maintenance note

These tests can be sensitive to small changes in MIR spans or MIR control flow, especially in HIR-to-MIR lowering or MIR optimizations.

If you haven't touched the coverage code directly, and the tests still pass in coverage-run mode, then it should usually be OK to just re-bless the mappings as necessary with ./x.py test coverage-map --bless, without worrying too much about the exact changes.