From c45ee4bb29000cc0d02b11afa682852b5174b8a5 Mon Sep 17 00:00:00 2001 From: Rich Kadel Date: Mon, 16 Nov 2020 09:14:28 -0800 Subject: [PATCH] Coverage tests for remaining TerminatorKinds and async, improve Assert Tested and validate results for panic unwind, panic abort, assert!() macro, TerminatorKind::Assert (for example, numeric overflow), and async/await. Implemented a previous documented idea to change Assert handling to be the same as FalseUnwind and Goto, so it doesn't get its own BasicCoverageBlock anymore. This changed a couple of coverage regions, but I validated those changes are not any worse than the prior results, and probably help assure some consistency (even if some people might disagree with how the code region is consistently computed). Fixed issue with async/await. AggregateKind::Generator needs to be handled like AggregateKind::Closure; coverage span for the outer async function should not "cover" the async body, which is actually executed in a separate "closure" MIR. --- .../rustc_mir/src/util/generic_graphviz.rs | 8 +- .../source-based-code-coverage.md | 4 +- .../coverage-reports-base/Makefile | 3 + .../expected_export_coverage.abort.json | 59 +++ .../expected_export_coverage.assert.json | 59 +++ .../expected_export_coverage.async.json | 59 +++ .../expected_export_coverage.conditions.json | 28 +- .../expected_export_coverage.inner_items.json | 20 +- ...expected_export_coverage.nested_loops.json | 20 +- .../expected_export_coverage.overflow.json | 59 +++ ...expected_export_coverage.panic_unwind.json | 59 +++ .../expected_export_coverage.yield.json | 59 +++ .../expected_show_coverage.abort.txt | 35 ++ .../expected_show_coverage.assert.txt | 34 ++ .../expected_show_coverage.async.txt | 66 +++ .../expected_show_coverage.conditions.txt | 97 +++-- .../expected_show_coverage.inner_items.txt | 2 +- .../expected_show_coverage.nested_loops.txt | 2 +- .../expected_show_coverage.overflow.txt | 64 +++ .../expected_show_coverage.panic_unwind.txt | 50 +++ .../expected_show_coverage.yield.txt | 38 ++ .../expected_show_coverage_counters.abort.txt | 41 ++ ...expected_show_coverage_counters.assert.txt | 54 +++ .../expected_show_coverage_counters.async.txt | 84 ++++ ...cted_show_coverage_counters.conditions.txt | 358 +++++++++------- ...ted_show_coverage_counters.inner_items.txt | 26 +- ...ed_show_coverage_counters.nested_loops.txt | 42 +- ...pected_show_coverage_counters.overflow.txt | 53 +++ ...ed_show_coverage_counters.panic_unwind.txt | 50 +++ ...ted_show_coverage_counters.simple_loop.txt | 4 +- ...how_coverage_counters.try_error_result.txt | 8 +- ...show_coverage_counters.while_early_ret.txt | 2 +- .../expected_show_coverage_counters.yield.txt | 90 ++++ .../expected_export_coverage.abort.json | 59 +++ .../expected_export_coverage.assert.json | 59 +++ .../expected_export_coverage.async.json | 59 +++ .../expected_export_coverage.conditions.json | 28 +- .../expected_export_coverage.inner_items.json | 20 +- ...expected_export_coverage.nested_loops.json | 20 +- .../expected_export_coverage.overflow.json | 59 +++ ...expected_export_coverage.panic_unwind.json | 59 +++ .../expected_export_coverage.yield.json | 59 +++ .../expected_show_coverage.abort.txt | 35 ++ .../expected_show_coverage.assert.txt | 34 ++ .../expected_show_coverage.async.txt | 66 +++ .../expected_show_coverage.conditions.txt | 97 +++-- .../expected_show_coverage.inner_items.txt | 2 +- .../expected_show_coverage.nested_loops.txt | 2 +- .../expected_show_coverage.overflow.txt | 64 +++ .../expected_show_coverage.panic_unwind.txt | 50 +++ .../expected_show_coverage.yield.txt | 38 ++ .../expected_show_coverage_counters.abort.txt | 41 ++ ...expected_show_coverage_counters.assert.txt | 54 +++ .../expected_show_coverage_counters.async.txt | 85 ++++ ...cted_show_coverage_counters.conditions.txt | 358 +++++++++------- ...ted_show_coverage_counters.inner_items.txt | 26 +- ...ed_show_coverage_counters.nested_loops.txt | 42 +- ...pected_show_coverage_counters.overflow.txt | 53 +++ ...ed_show_coverage_counters.panic_unwind.txt | 50 +++ ...cted_show_coverage_counters.partial_eq.txt | 28 +- ...ted_show_coverage_counters.simple_loop.txt | 4 +- ...how_coverage_counters.try_error_result.txt | 8 +- ...show_coverage_counters.while_early_ret.txt | 2 +- .../expected_show_coverage_counters.yield.txt | 90 ++++ .../coverage-spanview-base/Makefile | 3 + ...ort.main.-------.InstrumentCoverage.0.html | 99 +++++ ...ht_abort.-------.InstrumentCoverage.0.html | 164 ++++++++ ...ert.main.-------.InstrumentCoverage.0.html | 103 +++++ ...l_assert.-------.InstrumentCoverage.0.html | 97 +++++ ...osure#0}.-------.InstrumentCoverage.0.html | 89 ++++ ...osure#1}.-------.InstrumentCoverage.0.html | 89 ++++ ...osure#2}.-------.InstrumentCoverage.0.html | 89 ++++ ...osure#3}.-------.InstrumentCoverage.0.html | 75 ++++ ...block_on.-------.InstrumentCoverage.0.html | 226 ++++++++++ ...osure#0}.-------.InstrumentCoverage.0.html | 75 ++++ .../async.f.-------.InstrumentCoverage.0.html | 74 ++++ ...osure#0}.-------.InstrumentCoverage.0.html | 75 ++++ ...sync.foo.-------.InstrumentCoverage.0.html | 74 ++++ ...osure#0}.-------.InstrumentCoverage.0.html | 80 ++++ .../async.g.-------.InstrumentCoverage.0.html | 79 ++++ ...osure#0}.-------.InstrumentCoverage.0.html | 80 ++++ .../async.h.-------.InstrumentCoverage.0.html | 79 ++++ ...osure#0}.-------.InstrumentCoverage.0.html | 82 ++++ .../async.i.-------.InstrumentCoverage.0.html | 79 ++++ ...ync.main.-------.InstrumentCoverage.0.html | 133 ++++++ ...ons.main.-------.InstrumentCoverage.0.html | 318 +++++++++----- ...-in_func.-------.InstrumentCoverage.0.html | 76 +++- ...ait_func.-------.InstrumentCoverage.0.html | 32 +- ...ops.main.-------.InstrumentCoverage.0.html | 56 ++- ...low.main.-------.InstrumentCoverage.0.html | 259 ++++++++++++ ...overflow.-------.InstrumentCoverage.0.html | 397 ++++++++++++++++++ ...ind.main.-------.InstrumentCoverage.0.html | 103 +++++ ...ht_panic.-------.InstrumentCoverage.0.html | 164 ++++++++ ...oop.main.-------.InstrumentCoverage.0.html | 9 +- ...ult.main.-------.InstrumentCoverage.0.html | 21 +- ...ret.main.-------.InstrumentCoverage.0.html | 9 +- ...osure#0}.-------.InstrumentCoverage.0.html | 79 ++++ ...osure#1}.-------.InstrumentCoverage.0.html | 81 ++++ ...eld.main.-------.InstrumentCoverage.0.html | 138 ++++++ ...ort.main.-------.InstrumentCoverage.0.html | 99 +++++ ...ht_abort.-------.InstrumentCoverage.0.html | 164 ++++++++ ...ert.main.-------.InstrumentCoverage.0.html | 103 +++++ ...l_assert.-------.InstrumentCoverage.0.html | 97 +++++ ...osure#0}.-------.InstrumentCoverage.0.html | 89 ++++ ...osure#1}.-------.InstrumentCoverage.0.html | 89 ++++ ...osure#2}.-------.InstrumentCoverage.0.html | 89 ++++ ...osure#3}.-------.InstrumentCoverage.0.html | 75 ++++ ...block_on.-------.InstrumentCoverage.0.html | 226 ++++++++++ ...osure#0}.-------.InstrumentCoverage.0.html | 75 ++++ .../async.f.-------.InstrumentCoverage.0.html | 74 ++++ ...osure#0}.-------.InstrumentCoverage.0.html | 75 ++++ ...sync.foo.-------.InstrumentCoverage.0.html | 74 ++++ ...osure#0}.-------.InstrumentCoverage.0.html | 80 ++++ .../async.g.-------.InstrumentCoverage.0.html | 79 ++++ ...osure#0}.-------.InstrumentCoverage.0.html | 80 ++++ .../async.h.-------.InstrumentCoverage.0.html | 79 ++++ ...osure#0}.-------.InstrumentCoverage.0.html | 82 ++++ .../async.i.-------.InstrumentCoverage.0.html | 79 ++++ ...ync.main.-------.InstrumentCoverage.0.html | 133 ++++++ ...ons.main.-------.InstrumentCoverage.0.html | 318 +++++++++----- ...-in_func.-------.InstrumentCoverage.0.html | 76 +++- ...ait_func.-------.InstrumentCoverage.0.html | 32 +- ...ops.main.-------.InstrumentCoverage.0.html | 56 ++- ...low.main.-------.InstrumentCoverage.0.html | 259 ++++++++++++ ...overflow.-------.InstrumentCoverage.0.html | 397 ++++++++++++++++++ ...ind.main.-------.InstrumentCoverage.0.html | 103 +++++ ...ht_panic.-------.InstrumentCoverage.0.html | 164 ++++++++ ...oop.main.-------.InstrumentCoverage.0.html | 9 +- ...ult.main.-------.InstrumentCoverage.0.html | 21 +- ...ret.main.-------.InstrumentCoverage.0.html | 9 +- ...osure#0}.-------.InstrumentCoverage.0.html | 79 ++++ ...osure#1}.-------.InstrumentCoverage.0.html | 81 ++++ ...eld.main.-------.InstrumentCoverage.0.html | 138 ++++++ src/test/run-make-fulldeps/coverage/abort.rs | 34 ++ src/test/run-make-fulldeps/coverage/assert.rs | 32 ++ src/test/run-make-fulldeps/coverage/async.rs | 64 +++ .../run-make-fulldeps/coverage/conditions.rs | 36 ++ .../coverage/coverage_tools.mk | 5 - .../run-make-fulldeps/coverage/overflow.rs | 63 +++ .../coverage/panic_unwind.rs | 49 +++ src/test/run-make-fulldeps/coverage/yield.rs | 37 ++ src/tools/compiletest/src/main.rs | 2 - 142 files changed, 10107 insertions(+), 872 deletions(-) create mode 100644 src/test/run-make-fulldeps/coverage-reports-base/expected_export_coverage.abort.json create mode 100644 src/test/run-make-fulldeps/coverage-reports-base/expected_export_coverage.assert.json create mode 100644 src/test/run-make-fulldeps/coverage-reports-base/expected_export_coverage.async.json create mode 100644 src/test/run-make-fulldeps/coverage-reports-base/expected_export_coverage.overflow.json create mode 100644 src/test/run-make-fulldeps/coverage-reports-base/expected_export_coverage.panic_unwind.json create mode 100644 src/test/run-make-fulldeps/coverage-reports-base/expected_export_coverage.yield.json create mode 100644 src/test/run-make-fulldeps/coverage-reports-base/expected_show_coverage.abort.txt create mode 100644 src/test/run-make-fulldeps/coverage-reports-base/expected_show_coverage.assert.txt create mode 100644 src/test/run-make-fulldeps/coverage-reports-base/expected_show_coverage.async.txt create mode 100644 src/test/run-make-fulldeps/coverage-reports-base/expected_show_coverage.overflow.txt create mode 100644 src/test/run-make-fulldeps/coverage-reports-base/expected_show_coverage.panic_unwind.txt create mode 100644 src/test/run-make-fulldeps/coverage-reports-base/expected_show_coverage.yield.txt create mode 100644 src/test/run-make-fulldeps/coverage-reports-base/expected_show_coverage_counters.abort.txt create mode 100644 src/test/run-make-fulldeps/coverage-reports-base/expected_show_coverage_counters.assert.txt create mode 100644 src/test/run-make-fulldeps/coverage-reports-base/expected_show_coverage_counters.async.txt create mode 100644 src/test/run-make-fulldeps/coverage-reports-base/expected_show_coverage_counters.overflow.txt create mode 100644 src/test/run-make-fulldeps/coverage-reports-base/expected_show_coverage_counters.panic_unwind.txt create mode 100644 src/test/run-make-fulldeps/coverage-reports-base/expected_show_coverage_counters.yield.txt create mode 100644 src/test/run-make-fulldeps/coverage-reports-deadcode/expected_export_coverage.abort.json create mode 100644 src/test/run-make-fulldeps/coverage-reports-deadcode/expected_export_coverage.assert.json create mode 100644 src/test/run-make-fulldeps/coverage-reports-deadcode/expected_export_coverage.async.json create mode 100644 src/test/run-make-fulldeps/coverage-reports-deadcode/expected_export_coverage.overflow.json create mode 100644 src/test/run-make-fulldeps/coverage-reports-deadcode/expected_export_coverage.panic_unwind.json create mode 100644 src/test/run-make-fulldeps/coverage-reports-deadcode/expected_export_coverage.yield.json create mode 100644 src/test/run-make-fulldeps/coverage-reports-deadcode/expected_show_coverage.abort.txt create mode 100644 src/test/run-make-fulldeps/coverage-reports-deadcode/expected_show_coverage.assert.txt create mode 100644 src/test/run-make-fulldeps/coverage-reports-deadcode/expected_show_coverage.async.txt create mode 100644 src/test/run-make-fulldeps/coverage-reports-deadcode/expected_show_coverage.overflow.txt create mode 100644 src/test/run-make-fulldeps/coverage-reports-deadcode/expected_show_coverage.panic_unwind.txt create mode 100644 src/test/run-make-fulldeps/coverage-reports-deadcode/expected_show_coverage.yield.txt create mode 100644 src/test/run-make-fulldeps/coverage-reports-deadcode/expected_show_coverage_counters.abort.txt create mode 100644 src/test/run-make-fulldeps/coverage-reports-deadcode/expected_show_coverage_counters.assert.txt create mode 100644 src/test/run-make-fulldeps/coverage-reports-deadcode/expected_show_coverage_counters.async.txt create mode 100644 src/test/run-make-fulldeps/coverage-reports-deadcode/expected_show_coverage_counters.overflow.txt create mode 100644 src/test/run-make-fulldeps/coverage-reports-deadcode/expected_show_coverage_counters.panic_unwind.txt create mode 100644 src/test/run-make-fulldeps/coverage-reports-deadcode/expected_show_coverage_counters.yield.txt create mode 100644 src/test/run-make-fulldeps/coverage-spanview-base/expected_mir_dump.abort/abort.main.-------.InstrumentCoverage.0.html create mode 100644 src/test/run-make-fulldeps/coverage-spanview-base/expected_mir_dump.abort/abort.might_abort.-------.InstrumentCoverage.0.html create mode 100644 src/test/run-make-fulldeps/coverage-spanview-base/expected_mir_dump.assert/assert.main.-------.InstrumentCoverage.0.html create mode 100644 src/test/run-make-fulldeps/coverage-spanview-base/expected_mir_dump.assert/assert.might_fail_assert.-------.InstrumentCoverage.0.html create mode 100644 src/test/run-make-fulldeps/coverage-spanview-base/expected_mir_dump.async/async.executor-block_on-VTABLE-{closure#0}.-------.InstrumentCoverage.0.html create mode 100644 src/test/run-make-fulldeps/coverage-spanview-base/expected_mir_dump.async/async.executor-block_on-VTABLE-{closure#1}.-------.InstrumentCoverage.0.html create mode 100644 src/test/run-make-fulldeps/coverage-spanview-base/expected_mir_dump.async/async.executor-block_on-VTABLE-{closure#2}.-------.InstrumentCoverage.0.html create mode 100644 src/test/run-make-fulldeps/coverage-spanview-base/expected_mir_dump.async/async.executor-block_on-VTABLE-{closure#3}.-------.InstrumentCoverage.0.html create mode 100644 src/test/run-make-fulldeps/coverage-spanview-base/expected_mir_dump.async/async.executor-block_on.-------.InstrumentCoverage.0.html create mode 100644 src/test/run-make-fulldeps/coverage-spanview-base/expected_mir_dump.async/async.f-{closure#0}.-------.InstrumentCoverage.0.html create mode 100644 src/test/run-make-fulldeps/coverage-spanview-base/expected_mir_dump.async/async.f.-------.InstrumentCoverage.0.html create mode 100644 src/test/run-make-fulldeps/coverage-spanview-base/expected_mir_dump.async/async.foo-{closure#0}.-------.InstrumentCoverage.0.html create mode 100644 src/test/run-make-fulldeps/coverage-spanview-base/expected_mir_dump.async/async.foo.-------.InstrumentCoverage.0.html create mode 100644 src/test/run-make-fulldeps/coverage-spanview-base/expected_mir_dump.async/async.g-{closure#0}.-------.InstrumentCoverage.0.html create mode 100644 src/test/run-make-fulldeps/coverage-spanview-base/expected_mir_dump.async/async.g.-------.InstrumentCoverage.0.html create mode 100644 src/test/run-make-fulldeps/coverage-spanview-base/expected_mir_dump.async/async.h-{closure#0}.-------.InstrumentCoverage.0.html create mode 100644 src/test/run-make-fulldeps/coverage-spanview-base/expected_mir_dump.async/async.h.-------.InstrumentCoverage.0.html create mode 100644 src/test/run-make-fulldeps/coverage-spanview-base/expected_mir_dump.async/async.i-{closure#0}.-------.InstrumentCoverage.0.html create mode 100644 src/test/run-make-fulldeps/coverage-spanview-base/expected_mir_dump.async/async.i.-------.InstrumentCoverage.0.html create mode 100644 src/test/run-make-fulldeps/coverage-spanview-base/expected_mir_dump.async/async.main.-------.InstrumentCoverage.0.html create mode 100644 src/test/run-make-fulldeps/coverage-spanview-base/expected_mir_dump.overflow/overflow.main.-------.InstrumentCoverage.0.html create mode 100644 src/test/run-make-fulldeps/coverage-spanview-base/expected_mir_dump.overflow/overflow.might_overflow.-------.InstrumentCoverage.0.html create mode 100644 src/test/run-make-fulldeps/coverage-spanview-base/expected_mir_dump.panic_unwind/panic_unwind.main.-------.InstrumentCoverage.0.html create mode 100644 src/test/run-make-fulldeps/coverage-spanview-base/expected_mir_dump.panic_unwind/panic_unwind.might_panic.-------.InstrumentCoverage.0.html create mode 100644 src/test/run-make-fulldeps/coverage-spanview-base/expected_mir_dump.yield/yield.main-{closure#0}.-------.InstrumentCoverage.0.html create mode 100644 src/test/run-make-fulldeps/coverage-spanview-base/expected_mir_dump.yield/yield.main-{closure#1}.-------.InstrumentCoverage.0.html create mode 100644 src/test/run-make-fulldeps/coverage-spanview-base/expected_mir_dump.yield/yield.main.-------.InstrumentCoverage.0.html create mode 100644 src/test/run-make-fulldeps/coverage-spanview-deadcode/expected_mir_dump.abort/abort.main.-------.InstrumentCoverage.0.html create mode 100644 src/test/run-make-fulldeps/coverage-spanview-deadcode/expected_mir_dump.abort/abort.might_abort.-------.InstrumentCoverage.0.html create mode 100644 src/test/run-make-fulldeps/coverage-spanview-deadcode/expected_mir_dump.assert/assert.main.-------.InstrumentCoverage.0.html create mode 100644 src/test/run-make-fulldeps/coverage-spanview-deadcode/expected_mir_dump.assert/assert.might_fail_assert.-------.InstrumentCoverage.0.html create mode 100644 src/test/run-make-fulldeps/coverage-spanview-deadcode/expected_mir_dump.async/async.executor-block_on-VTABLE-{closure#0}.-------.InstrumentCoverage.0.html create mode 100644 src/test/run-make-fulldeps/coverage-spanview-deadcode/expected_mir_dump.async/async.executor-block_on-VTABLE-{closure#1}.-------.InstrumentCoverage.0.html create mode 100644 src/test/run-make-fulldeps/coverage-spanview-deadcode/expected_mir_dump.async/async.executor-block_on-VTABLE-{closure#2}.-------.InstrumentCoverage.0.html create mode 100644 src/test/run-make-fulldeps/coverage-spanview-deadcode/expected_mir_dump.async/async.executor-block_on-VTABLE-{closure#3}.-------.InstrumentCoverage.0.html create mode 100644 src/test/run-make-fulldeps/coverage-spanview-deadcode/expected_mir_dump.async/async.executor-block_on.-------.InstrumentCoverage.0.html create mode 100644 src/test/run-make-fulldeps/coverage-spanview-deadcode/expected_mir_dump.async/async.f-{closure#0}.-------.InstrumentCoverage.0.html create mode 100644 src/test/run-make-fulldeps/coverage-spanview-deadcode/expected_mir_dump.async/async.f.-------.InstrumentCoverage.0.html create mode 100644 src/test/run-make-fulldeps/coverage-spanview-deadcode/expected_mir_dump.async/async.foo-{closure#0}.-------.InstrumentCoverage.0.html create mode 100644 src/test/run-make-fulldeps/coverage-spanview-deadcode/expected_mir_dump.async/async.foo.-------.InstrumentCoverage.0.html create mode 100644 src/test/run-make-fulldeps/coverage-spanview-deadcode/expected_mir_dump.async/async.g-{closure#0}.-------.InstrumentCoverage.0.html create mode 100644 src/test/run-make-fulldeps/coverage-spanview-deadcode/expected_mir_dump.async/async.g.-------.InstrumentCoverage.0.html create mode 100644 src/test/run-make-fulldeps/coverage-spanview-deadcode/expected_mir_dump.async/async.h-{closure#0}.-------.InstrumentCoverage.0.html create mode 100644 src/test/run-make-fulldeps/coverage-spanview-deadcode/expected_mir_dump.async/async.h.-------.InstrumentCoverage.0.html create mode 100644 src/test/run-make-fulldeps/coverage-spanview-deadcode/expected_mir_dump.async/async.i-{closure#0}.-------.InstrumentCoverage.0.html create mode 100644 src/test/run-make-fulldeps/coverage-spanview-deadcode/expected_mir_dump.async/async.i.-------.InstrumentCoverage.0.html create mode 100644 src/test/run-make-fulldeps/coverage-spanview-deadcode/expected_mir_dump.async/async.main.-------.InstrumentCoverage.0.html create mode 100644 src/test/run-make-fulldeps/coverage-spanview-deadcode/expected_mir_dump.overflow/overflow.main.-------.InstrumentCoverage.0.html create mode 100644 src/test/run-make-fulldeps/coverage-spanview-deadcode/expected_mir_dump.overflow/overflow.might_overflow.-------.InstrumentCoverage.0.html create mode 100644 src/test/run-make-fulldeps/coverage-spanview-deadcode/expected_mir_dump.panic_unwind/panic_unwind.main.-------.InstrumentCoverage.0.html create mode 100644 src/test/run-make-fulldeps/coverage-spanview-deadcode/expected_mir_dump.panic_unwind/panic_unwind.might_panic.-------.InstrumentCoverage.0.html create mode 100644 src/test/run-make-fulldeps/coverage-spanview-deadcode/expected_mir_dump.yield/yield.main-{closure#0}.-------.InstrumentCoverage.0.html create mode 100644 src/test/run-make-fulldeps/coverage-spanview-deadcode/expected_mir_dump.yield/yield.main-{closure#1}.-------.InstrumentCoverage.0.html create mode 100644 src/test/run-make-fulldeps/coverage-spanview-deadcode/expected_mir_dump.yield/yield.main.-------.InstrumentCoverage.0.html create mode 100644 src/test/run-make-fulldeps/coverage/abort.rs create mode 100644 src/test/run-make-fulldeps/coverage/assert.rs create mode 100644 src/test/run-make-fulldeps/coverage/async.rs create mode 100644 src/test/run-make-fulldeps/coverage/overflow.rs create mode 100644 src/test/run-make-fulldeps/coverage/panic_unwind.rs create mode 100644 src/test/run-make-fulldeps/coverage/yield.rs diff --git a/compiler/rustc_mir/src/util/generic_graphviz.rs b/compiler/rustc_mir/src/util/generic_graphviz.rs index 8bd4a512bbb0..fd55a4dfc4c9 100644 --- a/compiler/rustc_mir/src/util/generic_graphviz.rs +++ b/compiler/rustc_mir/src/util/generic_graphviz.rs @@ -116,9 +116,13 @@ impl< write!(w, r#""#)?; - // FIXME(richkadel): Need generic way to know if node header should have a different color + // FIXME(richkadel): If/when migrating the MIR graphviz to this generic implementation, + // we need generic way to know if node header should have a different color. For example, + // for MIR: + // // let (blk, bgcolor) = if data.is_cleanup { - // (format!("{:?} (cleanup)", node), "lightblue") + // let color = if dark_mode { "royalblue" } else { "lightblue" }; + // (format!("{:?} (cleanup)", node), color) // } else { // let color = if dark_mode { "dimgray" } else { "gray" }; // (format!("{:?}", node), color) diff --git a/src/doc/unstable-book/src/compiler-flags/source-based-code-coverage.md b/src/doc/unstable-book/src/compiler-flags/source-based-code-coverage.md index 1dd7272e0f92..0eb425e42aad 100644 --- a/src/doc/unstable-book/src/compiler-flags/source-based-code-coverage.md +++ b/src/doc/unstable-book/src/compiler-flags/source-based-code-coverage.md @@ -1,8 +1,6 @@ # `source-based-code-coverage` -The feature request for this feature is: [#34701] - -The Major Change Proposal (MCP) for this feature is: [#278](https://github.com/rust-lang/compiler-team/issues/278) +The tracking issue for this feature is: [#79121](https://github.com/rust-lang/rust/issues/79121). ------------------------ diff --git a/src/test/run-make-fulldeps/coverage-reports-base/Makefile b/src/test/run-make-fulldeps/coverage-reports-base/Makefile index 2dac8fc2225b..6ccff43dcdfd 100644 --- a/src/test/run-make-fulldeps/coverage-reports-base/Makefile +++ b/src/test/run-make-fulldeps/coverage-reports-base/Makefile @@ -54,6 +54,9 @@ endif %: $(SOURCEDIR)/%.rs # Compile the test program with coverage instrumentation and generate relevant MIR. $(RUSTC) $(SOURCEDIR)/$@.rs \ + $$( grep -q '^\/\/ require-rust-edition-2018' $(SOURCEDIR)/$@.rs && \ + echo "--edition=2018" \ + ) \ -Zinstrument-coverage \ -Clink-dead-code=$(LINK_DEAD_CODE) diff --git a/src/test/run-make-fulldeps/coverage-reports-base/expected_export_coverage.abort.json b/src/test/run-make-fulldeps/coverage-reports-base/expected_export_coverage.abort.json new file mode 100644 index 000000000000..33cfc9f3ed72 --- /dev/null +++ b/src/test/run-make-fulldeps/coverage-reports-base/expected_export_coverage.abort.json @@ -0,0 +1,59 @@ +{ + "data": [ + { + "files": [ + { + "filename": "../coverage/abort.rs", + "summary": { + "functions": { + "count": 2, + "covered": 2, + "percent": 100 + }, + "instantiations": { + "count": 2, + "covered": 2, + "percent": 100 + }, + "lines": { + "count": 15, + "covered": 13, + "percent": 86.66666666666667 + }, + "regions": { + "count": 10, + "covered": 9, + "notcovered": 1, + "percent": 90 + } + } + } + ], + "totals": { + "functions": { + "count": 2, + "covered": 2, + "percent": 100 + }, + "instantiations": { + "count": 2, + "covered": 2, + "percent": 100 + }, + "lines": { + "count": 15, + "covered": 13, + "percent": 86.66666666666667 + }, + "regions": { + "count": 10, + "covered": 9, + "notcovered": 1, + "percent": 90 + } + } + } + ], + "type": "llvm.coverage.json.export", + "version": "2.0.1" +} diff --git a/src/test/run-make-fulldeps/coverage-reports-base/expected_export_coverage.assert.json b/src/test/run-make-fulldeps/coverage-reports-base/expected_export_coverage.assert.json new file mode 100644 index 000000000000..aa2a0cbebe77 --- /dev/null +++ b/src/test/run-make-fulldeps/coverage-reports-base/expected_export_coverage.assert.json @@ -0,0 +1,59 @@ +{ + "data": [ + { + "files": [ + { + "filename": "../coverage/assert.rs", + "summary": { + "functions": { + "count": 2, + "covered": 2, + "percent": 100 + }, + "instantiations": { + "count": 2, + "covered": 2, + "percent": 100 + }, + "lines": { + "count": 13, + "covered": 10, + "percent": 76.92307692307693 + }, + "regions": { + "count": 14, + "covered": 12, + "notcovered": 2, + "percent": 85.71428571428571 + } + } + } + ], + "totals": { + "functions": { + "count": 2, + "covered": 2, + "percent": 100 + }, + "instantiations": { + "count": 2, + "covered": 2, + "percent": 100 + }, + "lines": { + "count": 13, + "covered": 10, + "percent": 76.92307692307693 + }, + "regions": { + "count": 14, + "covered": 12, + "notcovered": 2, + "percent": 85.71428571428571 + } + } + } + ], + "type": "llvm.coverage.json.export", + "version": "2.0.1" +} diff --git a/src/test/run-make-fulldeps/coverage-reports-base/expected_export_coverage.async.json b/src/test/run-make-fulldeps/coverage-reports-base/expected_export_coverage.async.json new file mode 100644 index 000000000000..004bedeea628 --- /dev/null +++ b/src/test/run-make-fulldeps/coverage-reports-base/expected_export_coverage.async.json @@ -0,0 +1,59 @@ +{ + "data": [ + { + "files": [ + { + "filename": "../coverage/async.rs", + "summary": { + "functions": { + "count": 9, + "covered": 9, + "percent": 100 + }, + "instantiations": { + "count": 9, + "covered": 9, + "percent": 100 + }, + "lines": { + "count": 31, + "covered": 30, + "percent": 96.7741935483871 + }, + "regions": { + "count": 21, + "covered": 18, + "notcovered": 3, + "percent": 85.71428571428571 + } + } + } + ], + "totals": { + "functions": { + "count": 9, + "covered": 9, + "percent": 100 + }, + "instantiations": { + "count": 9, + "covered": 9, + "percent": 100 + }, + "lines": { + "count": 31, + "covered": 30, + "percent": 96.7741935483871 + }, + "regions": { + "count": 21, + "covered": 18, + "notcovered": 3, + "percent": 85.71428571428571 + } + } + } + ], + "type": "llvm.coverage.json.export", + "version": "2.0.1" +} diff --git a/src/test/run-make-fulldeps/coverage-reports-base/expected_export_coverage.conditions.json b/src/test/run-make-fulldeps/coverage-reports-base/expected_export_coverage.conditions.json index ed937a1b13f3..d69ca80839a3 100644 --- a/src/test/run-make-fulldeps/coverage-reports-base/expected_export_coverage.conditions.json +++ b/src/test/run-make-fulldeps/coverage-reports-base/expected_export_coverage.conditions.json @@ -16,15 +16,15 @@ "percent": 100 }, "lines": { - "count": 49, - "covered": 23, - "percent": 46.93877551020408 + "count": 64, + "covered": 33, + "percent": 51.5625 }, "regions": { - "count": 69, - "covered": 18, - "notcovered": 51, - "percent": 26.08695652173913 + "count": 88, + "covered": 25, + "notcovered": 63, + "percent": 28.40909090909091 } } } @@ -41,15 +41,15 @@ "percent": 100 }, "lines": { - "count": 49, - "covered": 23, - "percent": 46.93877551020408 + "count": 64, + "covered": 33, + "percent": 51.5625 }, "regions": { - "count": 69, - "covered": 18, - "notcovered": 51, - "percent": 26.08695652173913 + "count": 88, + "covered": 25, + "notcovered": 63, + "percent": 28.40909090909091 } } } diff --git a/src/test/run-make-fulldeps/coverage-reports-base/expected_export_coverage.inner_items.json b/src/test/run-make-fulldeps/coverage-reports-base/expected_export_coverage.inner_items.json index c178e7f93476..5dc82d2168cc 100644 --- a/src/test/run-make-fulldeps/coverage-reports-base/expected_export_coverage.inner_items.json +++ b/src/test/run-make-fulldeps/coverage-reports-base/expected_export_coverage.inner_items.json @@ -16,15 +16,15 @@ "percent": 100 }, "lines": { - "count": 26, - "covered": 26, + "count": 27, + "covered": 27, "percent": 100 }, "regions": { - "count": 15, - "covered": 13, + "count": 11, + "covered": 9, "notcovered": 2, - "percent": 86.66666666666667 + "percent": 81.81818181818183 } } } @@ -41,15 +41,15 @@ "percent": 100 }, "lines": { - "count": 26, - "covered": 26, + "count": 27, + "covered": 27, "percent": 100 }, "regions": { - "count": 15, - "covered": 13, + "count": 11, + "covered": 9, "notcovered": 2, - "percent": 86.66666666666667 + "percent": 81.81818181818183 } } } diff --git a/src/test/run-make-fulldeps/coverage-reports-base/expected_export_coverage.nested_loops.json b/src/test/run-make-fulldeps/coverage-reports-base/expected_export_coverage.nested_loops.json index 68163eb76361..ce3c957e660c 100644 --- a/src/test/run-make-fulldeps/coverage-reports-base/expected_export_coverage.nested_loops.json +++ b/src/test/run-make-fulldeps/coverage-reports-base/expected_export_coverage.nested_loops.json @@ -16,15 +16,15 @@ "percent": 100 }, "lines": { - "count": 21, + "count": 22, "covered": 16, - "percent": 76.19047619047619 + "percent": 72.72727272727273 }, "regions": { - "count": 18, - "covered": 14, + "count": 17, + "covered": 13, "notcovered": 4, - "percent": 77.77777777777779 + "percent": 76.47058823529412 } } } @@ -41,15 +41,15 @@ "percent": 100 }, "lines": { - "count": 21, + "count": 22, "covered": 16, - "percent": 76.19047619047619 + "percent": 72.72727272727273 }, "regions": { - "count": 18, - "covered": 14, + "count": 17, + "covered": 13, "notcovered": 4, - "percent": 77.77777777777779 + "percent": 76.47058823529412 } } } diff --git a/src/test/run-make-fulldeps/coverage-reports-base/expected_export_coverage.overflow.json b/src/test/run-make-fulldeps/coverage-reports-base/expected_export_coverage.overflow.json new file mode 100644 index 000000000000..176bfd7abeba --- /dev/null +++ b/src/test/run-make-fulldeps/coverage-reports-base/expected_export_coverage.overflow.json @@ -0,0 +1,59 @@ +{ + "data": [ + { + "files": [ + { + "filename": "../coverage/overflow.rs", + "summary": { + "functions": { + "count": 2, + "covered": 2, + "percent": 100 + }, + "instantiations": { + "count": 2, + "covered": 2, + "percent": 100 + }, + "lines": { + "count": 21, + "covered": 17, + "percent": 80.95238095238095 + }, + "regions": { + "count": 14, + "covered": 12, + "notcovered": 2, + "percent": 85.71428571428571 + } + } + } + ], + "totals": { + "functions": { + "count": 2, + "covered": 2, + "percent": 100 + }, + "instantiations": { + "count": 2, + "covered": 2, + "percent": 100 + }, + "lines": { + "count": 21, + "covered": 17, + "percent": 80.95238095238095 + }, + "regions": { + "count": 14, + "covered": 12, + "notcovered": 2, + "percent": 85.71428571428571 + } + } + } + ], + "type": "llvm.coverage.json.export", + "version": "2.0.1" +} diff --git a/src/test/run-make-fulldeps/coverage-reports-base/expected_export_coverage.panic_unwind.json b/src/test/run-make-fulldeps/coverage-reports-base/expected_export_coverage.panic_unwind.json new file mode 100644 index 000000000000..5b13109dbe6b --- /dev/null +++ b/src/test/run-make-fulldeps/coverage-reports-base/expected_export_coverage.panic_unwind.json @@ -0,0 +1,59 @@ +{ + "data": [ + { + "files": [ + { + "filename": "../coverage/panic_unwind.rs", + "summary": { + "functions": { + "count": 2, + "covered": 2, + "percent": 100 + }, + "instantiations": { + "count": 2, + "covered": 2, + "percent": 100 + }, + "lines": { + "count": 17, + "covered": 14, + "percent": 82.35294117647058 + }, + "regions": { + "count": 13, + "covered": 11, + "notcovered": 2, + "percent": 84.61538461538461 + } + } + } + ], + "totals": { + "functions": { + "count": 2, + "covered": 2, + "percent": 100 + }, + "instantiations": { + "count": 2, + "covered": 2, + "percent": 100 + }, + "lines": { + "count": 17, + "covered": 14, + "percent": 82.35294117647058 + }, + "regions": { + "count": 13, + "covered": 11, + "notcovered": 2, + "percent": 84.61538461538461 + } + } + } + ], + "type": "llvm.coverage.json.export", + "version": "2.0.1" +} diff --git a/src/test/run-make-fulldeps/coverage-reports-base/expected_export_coverage.yield.json b/src/test/run-make-fulldeps/coverage-reports-base/expected_export_coverage.yield.json new file mode 100644 index 000000000000..9f25bc971c55 --- /dev/null +++ b/src/test/run-make-fulldeps/coverage-reports-base/expected_export_coverage.yield.json @@ -0,0 +1,59 @@ +{ + "data": [ + { + "files": [ + { + "filename": "../coverage/yield.rs", + "summary": { + "functions": { + "count": 3, + "covered": 3, + "percent": 100 + }, + "instantiations": { + "count": 3, + "covered": 3, + "percent": 100 + }, + "lines": { + "count": 23, + "covered": 16, + "percent": 69.56521739130434 + }, + "regions": { + "count": 22, + "covered": 16, + "notcovered": 6, + "percent": 72.72727272727273 + } + } + } + ], + "totals": { + "functions": { + "count": 3, + "covered": 3, + "percent": 100 + }, + "instantiations": { + "count": 3, + "covered": 3, + "percent": 100 + }, + "lines": { + "count": 23, + "covered": 16, + "percent": 69.56521739130434 + }, + "regions": { + "count": 22, + "covered": 16, + "notcovered": 6, + "percent": 72.72727272727273 + } + } + } + ], + "type": "llvm.coverage.json.export", + "version": "2.0.1" +} diff --git a/src/test/run-make-fulldeps/coverage-reports-base/expected_show_coverage.abort.txt b/src/test/run-make-fulldeps/coverage-reports-base/expected_show_coverage.abort.txt new file mode 100644 index 000000000000..40c9c71a2aad --- /dev/null +++ b/src/test/run-make-fulldeps/coverage-reports-base/expected_show_coverage.abort.txt @@ -0,0 +1,35 @@ + 1| |#![feature(unwind_attributes)] + 2| |#![allow(unused_assignments)] + 3| | + 4| |#[unwind(aborts)] + 5| |fn might_abort(should_abort: bool) { + 6| 4| if should_abort { + 7| 0| println!("aborting..."); + 8| 0| panic!("panics and aborts"); + 9| 4| } else { + 10| 4| println!("Don't Panic"); + 11| 4| } + 12| 4|} + 13| | + 14| |fn main() -> Result<(),u8> { + 15| 1| let mut countdown = 10; + 16| 11| while countdown > 0 { + 17| 10| if countdown < 5 { + 18| 4| might_abort(false); + 19| 6| } + 20| 10| countdown -= 1; + 21| | } + 22| 1| Ok(()) + 23| 1|} + 24| | + 25| |// Notes: + 26| |// 1. Compare this program and its coverage results to those of the similar tests + 27| |// `panic_unwind.rs` and `try_error_result.rs`. + 28| |// 2. This test confirms the coverage generated when a program includes `TerminatorKind::Abort`. + 29| |// 3. The test does not invoke the abort. By executing to a successful completion, the coverage + 30| |// results show where the program did and did not execute. + 31| |// 4. If the program actually aborted, the coverage counters would not be saved (which "works as + 32| |// intended"). Coverage results would show no executed coverage regions. + 33| |// 6. If `should_abort` is `true` and the program aborts, the program exits with a `132` status + 34| |// (on Linux at least). + diff --git a/src/test/run-make-fulldeps/coverage-reports-base/expected_show_coverage.assert.txt b/src/test/run-make-fulldeps/coverage-reports-base/expected_show_coverage.assert.txt new file mode 100644 index 000000000000..a6efcbabd352 --- /dev/null +++ b/src/test/run-make-fulldeps/coverage-reports-base/expected_show_coverage.assert.txt @@ -0,0 +1,34 @@ + 1| |#![allow(unused_assignments)] + 2| |// expect-exit-status-101 + 3| | + 4| |fn might_fail_assert(one_plus_one: u32) { + 5| 4| println!("does 1 + 1 = {}?", one_plus_one); + 6| 4| assert_eq!(1 + 1, one_plus_one, "the argument was wrong"); + ^1 + 7| 3|} + 8| | + 9| |fn main() -> Result<(),u8> { + 10| 1| let mut countdown = 10; + 11| 10| while countdown > 0 { + 12| 10| if countdown == 1 { + 13| 0| might_fail_assert(3); + 14| 10| } else if countdown < 5 { + 15| 3| might_fail_assert(2); + 16| 15| } + 17| 9| countdown -= 1; + 18| | } + 19| 0| Ok(()) + 20| 0|} + 21| | + 22| |// Notes: + 23| |// 1. Compare this program and its coverage results to those of the very similar test + 24| |// `panic_unwind.rs`, and similar tests `abort.rs` and `try_error_result.rs`. + 25| |// 2. This test confirms the coverage generated when a program passes or fails an `assert!()` or + 26| |// related `assert_*!()` macro. + 27| |// 3. Notably, the `assert` macros *do not* generate `TerminatorKind::Assert`. The macros produce + 28| |// conditional expressions, `TerminatorKind::SwitchInt` branches, and a possible call to + 29| |// `begin_panic_fmt()` (that begins a panic unwind, if the assertion test fails). + 30| |// 4. `TerminatoKind::Assert` is, however, also present in the MIR generated for this test + 31| |// (and in many other coverage tests). The `Assert` terminator is typically generated by the + 32| |// Rust compiler to check for runtime failures, such as numeric overflows. + diff --git a/src/test/run-make-fulldeps/coverage-reports-base/expected_show_coverage.async.txt b/src/test/run-make-fulldeps/coverage-reports-base/expected_show_coverage.async.txt new file mode 100644 index 000000000000..b5d99732102d --- /dev/null +++ b/src/test/run-make-fulldeps/coverage-reports-base/expected_show_coverage.async.txt @@ -0,0 +1,66 @@ + 1| |#![allow(unused_assignments)] + 2| | + 3| |// require-rust-edition-2018 + 4| | + 5| 1|async fn f() -> u8 { 1 } + 6| | + 7| |async fn foo() -> [bool; 10] { [false; 10] } + 8| | + 9| |pub async fn g(x: u8) { + 10| | match x { + 11| | y if f().await == y => (), + 12| | _ => (), + 13| | } + 14| 1|} + 15| | + 16| |// #78366: check the reference to the binding is recorded even if the binding is not autorefed + 17| | + 18| |async fn h(x: usize) { + 19| | match x { + 20| | y if foo().await[y] => (), + 21| | _ => (), + 22| | } + 23| 1|} + 24| | + 25| 1|async fn i(x: u8) { + 26| 1| match x { + 27| 1| y if f().await == y + 1 => (), + ^0 ^0 + 28| 1| _ => (), + 29| | } + 30| 2|} + 31| | + 32| 1|fn main() { + 33| 1| let _ = g(10); + 34| 1| let _ = h(9); + 35| 1| let mut future = Box::pin(i(8)); + 36| 1| executor::block_on(future.as_mut()); + 37| 1|} + 38| | + 39| |mod executor { + 40| | use core::{ + 41| | future::Future, + 42| | pin::Pin, + 43| | task::{Context, Poll, RawWaker, RawWakerVTable, Waker}, + 44| | }; + 45| | + 46| | pub fn block_on(mut future: F) -> F::Output { + 47| 1| let mut future = unsafe { Pin::new_unchecked(&mut future) }; + 48| 1| + 49| 1| static VTABLE: RawWakerVTable = RawWakerVTable::new( + 50| 1| |_| unimplemented!("clone"), + 51| 1| |_| unimplemented!("wake"), + 52| 1| |_| unimplemented!("wake_by_ref"), + 53| 1| |_| (), + 54| 1| ); + 55| 1| let waker = unsafe { Waker::from_raw(RawWaker::new(core::ptr::null(), &VTABLE)) }; + 56| 1| let mut context = Context::from_waker(&waker); + 57| | + 58| | loop { + 59| 1| if let Poll::Ready(val) = future.as_mut().poll(&mut context) { + 60| 1| break val; + 61| | } + 62| 0| } + 63| 1| } + 64| |} + diff --git a/src/test/run-make-fulldeps/coverage-reports-base/expected_show_coverage.conditions.txt b/src/test/run-make-fulldeps/coverage-reports-base/expected_show_coverage.conditions.txt index 173ff4aa4c48..e55a574c056b 100644 --- a/src/test/run-make-fulldeps/coverage-reports-base/expected_show_coverage.conditions.txt +++ b/src/test/run-make-fulldeps/coverage-reports-base/expected_show_coverage.conditions.txt @@ -27,7 +27,8 @@ 27| | 28| 1| if countdown > 7 { 29| 1| countdown -= 4; - 30| 0| } else if countdown > 2 { + 30| 1| } else if countdown > 2 { + ^0 31| 0| if countdown < 1 || countdown > 5 || countdown != 9 { 32| 0| countdown = 0; 33| 0| } @@ -36,34 +37,70 @@ 36| 0| return; 37| | } 38| | - 39| 1| let mut countdown = 0; - 40| 1| if true { - 41| 1| countdown = 1; - 42| 1| } - 43| | - 44| 1| let z = if countdown > 7 { - ^0 - 45| 0| countdown -= 4; - 46| 1| } else if countdown > 2 { - 47| 0| if countdown < 1 || countdown > 5 || countdown != 9 { - 48| 0| countdown = 0; - 49| 0| } - 50| 0| countdown -= 5; - 51| | } else { - 52| 1| let should_be_reachable = countdown; - 53| 1| println!("reached"); - 54| 1| return; - 55| | }; + 39| 1| if true { + 40| | // Demonstrate the difference with `TerminatorKind::Assert` as of 2020-11-15. Assert is no + 41| | // longer treated as a `BasicCoverageBlock` terminator, which changed the coverage region, + 42| | // for the executed `then` block above, to include the closing brace on line 30. That + 43| | // changed the line count, but the coverage code region (for the `else if` condition) is + 44| | // still valid. + 45| | // + 46| | // Note that `if` (then) and `else` blocks include the closing brace in their coverage + 47| | // code regions when the last line in the block ends in a semicolon, because the Rust + 48| | // compiler inserts a `StatementKind::Assign` to assign `const ()` to a `Place`, for the + 49| | // empty value for the executed block. When the last line does not end in a semicolon + 50| | // (that is, when the block actually results in a value), the additional `Assign` is not + 51| | // generated, and the brace is not included. + 52| 1| let mut countdown = 0; + 53| 1| if true { + 54| 1| countdown = 10; + 55| 1| } 56| | - 57| 0| let w = if countdown > 7 { - 58| 0| countdown -= 4; - 59| 0| } else if countdown > 2 { - 60| 0| if countdown < 1 || countdown > 5 || countdown != 9 { - 61| 0| countdown = 0; - 62| 0| } - 63| 0| countdown -= 5; - 64| | } else { - 65| 0| return; - 66| | }; - 67| 1|} + 57| 1| if countdown > 7 { + 58| 1| countdown -= 4; + 59| 1| } + 60| | // The closing brace of the `then` branch is now included in the coverage region, and shown + 61| | // as "executed" (giving its line a count of 1 here). Since, in the original version above, + 62| | // the closing brace shares the same line as the `else if` conditional expression (which is + 63| | // not executed if the first `then` condition is true), only the condition's code region is + 64| | // marked with a count of 0 now. + 65| 0| else if countdown > 2 { + 66| 0| if countdown < 1 || countdown > 5 || countdown != 9 { + 67| 0| countdown = 0; + 68| 0| } + 69| 0| countdown -= 5; + 70| | } else { + 71| 0| return; + 72| | } + 73| 1| } + 74| | + 75| 1| let mut countdown = 0; + 76| 1| if true { + 77| 1| countdown = 1; + 78| 1| } + 79| | + 80| 1| let z = if countdown > 7 { + ^0 + 81| 0| countdown -= 4; + 82| 1| } else if countdown > 2 { + 83| 0| if countdown < 1 || countdown > 5 || countdown != 9 { + 84| 0| countdown = 0; + 85| 0| } + 86| 0| countdown -= 5; + 87| | } else { + 88| 1| let should_be_reachable = countdown; + 89| 1| println!("reached"); + 90| 1| return; + 91| | }; + 92| | + 93| 0| let w = if countdown > 7 { + 94| 0| countdown -= 4; + 95| 0| } else if countdown > 2 { + 96| 0| if countdown < 1 || countdown > 5 || countdown != 9 { + 97| 0| countdown = 0; + 98| 0| } + 99| 0| countdown -= 5; + 100| | } else { + 101| 0| return; + 102| | }; + 103| 1|} diff --git a/src/test/run-make-fulldeps/coverage-reports-base/expected_show_coverage.inner_items.txt b/src/test/run-make-fulldeps/coverage-reports-base/expected_show_coverage.inner_items.txt index 4a51f842a4bb..efd9cd4f72d3 100644 --- a/src/test/run-make-fulldeps/coverage-reports-base/expected_show_coverage.inner_items.txt +++ b/src/test/run-make-fulldeps/coverage-reports-base/expected_show_coverage.inner_items.txt @@ -38,7 +38,7 @@ 37| | } 38| | 39| | impl InTrait for InStruct { - 40| | fn trait_func(&mut self, incr: u32) { + 40| 1| fn trait_func(&mut self, incr: u32) { 41| 1| self.in_struct_field += incr; 42| 1| in_func(self.in_struct_field); 43| 1| } diff --git a/src/test/run-make-fulldeps/coverage-reports-base/expected_show_coverage.nested_loops.txt b/src/test/run-make-fulldeps/coverage-reports-base/expected_show_coverage.nested_loops.txt index c9f373bf6a7c..dd86a85815b3 100644 --- a/src/test/run-make-fulldeps/coverage-reports-base/expected_show_coverage.nested_loops.txt +++ b/src/test/run-make-fulldeps/coverage-reports-base/expected_show_coverage.nested_loops.txt @@ -15,7 +15,7 @@ 15| 1| a -= 10; 16| 1| if is_true { 17| 1| break 'outer; - 18| | } else { + 18| 0| } else { 19| 0| a -= 2; 20| 0| } 21| 2| } diff --git a/src/test/run-make-fulldeps/coverage-reports-base/expected_show_coverage.overflow.txt b/src/test/run-make-fulldeps/coverage-reports-base/expected_show_coverage.overflow.txt new file mode 100644 index 000000000000..322de1da25a2 --- /dev/null +++ b/src/test/run-make-fulldeps/coverage-reports-base/expected_show_coverage.overflow.txt @@ -0,0 +1,64 @@ + 1| |#![allow(unused_assignments)] + 2| |// expect-exit-status-101 + 3| | + 4| |fn might_overflow(to_add: u32) -> u32 { + 5| 4| if to_add > 5 { + 6| 1| println!("this will probably overflow"); + 7| 3| } + 8| 4| let add_to = u32::MAX - 5; + 9| 4| println!("does {} + {} overflow?", add_to, to_add); + 10| 4| let result = to_add + add_to; + 11| 4| println!("continuing after overflow check"); + 12| 4| result + 13| 4|} + 14| | + 15| |fn main() -> Result<(),u8> { + 16| 1| let mut countdown = 10; + 17| 10| while countdown > 0 { + 18| 10| if countdown == 1 { + 19| 0| let result = might_overflow(10); + 20| 0| println!("Result: {}", result); + 21| 10| } else if countdown < 5 { + 22| 3| let result = might_overflow(1); + 23| 3| println!("Result: {}", result); + 24| 15| } + 25| 9| countdown -= 1; + 26| | } + 27| 0| Ok(()) + 28| 0|} + 29| | + 30| |// Notes: + 31| |// 1. Compare this program and its coverage results to those of the very similar test `assert.rs`, + 32| |// and similar tests `panic_unwind.rs`, abort.rs` and `try_error_result.rs`. + 33| |// 2. This test confirms the coverage generated when a program passes or fails a + 34| |// compiler-generated `TerminatorKind::Assert` (based on an overflow check, in this case). + 35| |// 3. Similar to how the coverage instrumentation handles `TerminatorKind::Call`, + 36| |// compiler-generated assertion failures are assumed to be a symptom of a program bug, not + 37| |// expected behavior. To simplify the coverage graphs and keep instrumented programs as + 38| |// small and fast as possible, `Assert` terminators are assumed to always succeed, and + 39| |// therefore are considered "non-branching" terminators. So, an `Assert` terminator does not + 40| |// get its own coverage counter. + 41| |// 4. After an unhandled panic or failed Assert, coverage results may not always be intuitive. + 42| |// In this test, the final count for the statements after the `if` block in `might_overflow()` + 43| |// is 4, even though the lines after `to_add + add_to` were executed only 3 times. Depending + 44| |// on the MIR graph and the structure of the code, this count could have been 3 (which might + 45| |// have been valid for the overflowed add `+`, but should have been 4 for the lines before + 46| |// the overflow. The reason for this potential uncertainty is, a `CounterKind` is incremented + 47| |// via StatementKind::Counter at the end of the block, but (as in the case in this test), + 48| |// a CounterKind::Expression is always evaluated. In this case, the expression was based on + 49| |// a `Counter` incremented as part of the evaluation of the `if` expression, which was + 50| |// executed, and counted, 4 times, before reaching the overflow add. + 51| | + 52| |// If the program did not overflow, the coverage for `might_overflow()` would look like this: + 53| |// + 54| |// 4| |fn might_overflow(to_add: u32) -> u32 { + 55| |// 5| 4| if to_add > 5 { + 56| |// 6| 0| println!("this will probably overflow"); + 57| |// 7| 4| } + 58| |// 8| 4| let add_to = u32::MAX - 5; + 59| |// 9| 4| println!("does {} + {} overflow?", add_to, to_add); + 60| |// 10| 4| let result = to_add + add_to; + 61| |// 11| 4| println!("continuing after overflow check"); + 62| |// 12| 4| result + 63| |// 13| 4|} + diff --git a/src/test/run-make-fulldeps/coverage-reports-base/expected_show_coverage.panic_unwind.txt b/src/test/run-make-fulldeps/coverage-reports-base/expected_show_coverage.panic_unwind.txt new file mode 100644 index 000000000000..f5149c11b7be --- /dev/null +++ b/src/test/run-make-fulldeps/coverage-reports-base/expected_show_coverage.panic_unwind.txt @@ -0,0 +1,50 @@ + 1| |#![allow(unused_assignments)] + 2| |// expect-exit-status-101 + 3| | + 4| |fn might_panic(should_panic: bool) { + 5| 4| if should_panic { + 6| 1| println!("panicking..."); + 7| 1| panic!("panics"); + 8| 3| } else { + 9| 3| println!("Don't Panic"); + 10| 3| } + 11| 3|} + 12| | + 13| |fn main() -> Result<(),u8> { + 14| 1| let mut countdown = 10; + 15| 10| while countdown > 0 { + 16| 10| if countdown == 1 { + 17| 0| might_panic(true); + 18| 10| } else if countdown < 5 { + 19| 3| might_panic(false); + 20| 15| } + 21| 9| countdown -= 1; + 22| | } + 23| 0| Ok(()) + 24| 0|} + 25| | + 26| |// Notes: + 27| |// 1. Compare this program and its coverage results to those of the similar tests `abort.rs` and + 28| |// `try_error_result.rs`. + 29| |// 2. Since the `panic_unwind.rs` test is allowed to unwind, it is also allowed to execute the + 30| |// normal program exit cleanup, including writing out the current values of the coverage + 31| |// counters. + 32| |// 3. The coverage results show (interestingly) that the `panic!()` call did execute, but it does + 33| |// not show coverage of the `if countdown == 1` branch in `main()` that calls + 34| |// `might_panic(true)` (causing the call to `panic!()`). + 35| |// 4. The reason `main()`s `if countdown == 1` branch, calling `might_panic(true)`, appears + 36| |// "uncovered" is, InstrumentCoverage (intentionally) treats `TerminatorKind::Call` terminators + 37| |// as non-branching, because when a program executes normally, they always are. Errors handled + 38| |// via the try `?` operator produce error handling branches that *are* treated as branches in + 39| |// coverage results. By treating calls without try `?` operators as non-branching (assumed to + 40| |// return normally and continue) the coverage graph can be simplified, producing smaller, + 41| |// faster binaries, and cleaner coverage results. + 42| |// 5. The reason the coverage results actually show `panic!()` was called is most likely because + 43| |// `panic!()` is a macro, not a simple function call, and there are other `Statement`s and/or + 44| |// `Terminator`s that execute with a coverage counter before the panic and unwind occur. + 45| |// 6. By best practice, programs should not panic. By design, the coverage implementation will not + 46| |// incur additional cost (in program size and execution time) to improve coverage results for + 47| |// an event that is not supposted to happen. + 48| |// 7. FIXME(#78544): This issue describes a feature request for a proposed option to enable + 49| |// more accurate coverage results for tests that intentionally panic. + diff --git a/src/test/run-make-fulldeps/coverage-reports-base/expected_show_coverage.yield.txt b/src/test/run-make-fulldeps/coverage-reports-base/expected_show_coverage.yield.txt new file mode 100644 index 000000000000..28813dd6d0b0 --- /dev/null +++ b/src/test/run-make-fulldeps/coverage-reports-base/expected_show_coverage.yield.txt @@ -0,0 +1,38 @@ + 1| |#![feature(generators, generator_trait)] + 2| |#![allow(unused_assignments)] + 3| | + 4| |use std::ops::{Generator, GeneratorState}; + 5| |use std::pin::Pin; + 6| | + 7| |fn main() { + 8| 1| let mut generator = || { + 9| 1| yield 1; + 10| 1| return "foo" + 11| 1| }; + 12| | + 13| 1| match Pin::new(&mut generator).resume(()) { + 14| 1| GeneratorState::Yielded(1) => {} + 15| 0| _ => panic!("unexpected value from resume"), + 16| | } + 17| 1| match Pin::new(&mut generator).resume(()) { + 18| 1| GeneratorState::Complete("foo") => {} + 19| 0| _ => panic!("unexpected value from resume"), + 20| | } + 21| | + 22| 1| let mut generator = || { + 23| 1| yield 1; + 24| 1| yield 2; + 25| 0| yield 3; + 26| 0| return "foo" + 27| 0| }; + 28| | + 29| 1| match Pin::new(&mut generator).resume(()) { + 30| 1| GeneratorState::Yielded(1) => {} + 31| 0| _ => panic!("unexpected value from resume"), + 32| | } + 33| 1| match Pin::new(&mut generator).resume(()) { + 34| 1| GeneratorState::Yielded(2) => {} + 35| 0| _ => panic!("unexpected value from resume"), + 36| | } + 37| 1|} + diff --git a/src/test/run-make-fulldeps/coverage-reports-base/expected_show_coverage_counters.abort.txt b/src/test/run-make-fulldeps/coverage-reports-base/expected_show_coverage_counters.abort.txt new file mode 100644 index 000000000000..e787e5e152d5 --- /dev/null +++ b/src/test/run-make-fulldeps/coverage-reports-base/expected_show_coverage_counters.abort.txt @@ -0,0 +1,41 @@ +Counter in file 0 15:9 -> 15:27, #1 +Counter in file 0 16:11 -> 16:24, (#1 + (#2 + #3)) +Counter in file 0 17:12 -> 17:25, ((#1 + (#2 + #3)) - #4) +Counter in file 0 17:26 -> 19:10, #2 +Counter in file 0 19:10 -> 19:11, #3 +Counter in file 0 20:9 -> 20:23, (#2 + #3) +Counter in file 0 22:5 -> 23:2, #4 +Counter in file 0 6:8 -> 6:20, #1 +Counter in file 0 7:9 -> 8:37, #2 +Counter in file 0 9:12 -> 12:2, (#1 - #2) +Emitting segments for file: ../coverage/abort.rs +Combined regions: + 6:8 -> 6:20 (count=4) + 7:9 -> 8:37 (count=0) + 9:12 -> 12:2 (count=4) + 15:9 -> 15:27 (count=1) + 16:11 -> 16:24 (count=11) + 17:12 -> 17:25 (count=10) + 17:26 -> 19:10 (count=4) + 19:10 -> 19:11 (count=6) + 20:9 -> 20:23 (count=10) + 22:5 -> 23:2 (count=1) +Segment at 6:8 (count = 4), RegionEntry +Segment at 6:20 (count = 0), Skipped +Segment at 7:9 (count = 0), RegionEntry +Segment at 8:37 (count = 0), Skipped +Segment at 9:12 (count = 4), RegionEntry +Segment at 12:2 (count = 0), Skipped +Segment at 15:9 (count = 1), RegionEntry +Segment at 15:27 (count = 0), Skipped +Segment at 16:11 (count = 11), RegionEntry +Segment at 16:24 (count = 0), Skipped +Segment at 17:12 (count = 10), RegionEntry +Segment at 17:25 (count = 0), Skipped +Segment at 17:26 (count = 4), RegionEntry +Segment at 19:10 (count = 6), RegionEntry +Segment at 19:11 (count = 0), Skipped +Segment at 20:9 (count = 10), RegionEntry +Segment at 20:23 (count = 0), Skipped +Segment at 22:5 (count = 1), RegionEntry +Segment at 23:2 (count = 0), Skipped diff --git a/src/test/run-make-fulldeps/coverage-reports-base/expected_show_coverage_counters.assert.txt b/src/test/run-make-fulldeps/coverage-reports-base/expected_show_coverage_counters.assert.txt new file mode 100644 index 000000000000..81cb6c03da70 --- /dev/null +++ b/src/test/run-make-fulldeps/coverage-reports-base/expected_show_coverage_counters.assert.txt @@ -0,0 +1,54 @@ +Counter in file 0 10:9 -> 10:27, #1 +Counter in file 0 11:11 -> 11:24, (#1 + (#2 + (#3 + #4))) +Counter in file 0 12:12 -> 12:26, ((#1 + (#2 + (#3 + #4))) - #5) +Counter in file 0 12:27 -> 14:10, #2 +Counter in file 0 14:19 -> 14:32, (((#1 + (#2 + (#3 + #4))) - #5) - #2) +Counter in file 0 14:33 -> 16:10, #3 +Counter in file 0 16:10 -> 16:11, #4 +Counter in file 0 16:10 -> 16:11, (#3 + #4) +Counter in file 0 17:9 -> 17:23, (#2 + (#3 + #4)) +Counter in file 0 19:5 -> 20:2, #5 +Counter in file 0 5:5 -> 5:48, #1 +Counter in file 0 6:16 -> 6:21, (#1 + 0) +Counter in file 0 6:37 -> 6:61, #2 +Counter in file 0 7:1 -> 7:2, (#1 - #2) +Emitting segments for file: ../coverage/assert.rs +Combined regions: + 5:5 -> 5:48 (count=4) + 6:16 -> 6:21 (count=4) + 6:37 -> 6:61 (count=1) + 7:1 -> 7:2 (count=3) + 10:9 -> 10:27 (count=1) + 11:11 -> 11:24 (count=10) + 12:12 -> 12:26 (count=10) + 12:27 -> 14:10 (count=0) + 14:19 -> 14:32 (count=10) + 14:33 -> 16:10 (count=3) + 16:10 -> 16:11 (count=15) + 17:9 -> 17:23 (count=9) + 19:5 -> 20:2 (count=0) +Segment at 5:5 (count = 4), RegionEntry +Segment at 5:48 (count = 0), Skipped +Segment at 6:16 (count = 4), RegionEntry +Segment at 6:21 (count = 0), Skipped +Segment at 6:37 (count = 1), RegionEntry +Segment at 6:61 (count = 0), Skipped +Segment at 7:1 (count = 3), RegionEntry +Segment at 7:2 (count = 0), Skipped +Segment at 10:9 (count = 1), RegionEntry +Segment at 10:27 (count = 0), Skipped +Segment at 11:11 (count = 10), RegionEntry +Segment at 11:24 (count = 0), Skipped +Segment at 12:12 (count = 10), RegionEntry +Segment at 12:26 (count = 0), Skipped +Segment at 12:27 (count = 0), RegionEntry +Segment at 14:10 (count = 0), Skipped +Segment at 14:19 (count = 10), RegionEntry +Segment at 14:32 (count = 0), Skipped +Segment at 14:33 (count = 3), RegionEntry +Segment at 16:10 (count = 15), RegionEntry +Segment at 16:11 (count = 0), Skipped +Segment at 17:9 (count = 9), RegionEntry +Segment at 17:23 (count = 0), Skipped +Segment at 19:5 (count = 0), RegionEntry +Segment at 20:2 (count = 0), Skipped diff --git a/src/test/run-make-fulldeps/coverage-reports-base/expected_show_coverage_counters.async.txt b/src/test/run-make-fulldeps/coverage-reports-base/expected_show_coverage_counters.async.txt new file mode 100644 index 000000000000..0490a319856b --- /dev/null +++ b/src/test/run-make-fulldeps/coverage-reports-base/expected_show_coverage_counters.async.txt @@ -0,0 +1,84 @@ +Counter in file 0 15:9 -> 15:75, #1 +Counter in file 0 15:9 -> 15:75, #1 +Counter in file 0 15:9 -> 15:75, #1 +Counter in file 0 47:13 -> 56:54, #1 +Counter in file 0 59:32 -> 59:35, ((#1 + #2) - #2) +Counter in file 0 59:39 -> 59:73, (#1 + #2) +Counter in file 0 60:23 -> 60:26, (((#1 + #2) - #2) + 0) +Counter in file 0 62:10 -> 62:11, #2 +Counter in file 0 63:5 -> 63:6, (((#1 + #2) - #2) + 0) +Counter in file 0 53:17 -> 53:19, #1 +Counter in file 0 30:1 -> 30:2, #1 +Counter in file 0 5:24 -> 5:25, #1 +Counter in file 0 14:1 -> 14:2, #1 +Counter in file 0 5:22 -> 5:25, #1 +Counter in file 0 25:19 -> 26:12, #1 +Counter in file 0 27:9 -> 27:10, #3 +Counter in file 0 27:14 -> 27:17, (#1 + 0) +Counter in file 0 27:27 -> 27:32, #2 +Counter in file 0 27:32 -> 27:33, (#2 - #3) +Counter in file 0 27:36 -> 27:38, (#3 + 0) +Counter in file 0 28:14 -> 28:16, #4 +Counter in file 0 30:1 -> 30:2, (#3 + #4) +Counter in file 0 23:1 -> 23:2, #1 +Counter in file 0 32:11 -> 37:2, #1 +Emitting segments for file: ../coverage/async.rs +Combined regions: + 5:22 -> 5:25 (count=1) + 5:24 -> 5:25 (count=1) + 14:1 -> 14:2 (count=1) + 23:1 -> 23:2 (count=1) + 25:19 -> 26:12 (count=1) + 27:9 -> 27:10 (count=0) + 27:14 -> 27:17 (count=1) + 27:27 -> 27:32 (count=1) + 27:32 -> 27:33 (count=1) + 27:36 -> 27:38 (count=0) + 28:14 -> 28:16 (count=1) + 30:1 -> 30:2 (count=2) + 32:11 -> 37:2 (count=1) + 47:13 -> 56:54 (count=1) + 53:17 -> 53:19 (count=1) + 59:32 -> 59:35 (count=1) + 59:39 -> 59:73 (count=1) + 60:23 -> 60:26 (count=1) + 62:10 -> 62:11 (count=0) + 63:5 -> 63:6 (count=1) +Segment at 5:22 (count = 1), RegionEntry +Segment at 5:24 (count = 1), RegionEntry +Segment at 5:25 (count = 0), Skipped +Segment at 14:1 (count = 1), RegionEntry +Segment at 14:2 (count = 0), Skipped +Segment at 23:1 (count = 1), RegionEntry +Segment at 23:2 (count = 0), Skipped +Segment at 25:19 (count = 1), RegionEntry +Segment at 26:12 (count = 0), Skipped +Segment at 27:9 (count = 0), RegionEntry +Segment at 27:10 (count = 0), Skipped +Segment at 27:14 (count = 1), RegionEntry +Segment at 27:17 (count = 0), Skipped +Segment at 27:27 (count = 1), RegionEntry +Segment at 27:32 (count = 1), RegionEntry +Segment at 27:33 (count = 0), Skipped +Segment at 27:36 (count = 0), RegionEntry +Segment at 27:38 (count = 0), Skipped +Segment at 28:14 (count = 1), RegionEntry +Segment at 28:16 (count = 0), Skipped +Segment at 30:1 (count = 2), RegionEntry +Segment at 30:2 (count = 0), Skipped +Segment at 32:11 (count = 1), RegionEntry +Segment at 37:2 (count = 0), Skipped +Segment at 47:13 (count = 1), RegionEntry +Segment at 53:17 (count = 1), RegionEntry +Segment at 53:19 (count = 1) +Segment at 56:54 (count = 0), Skipped +Segment at 59:32 (count = 1), RegionEntry +Segment at 59:35 (count = 0), Skipped +Segment at 59:39 (count = 1), RegionEntry +Segment at 59:73 (count = 0), Skipped +Segment at 60:23 (count = 1), RegionEntry +Segment at 60:26 (count = 0), Skipped +Segment at 62:10 (count = 0), RegionEntry +Segment at 62:11 (count = 0), Skipped +Segment at 63:5 (count = 1), RegionEntry +Segment at 63:6 (count = 0), Skipped diff --git a/src/test/run-make-fulldeps/coverage-reports-base/expected_show_coverage_counters.conditions.txt b/src/test/run-make-fulldeps/coverage-reports-base/expected_show_coverage_counters.conditions.txt index d48cd8074beb..a4c1a9c0f121 100644 --- a/src/test/run-make-fulldeps/coverage-reports-base/expected_show_coverage_counters.conditions.txt +++ b/src/test/run-make-fulldeps/coverage-reports-base/expected_show_coverage_counters.conditions.txt @@ -1,72 +1,91 @@ Counter in file 0 4:9 -> 4:26, #1 Counter in file 0 5:8 -> 5:12, (#1 + 0) Counter in file 0 5:13 -> 7:6, #2 -Counter in file 0 10:9 -> 10:10, (#4 + #11) +Counter in file 0 10:9 -> 10:10, (#3 + (#12 + #13)) Counter in file 0 10:16 -> 10:29, (#2 + 0) -Counter in file 0 11:9 -> 12:10, #4 +Counter in file 0 11:9 -> 12:10, #3 Counter in file 0 13:15 -> 13:28, ((#2 + 0) - #3) -Counter in file 0 14:12 -> 14:25, #5 -Counter in file 0 14:29 -> 14:42, (#5 - #13) -Counter in file 0 14:42 -> 14:43, (#13 + #14) -Counter in file 0 14:42 -> 14:43, ((#5 - #13) - #14) -Counter in file 0 14:46 -> 14:60, #21 -Counter in file 0 14:60 -> 14:61, (#17 + #18) -Counter in file 0 14:60 -> 14:61, (#21 - #18) -Counter in file 0 14:61 -> 16:10, #22 -Counter in file 0 16:10 -> 16:11, #23 -Counter in file 0 17:9 -> 18:18, #11 -Counter in file 0 20:9 -> 20:15, (((#2 + 0) - #3) - #5) -Counter in file 0 23:9 -> 23:26, ((#4 + #11) + 0) -Counter in file 0 24:8 -> 24:12, ((#4 + #11) + 0) -Counter in file 0 24:13 -> 26:6, #12 -Counter in file 0 28:8 -> 28:21, (#12 + 0) -Counter in file 0 29:9 -> 29:23, #16 -Counter in file 0 30:15 -> 30:28, ((#12 + 0) - #15) -Counter in file 0 31:12 -> 31:25, (((#12 + 0) - #15) - #8) -Counter in file 0 31:29 -> 31:42, ((((#12 + 0) - #15) - #8) - #24) -Counter in file 0 31:42 -> 31:43, (((((#12 + 0) - #15) - #8) - #24) - #25) +Counter in file 0 14:12 -> 14:25, #4 +Counter in file 0 14:29 -> 14:42, (#4 - #15) +Counter in file 0 14:42 -> 14:43, ((#4 - #15) - #16) +Counter in file 0 14:42 -> 14:43, (#15 + #16) +Counter in file 0 14:46 -> 14:60, #23 +Counter in file 0 14:60 -> 14:61, (#18 + #19) +Counter in file 0 14:60 -> 14:61, (#23 - #19) +Counter in file 0 14:61 -> 16:10, #12 +Counter in file 0 16:10 -> 16:11, #13 +Counter in file 0 17:9 -> 18:18, (#12 + #13) +Counter in file 0 20:9 -> 20:15, (((#2 + 0) - #3) - #4) +Counter in file 0 23:9 -> 23:26, ((#3 + (#12 + #13)) + 0) +Counter in file 0 24:8 -> 24:12, ((#3 + (#12 + #13)) + 0) +Counter in file 0 24:13 -> 26:6, #14 +Counter in file 0 28:8 -> 28:21, (#14 + 0) +Counter in file 0 28:22 -> 30:6, #17 +Counter in file 0 30:15 -> 30:28, ((#14 + 0) - #17) +Counter in file 0 31:12 -> 31:25, (((#14 + 0) - #17) - #8) +Counter in file 0 31:29 -> 31:42, ((((#14 + 0) - #17) - #8) - #24) +Counter in file 0 31:42 -> 31:43, (((((#14 + 0) - #17) - #8) - #24) - #25) Counter in file 0 31:42 -> 31:43, (#24 + #25) -Counter in file 0 31:46 -> 31:60, #32 -Counter in file 0 31:60 -> 31:61, (#28 + #29) -Counter in file 0 31:60 -> 31:61, (#32 - #29) -Counter in file 0 31:61 -> 33:10, #33 -Counter in file 0 33:10 -> 33:11, #34 -Counter in file 0 34:9 -> 34:23, #19 +Counter in file 0 31:46 -> 31:60, #34 +Counter in file 0 31:60 -> 31:61, (#34 - #32) +Counter in file 0 31:60 -> 31:61, (#31 + #32) +Counter in file 0 31:61 -> 33:10, #20 +Counter in file 0 33:10 -> 33:11, #21 +Counter in file 0 34:9 -> 34:23, (#20 + #21) Counter in file 0 36:9 -> 36:15, #8 -Counter in file 0 39:9 -> 39:26, (#16 + #19) -Counter in file 0 40:8 -> 40:12, ((#16 + #19) + 0) -Counter in file 0 40:13 -> 42:6, #20 -Counter in file 0 44:9 -> 44:10, (#27 + #30) -Counter in file 0 44:16 -> 44:29, (#20 + 0) -Counter in file 0 45:9 -> 45:23, #27 -Counter in file 0 46:15 -> 46:28, ((#20 + 0) - #26) -Counter in file 0 47:12 -> 47:25, (((#20 + 0) - #26) - #7) -Counter in file 0 47:29 -> 47:42, ((((#20 + 0) - #26) - #7) - #35) -Counter in file 0 47:42 -> 47:43, (#35 + #36) -Counter in file 0 47:42 -> 47:43, (((((#20 + 0) - #26) - #7) - #35) - #36) -Counter in file 0 47:46 -> 47:60, #41 -Counter in file 0 47:60 -> 47:61, (#37 + #38) -Counter in file 0 47:60 -> 47:61, (#41 - #38) -Counter in file 0 47:61 -> 49:10, #42 -Counter in file 0 49:10 -> 49:11, #43 -Counter in file 0 50:9 -> 50:23, #30 -Counter in file 0 52:13 -> 54:15, #7 -Counter in file 0 57:9 -> 57:10, (#9 + #10) -Counter in file 0 57:16 -> 57:29, ((#27 + #30) + 0) -Counter in file 0 58:9 -> 58:23, #9 -Counter in file 0 59:15 -> 59:28, ((#27 + #30) - #31) -Counter in file 0 60:12 -> 60:25, (((#27 + #30) - #31) - #6) -Counter in file 0 60:29 -> 60:42, ((((#27 + #30) - #31) - #6) - #39) -Counter in file 0 60:42 -> 60:43, (#39 + #40) -Counter in file 0 60:42 -> 60:43, (((((#27 + #30) - #31) - #6) - #39) - #40) -Counter in file 0 60:46 -> 60:60, #46 -Counter in file 0 60:60 -> 60:61, (#46 - #45) -Counter in file 0 60:60 -> 60:61, (#44 + #45) -Counter in file 0 60:61 -> 62:10, #47 -Counter in file 0 62:10 -> 62:11, #48 -Counter in file 0 63:9 -> 63:23, #10 -Counter in file 0 65:9 -> 65:15, #6 -Counter in file 0 67:1 -> 67:2, ((#9 + #10) + (((#6 + #7) + #8) + (((#2 + 0) - #3) - #5))) +Counter in file 0 39:8 -> 39:12, (#17 + (#20 + #21)) +Counter in file 0 52:13 -> 52:30, #22 +Counter in file 0 53:12 -> 53:16, (#22 + 0) +Counter in file 0 53:17 -> 55:10, #26 +Counter in file 0 57:12 -> 57:25, (#26 + 0) +Counter in file 0 57:26 -> 59:10, #27 +Counter in file 0 65:17 -> 65:30, ((#26 + 0) - #27) +Counter in file 0 66:16 -> 66:29, (((#26 + 0) - #27) - #7) +Counter in file 0 66:33 -> 66:46, ((((#26 + 0) - #27) - #7) - #37) +Counter in file 0 66:46 -> 66:47, (#37 + #38) +Counter in file 0 66:46 -> 66:47, (((((#26 + 0) - #27) - #7) - #37) - #38) +Counter in file 0 66:50 -> 66:64, #47 +Counter in file 0 66:64 -> 66:65, (#47 - #42) +Counter in file 0 66:64 -> 66:65, (#41 + #42) +Counter in file 0 66:65 -> 68:14, #28 +Counter in file 0 68:14 -> 68:15, #29 +Counter in file 0 69:13 -> 69:27, (#28 + #29) +Counter in file 0 71:13 -> 71:19, #7 +Counter in file 0 73:6 -> 73:7, (#27 + (#28 + #29)) +Counter in file 0 75:9 -> 75:26, ((#27 + (#28 + #29)) + 0) +Counter in file 0 76:8 -> 76:12, (((#27 + (#28 + #29)) + 0) + 0) +Counter in file 0 76:13 -> 78:6, #30 +Counter in file 0 80:9 -> 80:10, (#33 + (#35 + #36)) +Counter in file 0 80:16 -> 80:29, (#30 + 0) +Counter in file 0 80:30 -> 82:6, #33 +Counter in file 0 82:15 -> 82:28, ((#30 + 0) - #33) +Counter in file 0 83:12 -> 83:25, (((#30 + 0) - #33) - #6) +Counter in file 0 83:29 -> 83:42, ((((#30 + 0) - #33) - #6) - #39) +Counter in file 0 83:42 -> 83:43, (#39 + #40) +Counter in file 0 83:42 -> 83:43, (((((#30 + 0) - #33) - #6) - #39) - #40) +Counter in file 0 83:46 -> 83:60, #48 +Counter in file 0 83:60 -> 83:61, (#43 + #44) +Counter in file 0 83:60 -> 83:61, (#48 - #44) +Counter in file 0 83:61 -> 85:10, #35 +Counter in file 0 85:10 -> 85:11, #36 +Counter in file 0 86:9 -> 86:23, (#35 + #36) +Counter in file 0 88:13 -> 90:15, #6 +Counter in file 0 93:9 -> 93:10, (#9 + (#10 + #11)) +Counter in file 0 93:16 -> 93:29, ((#33 + (#35 + #36)) + 0) +Counter in file 0 93:30 -> 95:6, #9 +Counter in file 0 95:15 -> 95:28, ((#33 + (#35 + #36)) - #9) +Counter in file 0 96:12 -> 96:25, (((#33 + (#35 + #36)) - #9) - #5) +Counter in file 0 96:29 -> 96:42, ((((#33 + (#35 + #36)) - #9) - #5) - #45) +Counter in file 0 96:42 -> 96:43, (#45 + #46) +Counter in file 0 96:42 -> 96:43, (((((#33 + (#35 + #36)) - #9) - #5) - #45) - #46) +Counter in file 0 96:46 -> 96:60, #51 +Counter in file 0 96:60 -> 96:61, (#49 + #50) +Counter in file 0 96:60 -> 96:61, (#51 - #50) +Counter in file 0 96:61 -> 98:10, #10 +Counter in file 0 98:10 -> 98:11, #11 +Counter in file 0 99:9 -> 99:23, (#10 + #11) +Counter in file 0 101:9 -> 101:15, #5 +Counter in file 0 103:1 -> 103:2, ((#9 + (#10 + #11)) + (((#5 + #6) + (#7 + #8)) + (((#2 + 0) - #3) - #4))) Emitting segments for file: ../coverage/conditions.rs Combined regions: 4:9 -> 4:26 (count=1) @@ -89,7 +108,7 @@ Combined regions: 24:8 -> 24:12 (count=1) 24:13 -> 26:6 (count=1) 28:8 -> 28:21 (count=1) - 29:9 -> 29:23 (count=1) + 28:22 -> 30:6 (count=1) 30:15 -> 30:28 (count=0) 31:12 -> 31:25 (count=0) 31:29 -> 31:42 (count=0) @@ -100,36 +119,53 @@ Combined regions: 33:10 -> 33:11 (count=0) 34:9 -> 34:23 (count=0) 36:9 -> 36:15 (count=0) - 39:9 -> 39:26 (count=1) - 40:8 -> 40:12 (count=1) - 40:13 -> 42:6 (count=1) - 44:9 -> 44:10 (count=0) - 44:16 -> 44:29 (count=1) - 45:9 -> 45:23 (count=0) - 46:15 -> 46:28 (count=1) - 47:12 -> 47:25 (count=0) - 47:29 -> 47:42 (count=0) - 47:42 -> 47:43 (count=0) - 47:46 -> 47:60 (count=0) - 47:60 -> 47:61 (count=0) - 47:61 -> 49:10 (count=0) - 49:10 -> 49:11 (count=0) - 50:9 -> 50:23 (count=0) - 52:13 -> 54:15 (count=1) - 57:9 -> 57:10 (count=0) - 57:16 -> 57:29 (count=0) - 58:9 -> 58:23 (count=0) - 59:15 -> 59:28 (count=0) - 60:12 -> 60:25 (count=0) - 60:29 -> 60:42 (count=0) - 60:42 -> 60:43 (count=0) - 60:46 -> 60:60 (count=0) - 60:60 -> 60:61 (count=0) - 60:61 -> 62:10 (count=0) - 62:10 -> 62:11 (count=0) - 63:9 -> 63:23 (count=0) - 65:9 -> 65:15 (count=0) - 67:1 -> 67:2 (count=1) + 39:8 -> 39:12 (count=1) + 52:13 -> 52:30 (count=1) + 53:12 -> 53:16 (count=1) + 53:17 -> 55:10 (count=1) + 57:12 -> 57:25 (count=1) + 57:26 -> 59:10 (count=1) + 65:17 -> 65:30 (count=0) + 66:16 -> 66:29 (count=0) + 66:33 -> 66:46 (count=0) + 66:46 -> 66:47 (count=0) + 66:50 -> 66:64 (count=0) + 66:64 -> 66:65 (count=0) + 66:65 -> 68:14 (count=0) + 68:14 -> 68:15 (count=0) + 69:13 -> 69:27 (count=0) + 71:13 -> 71:19 (count=0) + 73:6 -> 73:7 (count=1) + 75:9 -> 75:26 (count=1) + 76:8 -> 76:12 (count=1) + 76:13 -> 78:6 (count=1) + 80:9 -> 80:10 (count=0) + 80:16 -> 80:29 (count=1) + 80:30 -> 82:6 (count=0) + 82:15 -> 82:28 (count=1) + 83:12 -> 83:25 (count=0) + 83:29 -> 83:42 (count=0) + 83:42 -> 83:43 (count=0) + 83:46 -> 83:60 (count=0) + 83:60 -> 83:61 (count=0) + 83:61 -> 85:10 (count=0) + 85:10 -> 85:11 (count=0) + 86:9 -> 86:23 (count=0) + 88:13 -> 90:15 (count=1) + 93:9 -> 93:10 (count=0) + 93:16 -> 93:29 (count=0) + 93:30 -> 95:6 (count=0) + 95:15 -> 95:28 (count=0) + 96:12 -> 96:25 (count=0) + 96:29 -> 96:42 (count=0) + 96:42 -> 96:43 (count=0) + 96:46 -> 96:60 (count=0) + 96:60 -> 96:61 (count=0) + 96:61 -> 98:10 (count=0) + 98:10 -> 98:11 (count=0) + 99:9 -> 99:23 (count=0) + 101:9 -> 101:15 (count=0) + 103:1 -> 103:2 (count=1) Segment at 4:9 (count = 1), RegionEntry Segment at 4:26 (count = 0), Skipped Segment at 5:8 (count = 1), RegionEntry @@ -166,8 +202,8 @@ Segment at 24:13 (count = 1), RegionEntry Segment at 26:6 (count = 0), Skipped Segment at 28:8 (count = 1), RegionEntry Segment at 28:21 (count = 0), Skipped -Segment at 29:9 (count = 1), RegionEntry -Segment at 29:23 (count = 0), Skipped +Segment at 28:22 (count = 1), RegionEntry +Segment at 30:6 (count = 0), Skipped Segment at 30:15 (count = 0), RegionEntry Segment at 30:28 (count = 0), Skipped Segment at 31:12 (count = 0), RegionEntry @@ -184,55 +220,85 @@ Segment at 34:9 (count = 0), RegionEntry Segment at 34:23 (count = 0), Skipped Segment at 36:9 (count = 0), RegionEntry Segment at 36:15 (count = 0), Skipped -Segment at 39:9 (count = 1), RegionEntry -Segment at 39:26 (count = 0), Skipped -Segment at 40:8 (count = 1), RegionEntry -Segment at 40:12 (count = 0), Skipped -Segment at 40:13 (count = 1), RegionEntry -Segment at 42:6 (count = 0), Skipped -Segment at 44:9 (count = 0), RegionEntry -Segment at 44:10 (count = 0), Skipped -Segment at 44:16 (count = 1), RegionEntry -Segment at 44:29 (count = 0), Skipped -Segment at 45:9 (count = 0), RegionEntry -Segment at 45:23 (count = 0), Skipped -Segment at 46:15 (count = 1), RegionEntry -Segment at 46:28 (count = 0), Skipped -Segment at 47:12 (count = 0), RegionEntry -Segment at 47:25 (count = 0), Skipped -Segment at 47:29 (count = 0), RegionEntry -Segment at 47:42 (count = 0), RegionEntry -Segment at 47:43 (count = 0), Skipped -Segment at 47:46 (count = 0), RegionEntry -Segment at 47:60 (count = 0), RegionEntry -Segment at 47:61 (count = 0), RegionEntry -Segment at 49:10 (count = 0), RegionEntry -Segment at 49:11 (count = 0), Skipped -Segment at 50:9 (count = 0), RegionEntry -Segment at 50:23 (count = 0), Skipped +Segment at 39:8 (count = 1), RegionEntry +Segment at 39:12 (count = 0), Skipped Segment at 52:13 (count = 1), RegionEntry -Segment at 54:15 (count = 0), Skipped -Segment at 57:9 (count = 0), RegionEntry -Segment at 57:10 (count = 0), Skipped -Segment at 57:16 (count = 0), RegionEntry -Segment at 57:29 (count = 0), Skipped -Segment at 58:9 (count = 0), RegionEntry -Segment at 58:23 (count = 0), Skipped -Segment at 59:15 (count = 0), RegionEntry -Segment at 59:28 (count = 0), Skipped -Segment at 60:12 (count = 0), RegionEntry -Segment at 60:25 (count = 0), Skipped -Segment at 60:29 (count = 0), RegionEntry -Segment at 60:42 (count = 0), RegionEntry -Segment at 60:43 (count = 0), Skipped -Segment at 60:46 (count = 0), RegionEntry -Segment at 60:60 (count = 0), RegionEntry -Segment at 60:61 (count = 0), RegionEntry -Segment at 62:10 (count = 0), RegionEntry -Segment at 62:11 (count = 0), Skipped -Segment at 63:9 (count = 0), RegionEntry -Segment at 63:23 (count = 0), Skipped -Segment at 65:9 (count = 0), RegionEntry -Segment at 65:15 (count = 0), Skipped -Segment at 67:1 (count = 1), RegionEntry -Segment at 67:2 (count = 0), Skipped +Segment at 52:30 (count = 0), Skipped +Segment at 53:12 (count = 1), RegionEntry +Segment at 53:16 (count = 0), Skipped +Segment at 53:17 (count = 1), RegionEntry +Segment at 55:10 (count = 0), Skipped +Segment at 57:12 (count = 1), RegionEntry +Segment at 57:25 (count = 0), Skipped +Segment at 57:26 (count = 1), RegionEntry +Segment at 59:10 (count = 0), Skipped +Segment at 65:17 (count = 0), RegionEntry +Segment at 65:30 (count = 0), Skipped +Segment at 66:16 (count = 0), RegionEntry +Segment at 66:29 (count = 0), Skipped +Segment at 66:33 (count = 0), RegionEntry +Segment at 66:46 (count = 0), RegionEntry +Segment at 66:47 (count = 0), Skipped +Segment at 66:50 (count = 0), RegionEntry +Segment at 66:64 (count = 0), RegionEntry +Segment at 66:65 (count = 0), RegionEntry +Segment at 68:14 (count = 0), RegionEntry +Segment at 68:15 (count = 0), Skipped +Segment at 69:13 (count = 0), RegionEntry +Segment at 69:27 (count = 0), Skipped +Segment at 71:13 (count = 0), RegionEntry +Segment at 71:19 (count = 0), Skipped +Segment at 73:6 (count = 1), RegionEntry +Segment at 73:7 (count = 0), Skipped +Segment at 75:9 (count = 1), RegionEntry +Segment at 75:26 (count = 0), Skipped +Segment at 76:8 (count = 1), RegionEntry +Segment at 76:12 (count = 0), Skipped +Segment at 76:13 (count = 1), RegionEntry +Segment at 78:6 (count = 0), Skipped +Segment at 80:9 (count = 0), RegionEntry +Segment at 80:10 (count = 0), Skipped +Segment at 80:16 (count = 1), RegionEntry +Segment at 80:29 (count = 0), Skipped +Segment at 80:30 (count = 0), RegionEntry +Segment at 82:6 (count = 0), Skipped +Segment at 82:15 (count = 1), RegionEntry +Segment at 82:28 (count = 0), Skipped +Segment at 83:12 (count = 0), RegionEntry +Segment at 83:25 (count = 0), Skipped +Segment at 83:29 (count = 0), RegionEntry +Segment at 83:42 (count = 0), RegionEntry +Segment at 83:43 (count = 0), Skipped +Segment at 83:46 (count = 0), RegionEntry +Segment at 83:60 (count = 0), RegionEntry +Segment at 83:61 (count = 0), RegionEntry +Segment at 85:10 (count = 0), RegionEntry +Segment at 85:11 (count = 0), Skipped +Segment at 86:9 (count = 0), RegionEntry +Segment at 86:23 (count = 0), Skipped +Segment at 88:13 (count = 1), RegionEntry +Segment at 90:15 (count = 0), Skipped +Segment at 93:9 (count = 0), RegionEntry +Segment at 93:10 (count = 0), Skipped +Segment at 93:16 (count = 0), RegionEntry +Segment at 93:29 (count = 0), Skipped +Segment at 93:30 (count = 0), RegionEntry +Segment at 95:6 (count = 0), Skipped +Segment at 95:15 (count = 0), RegionEntry +Segment at 95:28 (count = 0), Skipped +Segment at 96:12 (count = 0), RegionEntry +Segment at 96:25 (count = 0), Skipped +Segment at 96:29 (count = 0), RegionEntry +Segment at 96:42 (count = 0), RegionEntry +Segment at 96:43 (count = 0), Skipped +Segment at 96:46 (count = 0), RegionEntry +Segment at 96:60 (count = 0), RegionEntry +Segment at 96:61 (count = 0), RegionEntry +Segment at 98:10 (count = 0), RegionEntry +Segment at 98:11 (count = 0), Skipped +Segment at 99:9 (count = 0), RegionEntry +Segment at 99:23 (count = 0), Skipped +Segment at 101:9 (count = 0), RegionEntry +Segment at 101:15 (count = 0), Skipped +Segment at 103:1 (count = 1), RegionEntry +Segment at 103:2 (count = 0), Skipped diff --git a/src/test/run-make-fulldeps/coverage-reports-base/expected_show_coverage_counters.inner_items.txt b/src/test/run-make-fulldeps/coverage-reports-base/expected_show_coverage_counters.inner_items.txt index 65cd6481af4c..e4dfae768178 100644 --- a/src/test/run-make-fulldeps/coverage-reports-base/expected_show_coverage_counters.inner_items.txt +++ b/src/test/run-make-fulldeps/coverage-reports-base/expected_show_coverage_counters.inner_items.txt @@ -1,7 +1,4 @@ -Counter in file 0 19:13 -> 19:18, #1 -Counter in file 0 20:13 -> 20:14, #2 -Counter in file 0 20:17 -> 20:22, (#1 + 0) -Counter in file 0 21:9 -> 22:6, (#2 + 0) +Counter in file 0 19:13 -> 22:6, #1 Counter in file 0 7:9 -> 9:26, #1 Counter in file 0 10:8 -> 10:15, (#1 + 0) Counter in file 0 10:16 -> 12:6, #2 @@ -11,21 +8,16 @@ Counter in file 0 48:16 -> 50:6, #3 Counter in file 0 50:6 -> 50:7, ((#2 + (#1 - #2)) - #3) Counter in file 0 52:9 -> 57:2, (#3 + ((#2 + (#1 - #2)) - #3)) Counter in file 0 33:42 -> 36:10, #1 -Counter in file 0 41:37 -> 41:41, #1 -Counter in file 0 42:13 -> 43:10, #2 +Counter in file 0 40:45 -> 43:10, #1 Emitting segments for file: ../coverage/inner_items.rs Combined regions: 7:9 -> 9:26 (count=1) 10:8 -> 10:15 (count=1) 10:16 -> 12:6 (count=1) 12:6 -> 12:7 (count=0) - 19:13 -> 19:18 (count=3) - 20:13 -> 20:14 (count=3) - 20:17 -> 20:22 (count=3) - 21:9 -> 22:6 (count=3) + 19:13 -> 22:6 (count=3) 33:42 -> 36:10 (count=1) - 41:37 -> 41:41 (count=1) - 42:13 -> 43:10 (count=1) + 40:45 -> 43:10 (count=1) 48:8 -> 48:15 (count=1) 48:16 -> 50:6 (count=1) 50:6 -> 50:7 (count=0) @@ -38,18 +30,10 @@ Segment at 10:16 (count = 1), RegionEntry Segment at 12:6 (count = 0), RegionEntry Segment at 12:7 (count = 0), Skipped Segment at 19:13 (count = 3), RegionEntry -Segment at 19:18 (count = 0), Skipped -Segment at 20:13 (count = 3), RegionEntry -Segment at 20:14 (count = 0), Skipped -Segment at 20:17 (count = 3), RegionEntry -Segment at 20:22 (count = 0), Skipped -Segment at 21:9 (count = 3), RegionEntry Segment at 22:6 (count = 0), Skipped Segment at 33:42 (count = 1), RegionEntry Segment at 36:10 (count = 0), Skipped -Segment at 41:37 (count = 1), RegionEntry -Segment at 41:41 (count = 0), Skipped -Segment at 42:13 (count = 1), RegionEntry +Segment at 40:45 (count = 1), RegionEntry Segment at 43:10 (count = 0), Skipped Segment at 48:8 (count = 1), RegionEntry Segment at 48:15 (count = 0), Skipped diff --git a/src/test/run-make-fulldeps/coverage-reports-base/expected_show_coverage_counters.nested_loops.txt b/src/test/run-make-fulldeps/coverage-reports-base/expected_show_coverage_counters.nested_loops.txt index f50300735331..f8e504c56c48 100644 --- a/src/test/run-make-fulldeps/coverage-reports-base/expected_show_coverage_counters.nested_loops.txt +++ b/src/test/run-make-fulldeps/coverage-reports-base/expected_show_coverage_counters.nested_loops.txt @@ -1,21 +1,20 @@ Counter in file 0 2:9 -> 3:27, #1 -Counter in file 0 5:19 -> 5:32, (#1 + #2) -Counter in file 0 6:13 -> 7:24, ((#1 + #2) - #3) -Counter in file 0 8:13 -> 8:14, ((((#1 + #2) - #3) + (#5 + #6)) - #7) -Counter in file 0 8:18 -> 8:23, (((#1 + #2) - #3) + (#5 + #6)) -Counter in file 0 9:16 -> 9:22, (((((#1 + #2) - #3) + (#5 + #6)) - #7) + 0) -Counter in file 0 10:17 -> 10:22, #8 -Counter in file 0 12:13 -> 12:19, #9 -Counter in file 0 13:13 -> 13:19, #10 -Counter in file 0 14:16 -> 14:22, (#10 + 0) -Counter in file 0 15:17 -> 16:27, #11 -Counter in file 0 17:21 -> 17:33, #4 -Counter in file 0 19:21 -> 21:14, #5 -Counter in file 0 21:14 -> 21:15, #6 -Counter in file 0 22:10 -> 22:11, (#5 + #6) -Counter in file 0 23:9 -> 23:23, #2 -Counter in file 0 24:6 -> 24:7, #3 -Counter in file 0 25:1 -> 25:2, (#4 + #3) +Counter in file 0 5:19 -> 5:32, (#1 + (#2 + #3)) +Counter in file 0 6:13 -> 7:24, ((#1 + (#2 + #3)) - #4) +Counter in file 0 8:13 -> 8:14, ((((#1 + (#2 + #3)) - #4) + (#6 + #7)) - #3) +Counter in file 0 8:18 -> 8:23, (((#1 + (#2 + #3)) - #4) + (#6 + #7)) +Counter in file 0 9:16 -> 9:22, (((((#1 + (#2 + #3)) - #4) + (#6 + #7)) - #3) + 0) +Counter in file 0 10:17 -> 10:22, #2 +Counter in file 0 12:13 -> 13:19, (((((#1 + (#2 + #3)) - #4) + (#6 + #7)) - #3) - #2) +Counter in file 0 14:16 -> 14:22, ((((((#1 + (#2 + #3)) - #4) + (#6 + #7)) - #3) - #2) + 0) +Counter in file 0 15:17 -> 16:27, ((((((#1 + (#2 + #3)) - #4) + (#6 + #7)) - #3) - #2) - #7) +Counter in file 0 17:21 -> 17:33, #5 +Counter in file 0 18:24 -> 21:14, #6 +Counter in file 0 21:14 -> 21:15, #7 +Counter in file 0 22:10 -> 22:11, (#6 + #7) +Counter in file 0 23:9 -> 23:23, (#2 + #3) +Counter in file 0 24:6 -> 24:7, #4 +Counter in file 0 25:1 -> 25:2, (#5 + #4) Emitting segments for file: ../coverage/nested_loops.rs Combined regions: 2:9 -> 3:27 (count=1) @@ -25,12 +24,11 @@ Combined regions: 8:18 -> 8:23 (count=3) 9:16 -> 9:22 (count=3) 10:17 -> 10:22 (count=0) - 12:13 -> 12:19 (count=3) - 13:13 -> 13:19 (count=3) + 12:13 -> 13:19 (count=3) 14:16 -> 14:22 (count=3) 15:17 -> 16:27 (count=1) 17:21 -> 17:33 (count=1) - 19:21 -> 21:14 (count=0) + 18:24 -> 21:14 (count=0) 21:14 -> 21:15 (count=2) 22:10 -> 22:11 (count=2) 23:9 -> 23:23 (count=0) @@ -51,8 +49,6 @@ Segment at 9:22 (count = 0), Skipped Segment at 10:17 (count = 0), RegionEntry Segment at 10:22 (count = 0), Skipped Segment at 12:13 (count = 3), RegionEntry -Segment at 12:19 (count = 0), Skipped -Segment at 13:13 (count = 3), RegionEntry Segment at 13:19 (count = 0), Skipped Segment at 14:16 (count = 3), RegionEntry Segment at 14:22 (count = 0), Skipped @@ -60,7 +56,7 @@ Segment at 15:17 (count = 1), RegionEntry Segment at 16:27 (count = 0), Skipped Segment at 17:21 (count = 1), RegionEntry Segment at 17:33 (count = 0), Skipped -Segment at 19:21 (count = 0), RegionEntry +Segment at 18:24 (count = 0), RegionEntry Segment at 21:14 (count = 2), RegionEntry Segment at 21:15 (count = 0), Skipped Segment at 22:10 (count = 2), RegionEntry diff --git a/src/test/run-make-fulldeps/coverage-reports-base/expected_show_coverage_counters.overflow.txt b/src/test/run-make-fulldeps/coverage-reports-base/expected_show_coverage_counters.overflow.txt new file mode 100644 index 000000000000..8696e102b568 --- /dev/null +++ b/src/test/run-make-fulldeps/coverage-reports-base/expected_show_coverage_counters.overflow.txt @@ -0,0 +1,53 @@ +Counter in file 0 16:9 -> 16:27, #1 +Counter in file 0 17:11 -> 17:24, (#1 + (#2 + (#3 + #4))) +Counter in file 0 18:12 -> 18:26, ((#1 + (#2 + (#3 + #4))) - #5) +Counter in file 0 18:27 -> 21:10, #2 +Counter in file 0 21:19 -> 21:32, (((#1 + (#2 + (#3 + #4))) - #5) - #2) +Counter in file 0 21:33 -> 24:10, #3 +Counter in file 0 24:10 -> 24:11, #4 +Counter in file 0 24:10 -> 24:11, (#3 + #4) +Counter in file 0 25:9 -> 25:23, (#2 + (#3 + #4)) +Counter in file 0 27:5 -> 28:2, #5 +Counter in file 0 5:8 -> 5:18, #1 +Counter in file 0 5:19 -> 7:6, #2 +Counter in file 0 7:6 -> 7:7, (#1 - #2) +Counter in file 0 8:9 -> 13:2, (#2 + (#1 - #2)) +Emitting segments for file: ../coverage/overflow.rs +Combined regions: + 5:8 -> 5:18 (count=4) + 5:19 -> 7:6 (count=1) + 7:6 -> 7:7 (count=3) + 8:9 -> 13:2 (count=4) + 16:9 -> 16:27 (count=1) + 17:11 -> 17:24 (count=10) + 18:12 -> 18:26 (count=10) + 18:27 -> 21:10 (count=0) + 21:19 -> 21:32 (count=10) + 21:33 -> 24:10 (count=3) + 24:10 -> 24:11 (count=15) + 25:9 -> 25:23 (count=9) + 27:5 -> 28:2 (count=0) +Segment at 5:8 (count = 4), RegionEntry +Segment at 5:18 (count = 0), Skipped +Segment at 5:19 (count = 1), RegionEntry +Segment at 7:6 (count = 3), RegionEntry +Segment at 7:7 (count = 0), Skipped +Segment at 8:9 (count = 4), RegionEntry +Segment at 13:2 (count = 0), Skipped +Segment at 16:9 (count = 1), RegionEntry +Segment at 16:27 (count = 0), Skipped +Segment at 17:11 (count = 10), RegionEntry +Segment at 17:24 (count = 0), Skipped +Segment at 18:12 (count = 10), RegionEntry +Segment at 18:26 (count = 0), Skipped +Segment at 18:27 (count = 0), RegionEntry +Segment at 21:10 (count = 0), Skipped +Segment at 21:19 (count = 10), RegionEntry +Segment at 21:32 (count = 0), Skipped +Segment at 21:33 (count = 3), RegionEntry +Segment at 24:10 (count = 15), RegionEntry +Segment at 24:11 (count = 0), Skipped +Segment at 25:9 (count = 9), RegionEntry +Segment at 25:23 (count = 0), Skipped +Segment at 27:5 (count = 0), RegionEntry +Segment at 28:2 (count = 0), Skipped diff --git a/src/test/run-make-fulldeps/coverage-reports-base/expected_show_coverage_counters.panic_unwind.txt b/src/test/run-make-fulldeps/coverage-reports-base/expected_show_coverage_counters.panic_unwind.txt new file mode 100644 index 000000000000..9602ff1a985a --- /dev/null +++ b/src/test/run-make-fulldeps/coverage-reports-base/expected_show_coverage_counters.panic_unwind.txt @@ -0,0 +1,50 @@ +Counter in file 0 14:9 -> 14:27, #1 +Counter in file 0 15:11 -> 15:24, (#1 + (#2 + (#3 + #4))) +Counter in file 0 16:12 -> 16:26, ((#1 + (#2 + (#3 + #4))) - #5) +Counter in file 0 16:27 -> 18:10, #2 +Counter in file 0 18:19 -> 18:32, (((#1 + (#2 + (#3 + #4))) - #5) - #2) +Counter in file 0 18:33 -> 20:10, #3 +Counter in file 0 20:10 -> 20:11, #4 +Counter in file 0 20:10 -> 20:11, (#3 + #4) +Counter in file 0 21:9 -> 21:23, (#2 + (#3 + #4)) +Counter in file 0 23:5 -> 24:2, #5 +Counter in file 0 5:8 -> 5:20, #1 +Counter in file 0 6:9 -> 7:26, #2 +Counter in file 0 8:12 -> 11:2, (#1 - #2) +Emitting segments for file: ../coverage/panic_unwind.rs +Combined regions: + 5:8 -> 5:20 (count=4) + 6:9 -> 7:26 (count=1) + 8:12 -> 11:2 (count=3) + 14:9 -> 14:27 (count=1) + 15:11 -> 15:24 (count=10) + 16:12 -> 16:26 (count=10) + 16:27 -> 18:10 (count=0) + 18:19 -> 18:32 (count=10) + 18:33 -> 20:10 (count=3) + 20:10 -> 20:11 (count=15) + 21:9 -> 21:23 (count=9) + 23:5 -> 24:2 (count=0) +Segment at 5:8 (count = 4), RegionEntry +Segment at 5:20 (count = 0), Skipped +Segment at 6:9 (count = 1), RegionEntry +Segment at 7:26 (count = 0), Skipped +Segment at 8:12 (count = 3), RegionEntry +Segment at 11:2 (count = 0), Skipped +Segment at 14:9 (count = 1), RegionEntry +Segment at 14:27 (count = 0), Skipped +Segment at 15:11 (count = 10), RegionEntry +Segment at 15:24 (count = 0), Skipped +Segment at 16:12 (count = 10), RegionEntry +Segment at 16:26 (count = 0), Skipped +Segment at 16:27 (count = 0), RegionEntry +Segment at 18:10 (count = 0), Skipped +Segment at 18:19 (count = 10), RegionEntry +Segment at 18:32 (count = 0), Skipped +Segment at 18:33 (count = 3), RegionEntry +Segment at 20:10 (count = 15), RegionEntry +Segment at 20:11 (count = 0), Skipped +Segment at 21:9 (count = 9), RegionEntry +Segment at 21:23 (count = 0), Skipped +Segment at 23:5 (count = 0), RegionEntry +Segment at 24:2 (count = 0), Skipped diff --git a/src/test/run-make-fulldeps/coverage-reports-base/expected_show_coverage_counters.simple_loop.txt b/src/test/run-make-fulldeps/coverage-reports-base/expected_show_coverage_counters.simple_loop.txt index 255173e5534d..6ea09248d65c 100644 --- a/src/test/run-make-fulldeps/coverage-reports-base/expected_show_coverage_counters.simple_loop.txt +++ b/src/test/run-make-fulldeps/coverage-reports-base/expected_show_coverage_counters.simple_loop.txt @@ -3,10 +3,10 @@ Counter in file 0 12:9 -> 12:16, (#1 + 0) Counter in file 0 13:5 -> 18:6, #2 Counter in file 0 18:6 -> 18:7, (#1 - #2) Counter in file 0 23:13 -> 25:14, ((#2 + (#1 - #2)) + #3) -Counter in file 0 27:13 -> 27:18, #4 +Counter in file 0 27:13 -> 27:18, (((#2 + (#1 - #2)) + #3) - #3) Counter in file 0 30:9 -> 32:10, #3 Counter in file 0 34:6 -> 34:7, (#2 + (#1 - #2)) -Counter in file 0 35:1 -> 35:2, (#4 + 0) +Counter in file 0 35:1 -> 35:2, ((((#2 + (#1 - #2)) + #3) - #3) + 0) Emitting segments for file: ../coverage/simple_loop.rs Combined regions: 7:9 -> 9:26 (count=1) diff --git a/src/test/run-make-fulldeps/coverage-reports-base/expected_show_coverage_counters.try_error_result.txt b/src/test/run-make-fulldeps/coverage-reports-base/expected_show_coverage_counters.try_error_result.txt index a317cd792910..5b7f5496af81 100644 --- a/src/test/run-make-fulldeps/coverage-reports-base/expected_show_coverage_counters.try_error_result.txt +++ b/src/test/run-make-fulldeps/coverage-reports-base/expected_show_coverage_counters.try_error_result.txt @@ -1,12 +1,12 @@ Counter in file 0 13:9 -> 14:23, #1 Counter in file 0 17:9 -> 17:10, ((#1 + (#2 + #3)) - #4) Counter in file 0 19:9 -> 19:14, (#1 + (#2 + #3)) -Counter in file 0 21:9 -> 25:26, #8 -Counter in file 0 27:13 -> 27:41, #9 +Counter in file 0 21:9 -> 25:26, (((#1 + (#2 + #3)) - #4) + 0) +Counter in file 0 27:13 -> 27:41, #8 Counter in file 0 27:41 -> 27:42, #5 -Counter in file 0 28:13 -> 28:42, (#9 - #5) +Counter in file 0 28:13 -> 28:42, (#8 - #5) Counter in file 0 28:42 -> 28:43, #6 -Counter in file 0 32:13 -> 32:42, (#8 - #9) +Counter in file 0 32:13 -> 32:42, (((#1 + (#2 + #3)) - #4) - #8) Counter in file 0 32:42 -> 32:43, #7 Counter in file 0 33:10 -> 33:11, #2 Counter in file 0 33:10 -> 33:11, #3 diff --git a/src/test/run-make-fulldeps/coverage-reports-base/expected_show_coverage_counters.while_early_ret.txt b/src/test/run-make-fulldeps/coverage-reports-base/expected_show_coverage_counters.while_early_ret.txt index f541baec50c0..7e79a8f00e1a 100644 --- a/src/test/run-make-fulldeps/coverage-reports-base/expected_show_coverage_counters.while_early_ret.txt +++ b/src/test/run-make-fulldeps/coverage-reports-base/expected_show_coverage_counters.while_early_ret.txt @@ -1,7 +1,7 @@ Counter in file 0 5:9 -> 5:27, #1 Counter in file 0 7:9 -> 9:10, (#1 + #2) Counter in file 0 12:13 -> 14:14, ((#1 + #2) - #3) -Counter in file 0 18:21 -> 20:22, #6 +Counter in file 0 18:21 -> 20:22, (((#1 + #2) - #3) - #2) Counter in file 0 22:21 -> 22:27, #4 Counter in file 0 26:21 -> 26:27, #5 Counter in file 0 30:9 -> 32:10, #2 diff --git a/src/test/run-make-fulldeps/coverage-reports-base/expected_show_coverage_counters.yield.txt b/src/test/run-make-fulldeps/coverage-reports-base/expected_show_coverage_counters.yield.txt new file mode 100644 index 000000000000..a10753582116 --- /dev/null +++ b/src/test/run-make-fulldeps/coverage-reports-base/expected_show_coverage_counters.yield.txt @@ -0,0 +1,90 @@ +Counter in file 0 8:9 -> 8:22, #1 +Counter in file 0 13:11 -> 14:35, (#1 + 0) +Counter in file 0 14:39 -> 14:41, #4 +Counter in file 0 15:14 -> 15:52, (#2 + #3) +Counter in file 0 17:11 -> 17:46, (#4 + 0) +Counter in file 0 18:34 -> 18:39, (#4 - #5) +Counter in file 0 18:44 -> 18:46, ((#4 - #5) - #6) +Counter in file 0 19:14 -> 19:52, (#5 + #6) +Counter in file 0 22:9 -> 22:22, (((#4 - #5) - #6) + 0) +Counter in file 0 29:11 -> 30:35, (((#4 - #5) - #6) + 0) +Counter in file 0 30:39 -> 30:41, #9 +Counter in file 0 31:14 -> 31:52, (#7 + #8) +Counter in file 0 33:11 -> 34:35, (#9 + 0) +Counter in file 0 34:39 -> 34:41, #12 +Counter in file 0 35:14 -> 35:52, (#10 + #11) +Counter in file 0 37:1 -> 37:2, (#12 + 0) +Counter in file 0 9:9 -> 9:16, #1 +Counter in file 0 10:16 -> 11:6, #2 +Counter in file 0 23:9 -> 23:16, #1 +Counter in file 0 24:9 -> 24:16, #2 +Counter in file 0 25:9 -> 25:16, #3 +Counter in file 0 26:16 -> 27:6, #4 +Emitting segments for file: ../coverage/yield.rs +Combined regions: + 8:9 -> 8:22 (count=1) + 9:9 -> 9:16 (count=1) + 10:16 -> 11:6 (count=1) + 13:11 -> 14:35 (count=1) + 14:39 -> 14:41 (count=1) + 15:14 -> 15:52 (count=0) + 17:11 -> 17:46 (count=1) + 18:34 -> 18:39 (count=1) + 18:44 -> 18:46 (count=1) + 19:14 -> 19:52 (count=0) + 22:9 -> 22:22 (count=1) + 23:9 -> 23:16 (count=1) + 24:9 -> 24:16 (count=1) + 25:9 -> 25:16 (count=0) + 26:16 -> 27:6 (count=0) + 29:11 -> 30:35 (count=1) + 30:39 -> 30:41 (count=1) + 31:14 -> 31:52 (count=0) + 33:11 -> 34:35 (count=1) + 34:39 -> 34:41 (count=1) + 35:14 -> 35:52 (count=0) + 37:1 -> 37:2 (count=1) +Segment at 8:9 (count = 1), RegionEntry +Segment at 8:22 (count = 0), Skipped +Segment at 9:9 (count = 1), RegionEntry +Segment at 9:16 (count = 0), Skipped +Segment at 10:16 (count = 1), RegionEntry +Segment at 11:6 (count = 0), Skipped +Segment at 13:11 (count = 1), RegionEntry +Segment at 14:35 (count = 0), Skipped +Segment at 14:39 (count = 1), RegionEntry +Segment at 14:41 (count = 0), Skipped +Segment at 15:14 (count = 0), RegionEntry +Segment at 15:52 (count = 0), Skipped +Segment at 17:11 (count = 1), RegionEntry +Segment at 17:46 (count = 0), Skipped +Segment at 18:34 (count = 1), RegionEntry +Segment at 18:39 (count = 0), Skipped +Segment at 18:44 (count = 1), RegionEntry +Segment at 18:46 (count = 0), Skipped +Segment at 19:14 (count = 0), RegionEntry +Segment at 19:52 (count = 0), Skipped +Segment at 22:9 (count = 1), RegionEntry +Segment at 22:22 (count = 0), Skipped +Segment at 23:9 (count = 1), RegionEntry +Segment at 23:16 (count = 0), Skipped +Segment at 24:9 (count = 1), RegionEntry +Segment at 24:16 (count = 0), Skipped +Segment at 25:9 (count = 0), RegionEntry +Segment at 25:16 (count = 0), Skipped +Segment at 26:16 (count = 0), RegionEntry +Segment at 27:6 (count = 0), Skipped +Segment at 29:11 (count = 1), RegionEntry +Segment at 30:35 (count = 0), Skipped +Segment at 30:39 (count = 1), RegionEntry +Segment at 30:41 (count = 0), Skipped +Segment at 31:14 (count = 0), RegionEntry +Segment at 31:52 (count = 0), Skipped +Segment at 33:11 (count = 1), RegionEntry +Segment at 34:35 (count = 0), Skipped +Segment at 34:39 (count = 1), RegionEntry +Segment at 34:41 (count = 0), Skipped +Segment at 35:14 (count = 0), RegionEntry +Segment at 35:52 (count = 0), Skipped +Segment at 37:1 (count = 1), RegionEntry +Segment at 37:2 (count = 0), Skipped diff --git a/src/test/run-make-fulldeps/coverage-reports-deadcode/expected_export_coverage.abort.json b/src/test/run-make-fulldeps/coverage-reports-deadcode/expected_export_coverage.abort.json new file mode 100644 index 000000000000..33cfc9f3ed72 --- /dev/null +++ b/src/test/run-make-fulldeps/coverage-reports-deadcode/expected_export_coverage.abort.json @@ -0,0 +1,59 @@ +{ + "data": [ + { + "files": [ + { + "filename": "../coverage/abort.rs", + "summary": { + "functions": { + "count": 2, + "covered": 2, + "percent": 100 + }, + "instantiations": { + "count": 2, + "covered": 2, + "percent": 100 + }, + "lines": { + "count": 15, + "covered": 13, + "percent": 86.66666666666667 + }, + "regions": { + "count": 10, + "covered": 9, + "notcovered": 1, + "percent": 90 + } + } + } + ], + "totals": { + "functions": { + "count": 2, + "covered": 2, + "percent": 100 + }, + "instantiations": { + "count": 2, + "covered": 2, + "percent": 100 + }, + "lines": { + "count": 15, + "covered": 13, + "percent": 86.66666666666667 + }, + "regions": { + "count": 10, + "covered": 9, + "notcovered": 1, + "percent": 90 + } + } + } + ], + "type": "llvm.coverage.json.export", + "version": "2.0.1" +} diff --git a/src/test/run-make-fulldeps/coverage-reports-deadcode/expected_export_coverage.assert.json b/src/test/run-make-fulldeps/coverage-reports-deadcode/expected_export_coverage.assert.json new file mode 100644 index 000000000000..aa2a0cbebe77 --- /dev/null +++ b/src/test/run-make-fulldeps/coverage-reports-deadcode/expected_export_coverage.assert.json @@ -0,0 +1,59 @@ +{ + "data": [ + { + "files": [ + { + "filename": "../coverage/assert.rs", + "summary": { + "functions": { + "count": 2, + "covered": 2, + "percent": 100 + }, + "instantiations": { + "count": 2, + "covered": 2, + "percent": 100 + }, + "lines": { + "count": 13, + "covered": 10, + "percent": 76.92307692307693 + }, + "regions": { + "count": 14, + "covered": 12, + "notcovered": 2, + "percent": 85.71428571428571 + } + } + } + ], + "totals": { + "functions": { + "count": 2, + "covered": 2, + "percent": 100 + }, + "instantiations": { + "count": 2, + "covered": 2, + "percent": 100 + }, + "lines": { + "count": 13, + "covered": 10, + "percent": 76.92307692307693 + }, + "regions": { + "count": 14, + "covered": 12, + "notcovered": 2, + "percent": 85.71428571428571 + } + } + } + ], + "type": "llvm.coverage.json.export", + "version": "2.0.1" +} diff --git a/src/test/run-make-fulldeps/coverage-reports-deadcode/expected_export_coverage.async.json b/src/test/run-make-fulldeps/coverage-reports-deadcode/expected_export_coverage.async.json new file mode 100644 index 000000000000..004bedeea628 --- /dev/null +++ b/src/test/run-make-fulldeps/coverage-reports-deadcode/expected_export_coverage.async.json @@ -0,0 +1,59 @@ +{ + "data": [ + { + "files": [ + { + "filename": "../coverage/async.rs", + "summary": { + "functions": { + "count": 9, + "covered": 9, + "percent": 100 + }, + "instantiations": { + "count": 9, + "covered": 9, + "percent": 100 + }, + "lines": { + "count": 31, + "covered": 30, + "percent": 96.7741935483871 + }, + "regions": { + "count": 21, + "covered": 18, + "notcovered": 3, + "percent": 85.71428571428571 + } + } + } + ], + "totals": { + "functions": { + "count": 9, + "covered": 9, + "percent": 100 + }, + "instantiations": { + "count": 9, + "covered": 9, + "percent": 100 + }, + "lines": { + "count": 31, + "covered": 30, + "percent": 96.7741935483871 + }, + "regions": { + "count": 21, + "covered": 18, + "notcovered": 3, + "percent": 85.71428571428571 + } + } + } + ], + "type": "llvm.coverage.json.export", + "version": "2.0.1" +} diff --git a/src/test/run-make-fulldeps/coverage-reports-deadcode/expected_export_coverage.conditions.json b/src/test/run-make-fulldeps/coverage-reports-deadcode/expected_export_coverage.conditions.json index ed937a1b13f3..d69ca80839a3 100644 --- a/src/test/run-make-fulldeps/coverage-reports-deadcode/expected_export_coverage.conditions.json +++ b/src/test/run-make-fulldeps/coverage-reports-deadcode/expected_export_coverage.conditions.json @@ -16,15 +16,15 @@ "percent": 100 }, "lines": { - "count": 49, - "covered": 23, - "percent": 46.93877551020408 + "count": 64, + "covered": 33, + "percent": 51.5625 }, "regions": { - "count": 69, - "covered": 18, - "notcovered": 51, - "percent": 26.08695652173913 + "count": 88, + "covered": 25, + "notcovered": 63, + "percent": 28.40909090909091 } } } @@ -41,15 +41,15 @@ "percent": 100 }, "lines": { - "count": 49, - "covered": 23, - "percent": 46.93877551020408 + "count": 64, + "covered": 33, + "percent": 51.5625 }, "regions": { - "count": 69, - "covered": 18, - "notcovered": 51, - "percent": 26.08695652173913 + "count": 88, + "covered": 25, + "notcovered": 63, + "percent": 28.40909090909091 } } } diff --git a/src/test/run-make-fulldeps/coverage-reports-deadcode/expected_export_coverage.inner_items.json b/src/test/run-make-fulldeps/coverage-reports-deadcode/expected_export_coverage.inner_items.json index c178e7f93476..5dc82d2168cc 100644 --- a/src/test/run-make-fulldeps/coverage-reports-deadcode/expected_export_coverage.inner_items.json +++ b/src/test/run-make-fulldeps/coverage-reports-deadcode/expected_export_coverage.inner_items.json @@ -16,15 +16,15 @@ "percent": 100 }, "lines": { - "count": 26, - "covered": 26, + "count": 27, + "covered": 27, "percent": 100 }, "regions": { - "count": 15, - "covered": 13, + "count": 11, + "covered": 9, "notcovered": 2, - "percent": 86.66666666666667 + "percent": 81.81818181818183 } } } @@ -41,15 +41,15 @@ "percent": 100 }, "lines": { - "count": 26, - "covered": 26, + "count": 27, + "covered": 27, "percent": 100 }, "regions": { - "count": 15, - "covered": 13, + "count": 11, + "covered": 9, "notcovered": 2, - "percent": 86.66666666666667 + "percent": 81.81818181818183 } } } diff --git a/src/test/run-make-fulldeps/coverage-reports-deadcode/expected_export_coverage.nested_loops.json b/src/test/run-make-fulldeps/coverage-reports-deadcode/expected_export_coverage.nested_loops.json index 68163eb76361..ce3c957e660c 100644 --- a/src/test/run-make-fulldeps/coverage-reports-deadcode/expected_export_coverage.nested_loops.json +++ b/src/test/run-make-fulldeps/coverage-reports-deadcode/expected_export_coverage.nested_loops.json @@ -16,15 +16,15 @@ "percent": 100 }, "lines": { - "count": 21, + "count": 22, "covered": 16, - "percent": 76.19047619047619 + "percent": 72.72727272727273 }, "regions": { - "count": 18, - "covered": 14, + "count": 17, + "covered": 13, "notcovered": 4, - "percent": 77.77777777777779 + "percent": 76.47058823529412 } } } @@ -41,15 +41,15 @@ "percent": 100 }, "lines": { - "count": 21, + "count": 22, "covered": 16, - "percent": 76.19047619047619 + "percent": 72.72727272727273 }, "regions": { - "count": 18, - "covered": 14, + "count": 17, + "covered": 13, "notcovered": 4, - "percent": 77.77777777777779 + "percent": 76.47058823529412 } } } diff --git a/src/test/run-make-fulldeps/coverage-reports-deadcode/expected_export_coverage.overflow.json b/src/test/run-make-fulldeps/coverage-reports-deadcode/expected_export_coverage.overflow.json new file mode 100644 index 000000000000..176bfd7abeba --- /dev/null +++ b/src/test/run-make-fulldeps/coverage-reports-deadcode/expected_export_coverage.overflow.json @@ -0,0 +1,59 @@ +{ + "data": [ + { + "files": [ + { + "filename": "../coverage/overflow.rs", + "summary": { + "functions": { + "count": 2, + "covered": 2, + "percent": 100 + }, + "instantiations": { + "count": 2, + "covered": 2, + "percent": 100 + }, + "lines": { + "count": 21, + "covered": 17, + "percent": 80.95238095238095 + }, + "regions": { + "count": 14, + "covered": 12, + "notcovered": 2, + "percent": 85.71428571428571 + } + } + } + ], + "totals": { + "functions": { + "count": 2, + "covered": 2, + "percent": 100 + }, + "instantiations": { + "count": 2, + "covered": 2, + "percent": 100 + }, + "lines": { + "count": 21, + "covered": 17, + "percent": 80.95238095238095 + }, + "regions": { + "count": 14, + "covered": 12, + "notcovered": 2, + "percent": 85.71428571428571 + } + } + } + ], + "type": "llvm.coverage.json.export", + "version": "2.0.1" +} diff --git a/src/test/run-make-fulldeps/coverage-reports-deadcode/expected_export_coverage.panic_unwind.json b/src/test/run-make-fulldeps/coverage-reports-deadcode/expected_export_coverage.panic_unwind.json new file mode 100644 index 000000000000..5b13109dbe6b --- /dev/null +++ b/src/test/run-make-fulldeps/coverage-reports-deadcode/expected_export_coverage.panic_unwind.json @@ -0,0 +1,59 @@ +{ + "data": [ + { + "files": [ + { + "filename": "../coverage/panic_unwind.rs", + "summary": { + "functions": { + "count": 2, + "covered": 2, + "percent": 100 + }, + "instantiations": { + "count": 2, + "covered": 2, + "percent": 100 + }, + "lines": { + "count": 17, + "covered": 14, + "percent": 82.35294117647058 + }, + "regions": { + "count": 13, + "covered": 11, + "notcovered": 2, + "percent": 84.61538461538461 + } + } + } + ], + "totals": { + "functions": { + "count": 2, + "covered": 2, + "percent": 100 + }, + "instantiations": { + "count": 2, + "covered": 2, + "percent": 100 + }, + "lines": { + "count": 17, + "covered": 14, + "percent": 82.35294117647058 + }, + "regions": { + "count": 13, + "covered": 11, + "notcovered": 2, + "percent": 84.61538461538461 + } + } + } + ], + "type": "llvm.coverage.json.export", + "version": "2.0.1" +} diff --git a/src/test/run-make-fulldeps/coverage-reports-deadcode/expected_export_coverage.yield.json b/src/test/run-make-fulldeps/coverage-reports-deadcode/expected_export_coverage.yield.json new file mode 100644 index 000000000000..9f25bc971c55 --- /dev/null +++ b/src/test/run-make-fulldeps/coverage-reports-deadcode/expected_export_coverage.yield.json @@ -0,0 +1,59 @@ +{ + "data": [ + { + "files": [ + { + "filename": "../coverage/yield.rs", + "summary": { + "functions": { + "count": 3, + "covered": 3, + "percent": 100 + }, + "instantiations": { + "count": 3, + "covered": 3, + "percent": 100 + }, + "lines": { + "count": 23, + "covered": 16, + "percent": 69.56521739130434 + }, + "regions": { + "count": 22, + "covered": 16, + "notcovered": 6, + "percent": 72.72727272727273 + } + } + } + ], + "totals": { + "functions": { + "count": 3, + "covered": 3, + "percent": 100 + }, + "instantiations": { + "count": 3, + "covered": 3, + "percent": 100 + }, + "lines": { + "count": 23, + "covered": 16, + "percent": 69.56521739130434 + }, + "regions": { + "count": 22, + "covered": 16, + "notcovered": 6, + "percent": 72.72727272727273 + } + } + } + ], + "type": "llvm.coverage.json.export", + "version": "2.0.1" +} diff --git a/src/test/run-make-fulldeps/coverage-reports-deadcode/expected_show_coverage.abort.txt b/src/test/run-make-fulldeps/coverage-reports-deadcode/expected_show_coverage.abort.txt new file mode 100644 index 000000000000..40c9c71a2aad --- /dev/null +++ b/src/test/run-make-fulldeps/coverage-reports-deadcode/expected_show_coverage.abort.txt @@ -0,0 +1,35 @@ + 1| |#![feature(unwind_attributes)] + 2| |#![allow(unused_assignments)] + 3| | + 4| |#[unwind(aborts)] + 5| |fn might_abort(should_abort: bool) { + 6| 4| if should_abort { + 7| 0| println!("aborting..."); + 8| 0| panic!("panics and aborts"); + 9| 4| } else { + 10| 4| println!("Don't Panic"); + 11| 4| } + 12| 4|} + 13| | + 14| |fn main() -> Result<(),u8> { + 15| 1| let mut countdown = 10; + 16| 11| while countdown > 0 { + 17| 10| if countdown < 5 { + 18| 4| might_abort(false); + 19| 6| } + 20| 10| countdown -= 1; + 21| | } + 22| 1| Ok(()) + 23| 1|} + 24| | + 25| |// Notes: + 26| |// 1. Compare this program and its coverage results to those of the similar tests + 27| |// `panic_unwind.rs` and `try_error_result.rs`. + 28| |// 2. This test confirms the coverage generated when a program includes `TerminatorKind::Abort`. + 29| |// 3. The test does not invoke the abort. By executing to a successful completion, the coverage + 30| |// results show where the program did and did not execute. + 31| |// 4. If the program actually aborted, the coverage counters would not be saved (which "works as + 32| |// intended"). Coverage results would show no executed coverage regions. + 33| |// 6. If `should_abort` is `true` and the program aborts, the program exits with a `132` status + 34| |// (on Linux at least). + diff --git a/src/test/run-make-fulldeps/coverage-reports-deadcode/expected_show_coverage.assert.txt b/src/test/run-make-fulldeps/coverage-reports-deadcode/expected_show_coverage.assert.txt new file mode 100644 index 000000000000..a6efcbabd352 --- /dev/null +++ b/src/test/run-make-fulldeps/coverage-reports-deadcode/expected_show_coverage.assert.txt @@ -0,0 +1,34 @@ + 1| |#![allow(unused_assignments)] + 2| |// expect-exit-status-101 + 3| | + 4| |fn might_fail_assert(one_plus_one: u32) { + 5| 4| println!("does 1 + 1 = {}?", one_plus_one); + 6| 4| assert_eq!(1 + 1, one_plus_one, "the argument was wrong"); + ^1 + 7| 3|} + 8| | + 9| |fn main() -> Result<(),u8> { + 10| 1| let mut countdown = 10; + 11| 10| while countdown > 0 { + 12| 10| if countdown == 1 { + 13| 0| might_fail_assert(3); + 14| 10| } else if countdown < 5 { + 15| 3| might_fail_assert(2); + 16| 15| } + 17| 9| countdown -= 1; + 18| | } + 19| 0| Ok(()) + 20| 0|} + 21| | + 22| |// Notes: + 23| |// 1. Compare this program and its coverage results to those of the very similar test + 24| |// `panic_unwind.rs`, and similar tests `abort.rs` and `try_error_result.rs`. + 25| |// 2. This test confirms the coverage generated when a program passes or fails an `assert!()` or + 26| |// related `assert_*!()` macro. + 27| |// 3. Notably, the `assert` macros *do not* generate `TerminatorKind::Assert`. The macros produce + 28| |// conditional expressions, `TerminatorKind::SwitchInt` branches, and a possible call to + 29| |// `begin_panic_fmt()` (that begins a panic unwind, if the assertion test fails). + 30| |// 4. `TerminatoKind::Assert` is, however, also present in the MIR generated for this test + 31| |// (and in many other coverage tests). The `Assert` terminator is typically generated by the + 32| |// Rust compiler to check for runtime failures, such as numeric overflows. + diff --git a/src/test/run-make-fulldeps/coverage-reports-deadcode/expected_show_coverage.async.txt b/src/test/run-make-fulldeps/coverage-reports-deadcode/expected_show_coverage.async.txt new file mode 100644 index 000000000000..b5d99732102d --- /dev/null +++ b/src/test/run-make-fulldeps/coverage-reports-deadcode/expected_show_coverage.async.txt @@ -0,0 +1,66 @@ + 1| |#![allow(unused_assignments)] + 2| | + 3| |// require-rust-edition-2018 + 4| | + 5| 1|async fn f() -> u8 { 1 } + 6| | + 7| |async fn foo() -> [bool; 10] { [false; 10] } + 8| | + 9| |pub async fn g(x: u8) { + 10| | match x { + 11| | y if f().await == y => (), + 12| | _ => (), + 13| | } + 14| 1|} + 15| | + 16| |// #78366: check the reference to the binding is recorded even if the binding is not autorefed + 17| | + 18| |async fn h(x: usize) { + 19| | match x { + 20| | y if foo().await[y] => (), + 21| | _ => (), + 22| | } + 23| 1|} + 24| | + 25| 1|async fn i(x: u8) { + 26| 1| match x { + 27| 1| y if f().await == y + 1 => (), + ^0 ^0 + 28| 1| _ => (), + 29| | } + 30| 2|} + 31| | + 32| 1|fn main() { + 33| 1| let _ = g(10); + 34| 1| let _ = h(9); + 35| 1| let mut future = Box::pin(i(8)); + 36| 1| executor::block_on(future.as_mut()); + 37| 1|} + 38| | + 39| |mod executor { + 40| | use core::{ + 41| | future::Future, + 42| | pin::Pin, + 43| | task::{Context, Poll, RawWaker, RawWakerVTable, Waker}, + 44| | }; + 45| | + 46| | pub fn block_on(mut future: F) -> F::Output { + 47| 1| let mut future = unsafe { Pin::new_unchecked(&mut future) }; + 48| 1| + 49| 1| static VTABLE: RawWakerVTable = RawWakerVTable::new( + 50| 1| |_| unimplemented!("clone"), + 51| 1| |_| unimplemented!("wake"), + 52| 1| |_| unimplemented!("wake_by_ref"), + 53| 1| |_| (), + 54| 1| ); + 55| 1| let waker = unsafe { Waker::from_raw(RawWaker::new(core::ptr::null(), &VTABLE)) }; + 56| 1| let mut context = Context::from_waker(&waker); + 57| | + 58| | loop { + 59| 1| if let Poll::Ready(val) = future.as_mut().poll(&mut context) { + 60| 1| break val; + 61| | } + 62| 0| } + 63| 1| } + 64| |} + diff --git a/src/test/run-make-fulldeps/coverage-reports-deadcode/expected_show_coverage.conditions.txt b/src/test/run-make-fulldeps/coverage-reports-deadcode/expected_show_coverage.conditions.txt index 173ff4aa4c48..e55a574c056b 100644 --- a/src/test/run-make-fulldeps/coverage-reports-deadcode/expected_show_coverage.conditions.txt +++ b/src/test/run-make-fulldeps/coverage-reports-deadcode/expected_show_coverage.conditions.txt @@ -27,7 +27,8 @@ 27| | 28| 1| if countdown > 7 { 29| 1| countdown -= 4; - 30| 0| } else if countdown > 2 { + 30| 1| } else if countdown > 2 { + ^0 31| 0| if countdown < 1 || countdown > 5 || countdown != 9 { 32| 0| countdown = 0; 33| 0| } @@ -36,34 +37,70 @@ 36| 0| return; 37| | } 38| | - 39| 1| let mut countdown = 0; - 40| 1| if true { - 41| 1| countdown = 1; - 42| 1| } - 43| | - 44| 1| let z = if countdown > 7 { - ^0 - 45| 0| countdown -= 4; - 46| 1| } else if countdown > 2 { - 47| 0| if countdown < 1 || countdown > 5 || countdown != 9 { - 48| 0| countdown = 0; - 49| 0| } - 50| 0| countdown -= 5; - 51| | } else { - 52| 1| let should_be_reachable = countdown; - 53| 1| println!("reached"); - 54| 1| return; - 55| | }; + 39| 1| if true { + 40| | // Demonstrate the difference with `TerminatorKind::Assert` as of 2020-11-15. Assert is no + 41| | // longer treated as a `BasicCoverageBlock` terminator, which changed the coverage region, + 42| | // for the executed `then` block above, to include the closing brace on line 30. That + 43| | // changed the line count, but the coverage code region (for the `else if` condition) is + 44| | // still valid. + 45| | // + 46| | // Note that `if` (then) and `else` blocks include the closing brace in their coverage + 47| | // code regions when the last line in the block ends in a semicolon, because the Rust + 48| | // compiler inserts a `StatementKind::Assign` to assign `const ()` to a `Place`, for the + 49| | // empty value for the executed block. When the last line does not end in a semicolon + 50| | // (that is, when the block actually results in a value), the additional `Assign` is not + 51| | // generated, and the brace is not included. + 52| 1| let mut countdown = 0; + 53| 1| if true { + 54| 1| countdown = 10; + 55| 1| } 56| | - 57| 0| let w = if countdown > 7 { - 58| 0| countdown -= 4; - 59| 0| } else if countdown > 2 { - 60| 0| if countdown < 1 || countdown > 5 || countdown != 9 { - 61| 0| countdown = 0; - 62| 0| } - 63| 0| countdown -= 5; - 64| | } else { - 65| 0| return; - 66| | }; - 67| 1|} + 57| 1| if countdown > 7 { + 58| 1| countdown -= 4; + 59| 1| } + 60| | // The closing brace of the `then` branch is now included in the coverage region, and shown + 61| | // as "executed" (giving its line a count of 1 here). Since, in the original version above, + 62| | // the closing brace shares the same line as the `else if` conditional expression (which is + 63| | // not executed if the first `then` condition is true), only the condition's code region is + 64| | // marked with a count of 0 now. + 65| 0| else if countdown > 2 { + 66| 0| if countdown < 1 || countdown > 5 || countdown != 9 { + 67| 0| countdown = 0; + 68| 0| } + 69| 0| countdown -= 5; + 70| | } else { + 71| 0| return; + 72| | } + 73| 1| } + 74| | + 75| 1| let mut countdown = 0; + 76| 1| if true { + 77| 1| countdown = 1; + 78| 1| } + 79| | + 80| 1| let z = if countdown > 7 { + ^0 + 81| 0| countdown -= 4; + 82| 1| } else if countdown > 2 { + 83| 0| if countdown < 1 || countdown > 5 || countdown != 9 { + 84| 0| countdown = 0; + 85| 0| } + 86| 0| countdown -= 5; + 87| | } else { + 88| 1| let should_be_reachable = countdown; + 89| 1| println!("reached"); + 90| 1| return; + 91| | }; + 92| | + 93| 0| let w = if countdown > 7 { + 94| 0| countdown -= 4; + 95| 0| } else if countdown > 2 { + 96| 0| if countdown < 1 || countdown > 5 || countdown != 9 { + 97| 0| countdown = 0; + 98| 0| } + 99| 0| countdown -= 5; + 100| | } else { + 101| 0| return; + 102| | }; + 103| 1|} diff --git a/src/test/run-make-fulldeps/coverage-reports-deadcode/expected_show_coverage.inner_items.txt b/src/test/run-make-fulldeps/coverage-reports-deadcode/expected_show_coverage.inner_items.txt index 4a51f842a4bb..efd9cd4f72d3 100644 --- a/src/test/run-make-fulldeps/coverage-reports-deadcode/expected_show_coverage.inner_items.txt +++ b/src/test/run-make-fulldeps/coverage-reports-deadcode/expected_show_coverage.inner_items.txt @@ -38,7 +38,7 @@ 37| | } 38| | 39| | impl InTrait for InStruct { - 40| | fn trait_func(&mut self, incr: u32) { + 40| 1| fn trait_func(&mut self, incr: u32) { 41| 1| self.in_struct_field += incr; 42| 1| in_func(self.in_struct_field); 43| 1| } diff --git a/src/test/run-make-fulldeps/coverage-reports-deadcode/expected_show_coverage.nested_loops.txt b/src/test/run-make-fulldeps/coverage-reports-deadcode/expected_show_coverage.nested_loops.txt index c9f373bf6a7c..dd86a85815b3 100644 --- a/src/test/run-make-fulldeps/coverage-reports-deadcode/expected_show_coverage.nested_loops.txt +++ b/src/test/run-make-fulldeps/coverage-reports-deadcode/expected_show_coverage.nested_loops.txt @@ -15,7 +15,7 @@ 15| 1| a -= 10; 16| 1| if is_true { 17| 1| break 'outer; - 18| | } else { + 18| 0| } else { 19| 0| a -= 2; 20| 0| } 21| 2| } diff --git a/src/test/run-make-fulldeps/coverage-reports-deadcode/expected_show_coverage.overflow.txt b/src/test/run-make-fulldeps/coverage-reports-deadcode/expected_show_coverage.overflow.txt new file mode 100644 index 000000000000..322de1da25a2 --- /dev/null +++ b/src/test/run-make-fulldeps/coverage-reports-deadcode/expected_show_coverage.overflow.txt @@ -0,0 +1,64 @@ + 1| |#![allow(unused_assignments)] + 2| |// expect-exit-status-101 + 3| | + 4| |fn might_overflow(to_add: u32) -> u32 { + 5| 4| if to_add > 5 { + 6| 1| println!("this will probably overflow"); + 7| 3| } + 8| 4| let add_to = u32::MAX - 5; + 9| 4| println!("does {} + {} overflow?", add_to, to_add); + 10| 4| let result = to_add + add_to; + 11| 4| println!("continuing after overflow check"); + 12| 4| result + 13| 4|} + 14| | + 15| |fn main() -> Result<(),u8> { + 16| 1| let mut countdown = 10; + 17| 10| while countdown > 0 { + 18| 10| if countdown == 1 { + 19| 0| let result = might_overflow(10); + 20| 0| println!("Result: {}", result); + 21| 10| } else if countdown < 5 { + 22| 3| let result = might_overflow(1); + 23| 3| println!("Result: {}", result); + 24| 15| } + 25| 9| countdown -= 1; + 26| | } + 27| 0| Ok(()) + 28| 0|} + 29| | + 30| |// Notes: + 31| |// 1. Compare this program and its coverage results to those of the very similar test `assert.rs`, + 32| |// and similar tests `panic_unwind.rs`, abort.rs` and `try_error_result.rs`. + 33| |// 2. This test confirms the coverage generated when a program passes or fails a + 34| |// compiler-generated `TerminatorKind::Assert` (based on an overflow check, in this case). + 35| |// 3. Similar to how the coverage instrumentation handles `TerminatorKind::Call`, + 36| |// compiler-generated assertion failures are assumed to be a symptom of a program bug, not + 37| |// expected behavior. To simplify the coverage graphs and keep instrumented programs as + 38| |// small and fast as possible, `Assert` terminators are assumed to always succeed, and + 39| |// therefore are considered "non-branching" terminators. So, an `Assert` terminator does not + 40| |// get its own coverage counter. + 41| |// 4. After an unhandled panic or failed Assert, coverage results may not always be intuitive. + 42| |// In this test, the final count for the statements after the `if` block in `might_overflow()` + 43| |// is 4, even though the lines after `to_add + add_to` were executed only 3 times. Depending + 44| |// on the MIR graph and the structure of the code, this count could have been 3 (which might + 45| |// have been valid for the overflowed add `+`, but should have been 4 for the lines before + 46| |// the overflow. The reason for this potential uncertainty is, a `CounterKind` is incremented + 47| |// via StatementKind::Counter at the end of the block, but (as in the case in this test), + 48| |// a CounterKind::Expression is always evaluated. In this case, the expression was based on + 49| |// a `Counter` incremented as part of the evaluation of the `if` expression, which was + 50| |// executed, and counted, 4 times, before reaching the overflow add. + 51| | + 52| |// If the program did not overflow, the coverage for `might_overflow()` would look like this: + 53| |// + 54| |// 4| |fn might_overflow(to_add: u32) -> u32 { + 55| |// 5| 4| if to_add > 5 { + 56| |// 6| 0| println!("this will probably overflow"); + 57| |// 7| 4| } + 58| |// 8| 4| let add_to = u32::MAX - 5; + 59| |// 9| 4| println!("does {} + {} overflow?", add_to, to_add); + 60| |// 10| 4| let result = to_add + add_to; + 61| |// 11| 4| println!("continuing after overflow check"); + 62| |// 12| 4| result + 63| |// 13| 4|} + diff --git a/src/test/run-make-fulldeps/coverage-reports-deadcode/expected_show_coverage.panic_unwind.txt b/src/test/run-make-fulldeps/coverage-reports-deadcode/expected_show_coverage.panic_unwind.txt new file mode 100644 index 000000000000..f5149c11b7be --- /dev/null +++ b/src/test/run-make-fulldeps/coverage-reports-deadcode/expected_show_coverage.panic_unwind.txt @@ -0,0 +1,50 @@ + 1| |#![allow(unused_assignments)] + 2| |// expect-exit-status-101 + 3| | + 4| |fn might_panic(should_panic: bool) { + 5| 4| if should_panic { + 6| 1| println!("panicking..."); + 7| 1| panic!("panics"); + 8| 3| } else { + 9| 3| println!("Don't Panic"); + 10| 3| } + 11| 3|} + 12| | + 13| |fn main() -> Result<(),u8> { + 14| 1| let mut countdown = 10; + 15| 10| while countdown > 0 { + 16| 10| if countdown == 1 { + 17| 0| might_panic(true); + 18| 10| } else if countdown < 5 { + 19| 3| might_panic(false); + 20| 15| } + 21| 9| countdown -= 1; + 22| | } + 23| 0| Ok(()) + 24| 0|} + 25| | + 26| |// Notes: + 27| |// 1. Compare this program and its coverage results to those of the similar tests `abort.rs` and + 28| |// `try_error_result.rs`. + 29| |// 2. Since the `panic_unwind.rs` test is allowed to unwind, it is also allowed to execute the + 30| |// normal program exit cleanup, including writing out the current values of the coverage + 31| |// counters. + 32| |// 3. The coverage results show (interestingly) that the `panic!()` call did execute, but it does + 33| |// not show coverage of the `if countdown == 1` branch in `main()` that calls + 34| |// `might_panic(true)` (causing the call to `panic!()`). + 35| |// 4. The reason `main()`s `if countdown == 1` branch, calling `might_panic(true)`, appears + 36| |// "uncovered" is, InstrumentCoverage (intentionally) treats `TerminatorKind::Call` terminators + 37| |// as non-branching, because when a program executes normally, they always are. Errors handled + 38| |// via the try `?` operator produce error handling branches that *are* treated as branches in + 39| |// coverage results. By treating calls without try `?` operators as non-branching (assumed to + 40| |// return normally and continue) the coverage graph can be simplified, producing smaller, + 41| |// faster binaries, and cleaner coverage results. + 42| |// 5. The reason the coverage results actually show `panic!()` was called is most likely because + 43| |// `panic!()` is a macro, not a simple function call, and there are other `Statement`s and/or + 44| |// `Terminator`s that execute with a coverage counter before the panic and unwind occur. + 45| |// 6. By best practice, programs should not panic. By design, the coverage implementation will not + 46| |// incur additional cost (in program size and execution time) to improve coverage results for + 47| |// an event that is not supposted to happen. + 48| |// 7. FIXME(#78544): This issue describes a feature request for a proposed option to enable + 49| |// more accurate coverage results for tests that intentionally panic. + diff --git a/src/test/run-make-fulldeps/coverage-reports-deadcode/expected_show_coverage.yield.txt b/src/test/run-make-fulldeps/coverage-reports-deadcode/expected_show_coverage.yield.txt new file mode 100644 index 000000000000..28813dd6d0b0 --- /dev/null +++ b/src/test/run-make-fulldeps/coverage-reports-deadcode/expected_show_coverage.yield.txt @@ -0,0 +1,38 @@ + 1| |#![feature(generators, generator_trait)] + 2| |#![allow(unused_assignments)] + 3| | + 4| |use std::ops::{Generator, GeneratorState}; + 5| |use std::pin::Pin; + 6| | + 7| |fn main() { + 8| 1| let mut generator = || { + 9| 1| yield 1; + 10| 1| return "foo" + 11| 1| }; + 12| | + 13| 1| match Pin::new(&mut generator).resume(()) { + 14| 1| GeneratorState::Yielded(1) => {} + 15| 0| _ => panic!("unexpected value from resume"), + 16| | } + 17| 1| match Pin::new(&mut generator).resume(()) { + 18| 1| GeneratorState::Complete("foo") => {} + 19| 0| _ => panic!("unexpected value from resume"), + 20| | } + 21| | + 22| 1| let mut generator = || { + 23| 1| yield 1; + 24| 1| yield 2; + 25| 0| yield 3; + 26| 0| return "foo" + 27| 0| }; + 28| | + 29| 1| match Pin::new(&mut generator).resume(()) { + 30| 1| GeneratorState::Yielded(1) => {} + 31| 0| _ => panic!("unexpected value from resume"), + 32| | } + 33| 1| match Pin::new(&mut generator).resume(()) { + 34| 1| GeneratorState::Yielded(2) => {} + 35| 0| _ => panic!("unexpected value from resume"), + 36| | } + 37| 1|} + diff --git a/src/test/run-make-fulldeps/coverage-reports-deadcode/expected_show_coverage_counters.abort.txt b/src/test/run-make-fulldeps/coverage-reports-deadcode/expected_show_coverage_counters.abort.txt new file mode 100644 index 000000000000..e787e5e152d5 --- /dev/null +++ b/src/test/run-make-fulldeps/coverage-reports-deadcode/expected_show_coverage_counters.abort.txt @@ -0,0 +1,41 @@ +Counter in file 0 15:9 -> 15:27, #1 +Counter in file 0 16:11 -> 16:24, (#1 + (#2 + #3)) +Counter in file 0 17:12 -> 17:25, ((#1 + (#2 + #3)) - #4) +Counter in file 0 17:26 -> 19:10, #2 +Counter in file 0 19:10 -> 19:11, #3 +Counter in file 0 20:9 -> 20:23, (#2 + #3) +Counter in file 0 22:5 -> 23:2, #4 +Counter in file 0 6:8 -> 6:20, #1 +Counter in file 0 7:9 -> 8:37, #2 +Counter in file 0 9:12 -> 12:2, (#1 - #2) +Emitting segments for file: ../coverage/abort.rs +Combined regions: + 6:8 -> 6:20 (count=4) + 7:9 -> 8:37 (count=0) + 9:12 -> 12:2 (count=4) + 15:9 -> 15:27 (count=1) + 16:11 -> 16:24 (count=11) + 17:12 -> 17:25 (count=10) + 17:26 -> 19:10 (count=4) + 19:10 -> 19:11 (count=6) + 20:9 -> 20:23 (count=10) + 22:5 -> 23:2 (count=1) +Segment at 6:8 (count = 4), RegionEntry +Segment at 6:20 (count = 0), Skipped +Segment at 7:9 (count = 0), RegionEntry +Segment at 8:37 (count = 0), Skipped +Segment at 9:12 (count = 4), RegionEntry +Segment at 12:2 (count = 0), Skipped +Segment at 15:9 (count = 1), RegionEntry +Segment at 15:27 (count = 0), Skipped +Segment at 16:11 (count = 11), RegionEntry +Segment at 16:24 (count = 0), Skipped +Segment at 17:12 (count = 10), RegionEntry +Segment at 17:25 (count = 0), Skipped +Segment at 17:26 (count = 4), RegionEntry +Segment at 19:10 (count = 6), RegionEntry +Segment at 19:11 (count = 0), Skipped +Segment at 20:9 (count = 10), RegionEntry +Segment at 20:23 (count = 0), Skipped +Segment at 22:5 (count = 1), RegionEntry +Segment at 23:2 (count = 0), Skipped diff --git a/src/test/run-make-fulldeps/coverage-reports-deadcode/expected_show_coverage_counters.assert.txt b/src/test/run-make-fulldeps/coverage-reports-deadcode/expected_show_coverage_counters.assert.txt new file mode 100644 index 000000000000..81cb6c03da70 --- /dev/null +++ b/src/test/run-make-fulldeps/coverage-reports-deadcode/expected_show_coverage_counters.assert.txt @@ -0,0 +1,54 @@ +Counter in file 0 10:9 -> 10:27, #1 +Counter in file 0 11:11 -> 11:24, (#1 + (#2 + (#3 + #4))) +Counter in file 0 12:12 -> 12:26, ((#1 + (#2 + (#3 + #4))) - #5) +Counter in file 0 12:27 -> 14:10, #2 +Counter in file 0 14:19 -> 14:32, (((#1 + (#2 + (#3 + #4))) - #5) - #2) +Counter in file 0 14:33 -> 16:10, #3 +Counter in file 0 16:10 -> 16:11, #4 +Counter in file 0 16:10 -> 16:11, (#3 + #4) +Counter in file 0 17:9 -> 17:23, (#2 + (#3 + #4)) +Counter in file 0 19:5 -> 20:2, #5 +Counter in file 0 5:5 -> 5:48, #1 +Counter in file 0 6:16 -> 6:21, (#1 + 0) +Counter in file 0 6:37 -> 6:61, #2 +Counter in file 0 7:1 -> 7:2, (#1 - #2) +Emitting segments for file: ../coverage/assert.rs +Combined regions: + 5:5 -> 5:48 (count=4) + 6:16 -> 6:21 (count=4) + 6:37 -> 6:61 (count=1) + 7:1 -> 7:2 (count=3) + 10:9 -> 10:27 (count=1) + 11:11 -> 11:24 (count=10) + 12:12 -> 12:26 (count=10) + 12:27 -> 14:10 (count=0) + 14:19 -> 14:32 (count=10) + 14:33 -> 16:10 (count=3) + 16:10 -> 16:11 (count=15) + 17:9 -> 17:23 (count=9) + 19:5 -> 20:2 (count=0) +Segment at 5:5 (count = 4), RegionEntry +Segment at 5:48 (count = 0), Skipped +Segment at 6:16 (count = 4), RegionEntry +Segment at 6:21 (count = 0), Skipped +Segment at 6:37 (count = 1), RegionEntry +Segment at 6:61 (count = 0), Skipped +Segment at 7:1 (count = 3), RegionEntry +Segment at 7:2 (count = 0), Skipped +Segment at 10:9 (count = 1), RegionEntry +Segment at 10:27 (count = 0), Skipped +Segment at 11:11 (count = 10), RegionEntry +Segment at 11:24 (count = 0), Skipped +Segment at 12:12 (count = 10), RegionEntry +Segment at 12:26 (count = 0), Skipped +Segment at 12:27 (count = 0), RegionEntry +Segment at 14:10 (count = 0), Skipped +Segment at 14:19 (count = 10), RegionEntry +Segment at 14:32 (count = 0), Skipped +Segment at 14:33 (count = 3), RegionEntry +Segment at 16:10 (count = 15), RegionEntry +Segment at 16:11 (count = 0), Skipped +Segment at 17:9 (count = 9), RegionEntry +Segment at 17:23 (count = 0), Skipped +Segment at 19:5 (count = 0), RegionEntry +Segment at 20:2 (count = 0), Skipped diff --git a/src/test/run-make-fulldeps/coverage-reports-deadcode/expected_show_coverage_counters.async.txt b/src/test/run-make-fulldeps/coverage-reports-deadcode/expected_show_coverage_counters.async.txt new file mode 100644 index 000000000000..f1f02faba536 --- /dev/null +++ b/src/test/run-make-fulldeps/coverage-reports-deadcode/expected_show_coverage_counters.async.txt @@ -0,0 +1,85 @@ +Counter in file 0 15:9 -> 15:75, #1 +Counter in file 0 15:9 -> 15:75, #1 +Counter in file 0 15:9 -> 15:75, #1 +Counter in file 0 47:13 -> 56:54, #1 +Counter in file 0 59:32 -> 59:35, ((#1 + #2) - #2) +Counter in file 0 59:39 -> 59:73, (#1 + #2) +Counter in file 0 60:23 -> 60:26, (((#1 + #2) - #2) + 0) +Counter in file 0 62:10 -> 62:11, #2 +Counter in file 0 63:5 -> 63:6, (((#1 + #2) - #2) + 0) +Counter in file 0 53:17 -> 53:19, #1 +Counter in file 0 7:44 -> 7:45, #1 +Counter in file 0 5:24 -> 5:25, #1 +Counter in file 0 5:22 -> 5:25, #1 +Counter in file 0 25:19 -> 26:12, #1 +Counter in file 0 27:9 -> 27:10, #3 +Counter in file 0 27:14 -> 27:17, (#1 + 0) +Counter in file 0 27:27 -> 27:32, #2 +Counter in file 0 27:32 -> 27:33, (#2 - #3) +Counter in file 0 27:36 -> 27:38, (#3 + 0) +Counter in file 0 28:14 -> 28:16, #4 +Counter in file 0 30:1 -> 30:2, (#3 + #4) +Counter in file 0 32:11 -> 37:2, #1 +Counter in file 0 30:1 -> 30:2, #1 +Counter in file 0 14:1 -> 14:2, #1 +Counter in file 0 23:1 -> 23:2, #1 +Emitting segments for file: ../coverage/async.rs +Combined regions: + 5:22 -> 5:25 (count=1) + 5:24 -> 5:25 (count=1) + 14:1 -> 14:2 (count=1) + 23:1 -> 23:2 (count=1) + 25:19 -> 26:12 (count=1) + 27:9 -> 27:10 (count=0) + 27:14 -> 27:17 (count=1) + 27:27 -> 27:32 (count=1) + 27:32 -> 27:33 (count=1) + 27:36 -> 27:38 (count=0) + 28:14 -> 28:16 (count=1) + 30:1 -> 30:2 (count=2) + 32:11 -> 37:2 (count=1) + 47:13 -> 56:54 (count=1) + 53:17 -> 53:19 (count=1) + 59:32 -> 59:35 (count=1) + 59:39 -> 59:73 (count=1) + 60:23 -> 60:26 (count=1) + 62:10 -> 62:11 (count=0) + 63:5 -> 63:6 (count=1) +Segment at 5:22 (count = 1), RegionEntry +Segment at 5:24 (count = 1), RegionEntry +Segment at 5:25 (count = 0), Skipped +Segment at 14:1 (count = 1), RegionEntry +Segment at 14:2 (count = 0), Skipped +Segment at 23:1 (count = 1), RegionEntry +Segment at 23:2 (count = 0), Skipped +Segment at 25:19 (count = 1), RegionEntry +Segment at 26:12 (count = 0), Skipped +Segment at 27:9 (count = 0), RegionEntry +Segment at 27:10 (count = 0), Skipped +Segment at 27:14 (count = 1), RegionEntry +Segment at 27:17 (count = 0), Skipped +Segment at 27:27 (count = 1), RegionEntry +Segment at 27:32 (count = 1), RegionEntry +Segment at 27:33 (count = 0), Skipped +Segment at 27:36 (count = 0), RegionEntry +Segment at 27:38 (count = 0), Skipped +Segment at 28:14 (count = 1), RegionEntry +Segment at 28:16 (count = 0), Skipped +Segment at 30:1 (count = 2), RegionEntry +Segment at 30:2 (count = 0), Skipped +Segment at 32:11 (count = 1), RegionEntry +Segment at 37:2 (count = 0), Skipped +Segment at 47:13 (count = 1), RegionEntry +Segment at 53:17 (count = 1), RegionEntry +Segment at 53:19 (count = 1) +Segment at 56:54 (count = 0), Skipped +Segment at 59:32 (count = 1), RegionEntry +Segment at 59:35 (count = 0), Skipped +Segment at 59:39 (count = 1), RegionEntry +Segment at 59:73 (count = 0), Skipped +Segment at 60:23 (count = 1), RegionEntry +Segment at 60:26 (count = 0), Skipped +Segment at 62:10 (count = 0), RegionEntry +Segment at 62:11 (count = 0), Skipped +Segment at 63:5 (count = 1), RegionEntry +Segment at 63:6 (count = 0), Skipped diff --git a/src/test/run-make-fulldeps/coverage-reports-deadcode/expected_show_coverage_counters.conditions.txt b/src/test/run-make-fulldeps/coverage-reports-deadcode/expected_show_coverage_counters.conditions.txt index d48cd8074beb..a4c1a9c0f121 100644 --- a/src/test/run-make-fulldeps/coverage-reports-deadcode/expected_show_coverage_counters.conditions.txt +++ b/src/test/run-make-fulldeps/coverage-reports-deadcode/expected_show_coverage_counters.conditions.txt @@ -1,72 +1,91 @@ Counter in file 0 4:9 -> 4:26, #1 Counter in file 0 5:8 -> 5:12, (#1 + 0) Counter in file 0 5:13 -> 7:6, #2 -Counter in file 0 10:9 -> 10:10, (#4 + #11) +Counter in file 0 10:9 -> 10:10, (#3 + (#12 + #13)) Counter in file 0 10:16 -> 10:29, (#2 + 0) -Counter in file 0 11:9 -> 12:10, #4 +Counter in file 0 11:9 -> 12:10, #3 Counter in file 0 13:15 -> 13:28, ((#2 + 0) - #3) -Counter in file 0 14:12 -> 14:25, #5 -Counter in file 0 14:29 -> 14:42, (#5 - #13) -Counter in file 0 14:42 -> 14:43, (#13 + #14) -Counter in file 0 14:42 -> 14:43, ((#5 - #13) - #14) -Counter in file 0 14:46 -> 14:60, #21 -Counter in file 0 14:60 -> 14:61, (#17 + #18) -Counter in file 0 14:60 -> 14:61, (#21 - #18) -Counter in file 0 14:61 -> 16:10, #22 -Counter in file 0 16:10 -> 16:11, #23 -Counter in file 0 17:9 -> 18:18, #11 -Counter in file 0 20:9 -> 20:15, (((#2 + 0) - #3) - #5) -Counter in file 0 23:9 -> 23:26, ((#4 + #11) + 0) -Counter in file 0 24:8 -> 24:12, ((#4 + #11) + 0) -Counter in file 0 24:13 -> 26:6, #12 -Counter in file 0 28:8 -> 28:21, (#12 + 0) -Counter in file 0 29:9 -> 29:23, #16 -Counter in file 0 30:15 -> 30:28, ((#12 + 0) - #15) -Counter in file 0 31:12 -> 31:25, (((#12 + 0) - #15) - #8) -Counter in file 0 31:29 -> 31:42, ((((#12 + 0) - #15) - #8) - #24) -Counter in file 0 31:42 -> 31:43, (((((#12 + 0) - #15) - #8) - #24) - #25) +Counter in file 0 14:12 -> 14:25, #4 +Counter in file 0 14:29 -> 14:42, (#4 - #15) +Counter in file 0 14:42 -> 14:43, ((#4 - #15) - #16) +Counter in file 0 14:42 -> 14:43, (#15 + #16) +Counter in file 0 14:46 -> 14:60, #23 +Counter in file 0 14:60 -> 14:61, (#18 + #19) +Counter in file 0 14:60 -> 14:61, (#23 - #19) +Counter in file 0 14:61 -> 16:10, #12 +Counter in file 0 16:10 -> 16:11, #13 +Counter in file 0 17:9 -> 18:18, (#12 + #13) +Counter in file 0 20:9 -> 20:15, (((#2 + 0) - #3) - #4) +Counter in file 0 23:9 -> 23:26, ((#3 + (#12 + #13)) + 0) +Counter in file 0 24:8 -> 24:12, ((#3 + (#12 + #13)) + 0) +Counter in file 0 24:13 -> 26:6, #14 +Counter in file 0 28:8 -> 28:21, (#14 + 0) +Counter in file 0 28:22 -> 30:6, #17 +Counter in file 0 30:15 -> 30:28, ((#14 + 0) - #17) +Counter in file 0 31:12 -> 31:25, (((#14 + 0) - #17) - #8) +Counter in file 0 31:29 -> 31:42, ((((#14 + 0) - #17) - #8) - #24) +Counter in file 0 31:42 -> 31:43, (((((#14 + 0) - #17) - #8) - #24) - #25) Counter in file 0 31:42 -> 31:43, (#24 + #25) -Counter in file 0 31:46 -> 31:60, #32 -Counter in file 0 31:60 -> 31:61, (#28 + #29) -Counter in file 0 31:60 -> 31:61, (#32 - #29) -Counter in file 0 31:61 -> 33:10, #33 -Counter in file 0 33:10 -> 33:11, #34 -Counter in file 0 34:9 -> 34:23, #19 +Counter in file 0 31:46 -> 31:60, #34 +Counter in file 0 31:60 -> 31:61, (#34 - #32) +Counter in file 0 31:60 -> 31:61, (#31 + #32) +Counter in file 0 31:61 -> 33:10, #20 +Counter in file 0 33:10 -> 33:11, #21 +Counter in file 0 34:9 -> 34:23, (#20 + #21) Counter in file 0 36:9 -> 36:15, #8 -Counter in file 0 39:9 -> 39:26, (#16 + #19) -Counter in file 0 40:8 -> 40:12, ((#16 + #19) + 0) -Counter in file 0 40:13 -> 42:6, #20 -Counter in file 0 44:9 -> 44:10, (#27 + #30) -Counter in file 0 44:16 -> 44:29, (#20 + 0) -Counter in file 0 45:9 -> 45:23, #27 -Counter in file 0 46:15 -> 46:28, ((#20 + 0) - #26) -Counter in file 0 47:12 -> 47:25, (((#20 + 0) - #26) - #7) -Counter in file 0 47:29 -> 47:42, ((((#20 + 0) - #26) - #7) - #35) -Counter in file 0 47:42 -> 47:43, (#35 + #36) -Counter in file 0 47:42 -> 47:43, (((((#20 + 0) - #26) - #7) - #35) - #36) -Counter in file 0 47:46 -> 47:60, #41 -Counter in file 0 47:60 -> 47:61, (#37 + #38) -Counter in file 0 47:60 -> 47:61, (#41 - #38) -Counter in file 0 47:61 -> 49:10, #42 -Counter in file 0 49:10 -> 49:11, #43 -Counter in file 0 50:9 -> 50:23, #30 -Counter in file 0 52:13 -> 54:15, #7 -Counter in file 0 57:9 -> 57:10, (#9 + #10) -Counter in file 0 57:16 -> 57:29, ((#27 + #30) + 0) -Counter in file 0 58:9 -> 58:23, #9 -Counter in file 0 59:15 -> 59:28, ((#27 + #30) - #31) -Counter in file 0 60:12 -> 60:25, (((#27 + #30) - #31) - #6) -Counter in file 0 60:29 -> 60:42, ((((#27 + #30) - #31) - #6) - #39) -Counter in file 0 60:42 -> 60:43, (#39 + #40) -Counter in file 0 60:42 -> 60:43, (((((#27 + #30) - #31) - #6) - #39) - #40) -Counter in file 0 60:46 -> 60:60, #46 -Counter in file 0 60:60 -> 60:61, (#46 - #45) -Counter in file 0 60:60 -> 60:61, (#44 + #45) -Counter in file 0 60:61 -> 62:10, #47 -Counter in file 0 62:10 -> 62:11, #48 -Counter in file 0 63:9 -> 63:23, #10 -Counter in file 0 65:9 -> 65:15, #6 -Counter in file 0 67:1 -> 67:2, ((#9 + #10) + (((#6 + #7) + #8) + (((#2 + 0) - #3) - #5))) +Counter in file 0 39:8 -> 39:12, (#17 + (#20 + #21)) +Counter in file 0 52:13 -> 52:30, #22 +Counter in file 0 53:12 -> 53:16, (#22 + 0) +Counter in file 0 53:17 -> 55:10, #26 +Counter in file 0 57:12 -> 57:25, (#26 + 0) +Counter in file 0 57:26 -> 59:10, #27 +Counter in file 0 65:17 -> 65:30, ((#26 + 0) - #27) +Counter in file 0 66:16 -> 66:29, (((#26 + 0) - #27) - #7) +Counter in file 0 66:33 -> 66:46, ((((#26 + 0) - #27) - #7) - #37) +Counter in file 0 66:46 -> 66:47, (#37 + #38) +Counter in file 0 66:46 -> 66:47, (((((#26 + 0) - #27) - #7) - #37) - #38) +Counter in file 0 66:50 -> 66:64, #47 +Counter in file 0 66:64 -> 66:65, (#47 - #42) +Counter in file 0 66:64 -> 66:65, (#41 + #42) +Counter in file 0 66:65 -> 68:14, #28 +Counter in file 0 68:14 -> 68:15, #29 +Counter in file 0 69:13 -> 69:27, (#28 + #29) +Counter in file 0 71:13 -> 71:19, #7 +Counter in file 0 73:6 -> 73:7, (#27 + (#28 + #29)) +Counter in file 0 75:9 -> 75:26, ((#27 + (#28 + #29)) + 0) +Counter in file 0 76:8 -> 76:12, (((#27 + (#28 + #29)) + 0) + 0) +Counter in file 0 76:13 -> 78:6, #30 +Counter in file 0 80:9 -> 80:10, (#33 + (#35 + #36)) +Counter in file 0 80:16 -> 80:29, (#30 + 0) +Counter in file 0 80:30 -> 82:6, #33 +Counter in file 0 82:15 -> 82:28, ((#30 + 0) - #33) +Counter in file 0 83:12 -> 83:25, (((#30 + 0) - #33) - #6) +Counter in file 0 83:29 -> 83:42, ((((#30 + 0) - #33) - #6) - #39) +Counter in file 0 83:42 -> 83:43, (#39 + #40) +Counter in file 0 83:42 -> 83:43, (((((#30 + 0) - #33) - #6) - #39) - #40) +Counter in file 0 83:46 -> 83:60, #48 +Counter in file 0 83:60 -> 83:61, (#43 + #44) +Counter in file 0 83:60 -> 83:61, (#48 - #44) +Counter in file 0 83:61 -> 85:10, #35 +Counter in file 0 85:10 -> 85:11, #36 +Counter in file 0 86:9 -> 86:23, (#35 + #36) +Counter in file 0 88:13 -> 90:15, #6 +Counter in file 0 93:9 -> 93:10, (#9 + (#10 + #11)) +Counter in file 0 93:16 -> 93:29, ((#33 + (#35 + #36)) + 0) +Counter in file 0 93:30 -> 95:6, #9 +Counter in file 0 95:15 -> 95:28, ((#33 + (#35 + #36)) - #9) +Counter in file 0 96:12 -> 96:25, (((#33 + (#35 + #36)) - #9) - #5) +Counter in file 0 96:29 -> 96:42, ((((#33 + (#35 + #36)) - #9) - #5) - #45) +Counter in file 0 96:42 -> 96:43, (#45 + #46) +Counter in file 0 96:42 -> 96:43, (((((#33 + (#35 + #36)) - #9) - #5) - #45) - #46) +Counter in file 0 96:46 -> 96:60, #51 +Counter in file 0 96:60 -> 96:61, (#49 + #50) +Counter in file 0 96:60 -> 96:61, (#51 - #50) +Counter in file 0 96:61 -> 98:10, #10 +Counter in file 0 98:10 -> 98:11, #11 +Counter in file 0 99:9 -> 99:23, (#10 + #11) +Counter in file 0 101:9 -> 101:15, #5 +Counter in file 0 103:1 -> 103:2, ((#9 + (#10 + #11)) + (((#5 + #6) + (#7 + #8)) + (((#2 + 0) - #3) - #4))) Emitting segments for file: ../coverage/conditions.rs Combined regions: 4:9 -> 4:26 (count=1) @@ -89,7 +108,7 @@ Combined regions: 24:8 -> 24:12 (count=1) 24:13 -> 26:6 (count=1) 28:8 -> 28:21 (count=1) - 29:9 -> 29:23 (count=1) + 28:22 -> 30:6 (count=1) 30:15 -> 30:28 (count=0) 31:12 -> 31:25 (count=0) 31:29 -> 31:42 (count=0) @@ -100,36 +119,53 @@ Combined regions: 33:10 -> 33:11 (count=0) 34:9 -> 34:23 (count=0) 36:9 -> 36:15 (count=0) - 39:9 -> 39:26 (count=1) - 40:8 -> 40:12 (count=1) - 40:13 -> 42:6 (count=1) - 44:9 -> 44:10 (count=0) - 44:16 -> 44:29 (count=1) - 45:9 -> 45:23 (count=0) - 46:15 -> 46:28 (count=1) - 47:12 -> 47:25 (count=0) - 47:29 -> 47:42 (count=0) - 47:42 -> 47:43 (count=0) - 47:46 -> 47:60 (count=0) - 47:60 -> 47:61 (count=0) - 47:61 -> 49:10 (count=0) - 49:10 -> 49:11 (count=0) - 50:9 -> 50:23 (count=0) - 52:13 -> 54:15 (count=1) - 57:9 -> 57:10 (count=0) - 57:16 -> 57:29 (count=0) - 58:9 -> 58:23 (count=0) - 59:15 -> 59:28 (count=0) - 60:12 -> 60:25 (count=0) - 60:29 -> 60:42 (count=0) - 60:42 -> 60:43 (count=0) - 60:46 -> 60:60 (count=0) - 60:60 -> 60:61 (count=0) - 60:61 -> 62:10 (count=0) - 62:10 -> 62:11 (count=0) - 63:9 -> 63:23 (count=0) - 65:9 -> 65:15 (count=0) - 67:1 -> 67:2 (count=1) + 39:8 -> 39:12 (count=1) + 52:13 -> 52:30 (count=1) + 53:12 -> 53:16 (count=1) + 53:17 -> 55:10 (count=1) + 57:12 -> 57:25 (count=1) + 57:26 -> 59:10 (count=1) + 65:17 -> 65:30 (count=0) + 66:16 -> 66:29 (count=0) + 66:33 -> 66:46 (count=0) + 66:46 -> 66:47 (count=0) + 66:50 -> 66:64 (count=0) + 66:64 -> 66:65 (count=0) + 66:65 -> 68:14 (count=0) + 68:14 -> 68:15 (count=0) + 69:13 -> 69:27 (count=0) + 71:13 -> 71:19 (count=0) + 73:6 -> 73:7 (count=1) + 75:9 -> 75:26 (count=1) + 76:8 -> 76:12 (count=1) + 76:13 -> 78:6 (count=1) + 80:9 -> 80:10 (count=0) + 80:16 -> 80:29 (count=1) + 80:30 -> 82:6 (count=0) + 82:15 -> 82:28 (count=1) + 83:12 -> 83:25 (count=0) + 83:29 -> 83:42 (count=0) + 83:42 -> 83:43 (count=0) + 83:46 -> 83:60 (count=0) + 83:60 -> 83:61 (count=0) + 83:61 -> 85:10 (count=0) + 85:10 -> 85:11 (count=0) + 86:9 -> 86:23 (count=0) + 88:13 -> 90:15 (count=1) + 93:9 -> 93:10 (count=0) + 93:16 -> 93:29 (count=0) + 93:30 -> 95:6 (count=0) + 95:15 -> 95:28 (count=0) + 96:12 -> 96:25 (count=0) + 96:29 -> 96:42 (count=0) + 96:42 -> 96:43 (count=0) + 96:46 -> 96:60 (count=0) + 96:60 -> 96:61 (count=0) + 96:61 -> 98:10 (count=0) + 98:10 -> 98:11 (count=0) + 99:9 -> 99:23 (count=0) + 101:9 -> 101:15 (count=0) + 103:1 -> 103:2 (count=1) Segment at 4:9 (count = 1), RegionEntry Segment at 4:26 (count = 0), Skipped Segment at 5:8 (count = 1), RegionEntry @@ -166,8 +202,8 @@ Segment at 24:13 (count = 1), RegionEntry Segment at 26:6 (count = 0), Skipped Segment at 28:8 (count = 1), RegionEntry Segment at 28:21 (count = 0), Skipped -Segment at 29:9 (count = 1), RegionEntry -Segment at 29:23 (count = 0), Skipped +Segment at 28:22 (count = 1), RegionEntry +Segment at 30:6 (count = 0), Skipped Segment at 30:15 (count = 0), RegionEntry Segment at 30:28 (count = 0), Skipped Segment at 31:12 (count = 0), RegionEntry @@ -184,55 +220,85 @@ Segment at 34:9 (count = 0), RegionEntry Segment at 34:23 (count = 0), Skipped Segment at 36:9 (count = 0), RegionEntry Segment at 36:15 (count = 0), Skipped -Segment at 39:9 (count = 1), RegionEntry -Segment at 39:26 (count = 0), Skipped -Segment at 40:8 (count = 1), RegionEntry -Segment at 40:12 (count = 0), Skipped -Segment at 40:13 (count = 1), RegionEntry -Segment at 42:6 (count = 0), Skipped -Segment at 44:9 (count = 0), RegionEntry -Segment at 44:10 (count = 0), Skipped -Segment at 44:16 (count = 1), RegionEntry -Segment at 44:29 (count = 0), Skipped -Segment at 45:9 (count = 0), RegionEntry -Segment at 45:23 (count = 0), Skipped -Segment at 46:15 (count = 1), RegionEntry -Segment at 46:28 (count = 0), Skipped -Segment at 47:12 (count = 0), RegionEntry -Segment at 47:25 (count = 0), Skipped -Segment at 47:29 (count = 0), RegionEntry -Segment at 47:42 (count = 0), RegionEntry -Segment at 47:43 (count = 0), Skipped -Segment at 47:46 (count = 0), RegionEntry -Segment at 47:60 (count = 0), RegionEntry -Segment at 47:61 (count = 0), RegionEntry -Segment at 49:10 (count = 0), RegionEntry -Segment at 49:11 (count = 0), Skipped -Segment at 50:9 (count = 0), RegionEntry -Segment at 50:23 (count = 0), Skipped +Segment at 39:8 (count = 1), RegionEntry +Segment at 39:12 (count = 0), Skipped Segment at 52:13 (count = 1), RegionEntry -Segment at 54:15 (count = 0), Skipped -Segment at 57:9 (count = 0), RegionEntry -Segment at 57:10 (count = 0), Skipped -Segment at 57:16 (count = 0), RegionEntry -Segment at 57:29 (count = 0), Skipped -Segment at 58:9 (count = 0), RegionEntry -Segment at 58:23 (count = 0), Skipped -Segment at 59:15 (count = 0), RegionEntry -Segment at 59:28 (count = 0), Skipped -Segment at 60:12 (count = 0), RegionEntry -Segment at 60:25 (count = 0), Skipped -Segment at 60:29 (count = 0), RegionEntry -Segment at 60:42 (count = 0), RegionEntry -Segment at 60:43 (count = 0), Skipped -Segment at 60:46 (count = 0), RegionEntry -Segment at 60:60 (count = 0), RegionEntry -Segment at 60:61 (count = 0), RegionEntry -Segment at 62:10 (count = 0), RegionEntry -Segment at 62:11 (count = 0), Skipped -Segment at 63:9 (count = 0), RegionEntry -Segment at 63:23 (count = 0), Skipped -Segment at 65:9 (count = 0), RegionEntry -Segment at 65:15 (count = 0), Skipped -Segment at 67:1 (count = 1), RegionEntry -Segment at 67:2 (count = 0), Skipped +Segment at 52:30 (count = 0), Skipped +Segment at 53:12 (count = 1), RegionEntry +Segment at 53:16 (count = 0), Skipped +Segment at 53:17 (count = 1), RegionEntry +Segment at 55:10 (count = 0), Skipped +Segment at 57:12 (count = 1), RegionEntry +Segment at 57:25 (count = 0), Skipped +Segment at 57:26 (count = 1), RegionEntry +Segment at 59:10 (count = 0), Skipped +Segment at 65:17 (count = 0), RegionEntry +Segment at 65:30 (count = 0), Skipped +Segment at 66:16 (count = 0), RegionEntry +Segment at 66:29 (count = 0), Skipped +Segment at 66:33 (count = 0), RegionEntry +Segment at 66:46 (count = 0), RegionEntry +Segment at 66:47 (count = 0), Skipped +Segment at 66:50 (count = 0), RegionEntry +Segment at 66:64 (count = 0), RegionEntry +Segment at 66:65 (count = 0), RegionEntry +Segment at 68:14 (count = 0), RegionEntry +Segment at 68:15 (count = 0), Skipped +Segment at 69:13 (count = 0), RegionEntry +Segment at 69:27 (count = 0), Skipped +Segment at 71:13 (count = 0), RegionEntry +Segment at 71:19 (count = 0), Skipped +Segment at 73:6 (count = 1), RegionEntry +Segment at 73:7 (count = 0), Skipped +Segment at 75:9 (count = 1), RegionEntry +Segment at 75:26 (count = 0), Skipped +Segment at 76:8 (count = 1), RegionEntry +Segment at 76:12 (count = 0), Skipped +Segment at 76:13 (count = 1), RegionEntry +Segment at 78:6 (count = 0), Skipped +Segment at 80:9 (count = 0), RegionEntry +Segment at 80:10 (count = 0), Skipped +Segment at 80:16 (count = 1), RegionEntry +Segment at 80:29 (count = 0), Skipped +Segment at 80:30 (count = 0), RegionEntry +Segment at 82:6 (count = 0), Skipped +Segment at 82:15 (count = 1), RegionEntry +Segment at 82:28 (count = 0), Skipped +Segment at 83:12 (count = 0), RegionEntry +Segment at 83:25 (count = 0), Skipped +Segment at 83:29 (count = 0), RegionEntry +Segment at 83:42 (count = 0), RegionEntry +Segment at 83:43 (count = 0), Skipped +Segment at 83:46 (count = 0), RegionEntry +Segment at 83:60 (count = 0), RegionEntry +Segment at 83:61 (count = 0), RegionEntry +Segment at 85:10 (count = 0), RegionEntry +Segment at 85:11 (count = 0), Skipped +Segment at 86:9 (count = 0), RegionEntry +Segment at 86:23 (count = 0), Skipped +Segment at 88:13 (count = 1), RegionEntry +Segment at 90:15 (count = 0), Skipped +Segment at 93:9 (count = 0), RegionEntry +Segment at 93:10 (count = 0), Skipped +Segment at 93:16 (count = 0), RegionEntry +Segment at 93:29 (count = 0), Skipped +Segment at 93:30 (count = 0), RegionEntry +Segment at 95:6 (count = 0), Skipped +Segment at 95:15 (count = 0), RegionEntry +Segment at 95:28 (count = 0), Skipped +Segment at 96:12 (count = 0), RegionEntry +Segment at 96:25 (count = 0), Skipped +Segment at 96:29 (count = 0), RegionEntry +Segment at 96:42 (count = 0), RegionEntry +Segment at 96:43 (count = 0), Skipped +Segment at 96:46 (count = 0), RegionEntry +Segment at 96:60 (count = 0), RegionEntry +Segment at 96:61 (count = 0), RegionEntry +Segment at 98:10 (count = 0), RegionEntry +Segment at 98:11 (count = 0), Skipped +Segment at 99:9 (count = 0), RegionEntry +Segment at 99:23 (count = 0), Skipped +Segment at 101:9 (count = 0), RegionEntry +Segment at 101:15 (count = 0), Skipped +Segment at 103:1 (count = 1), RegionEntry +Segment at 103:2 (count = 0), Skipped diff --git a/src/test/run-make-fulldeps/coverage-reports-deadcode/expected_show_coverage_counters.inner_items.txt b/src/test/run-make-fulldeps/coverage-reports-deadcode/expected_show_coverage_counters.inner_items.txt index 65cd6481af4c..e4dfae768178 100644 --- a/src/test/run-make-fulldeps/coverage-reports-deadcode/expected_show_coverage_counters.inner_items.txt +++ b/src/test/run-make-fulldeps/coverage-reports-deadcode/expected_show_coverage_counters.inner_items.txt @@ -1,7 +1,4 @@ -Counter in file 0 19:13 -> 19:18, #1 -Counter in file 0 20:13 -> 20:14, #2 -Counter in file 0 20:17 -> 20:22, (#1 + 0) -Counter in file 0 21:9 -> 22:6, (#2 + 0) +Counter in file 0 19:13 -> 22:6, #1 Counter in file 0 7:9 -> 9:26, #1 Counter in file 0 10:8 -> 10:15, (#1 + 0) Counter in file 0 10:16 -> 12:6, #2 @@ -11,21 +8,16 @@ Counter in file 0 48:16 -> 50:6, #3 Counter in file 0 50:6 -> 50:7, ((#2 + (#1 - #2)) - #3) Counter in file 0 52:9 -> 57:2, (#3 + ((#2 + (#1 - #2)) - #3)) Counter in file 0 33:42 -> 36:10, #1 -Counter in file 0 41:37 -> 41:41, #1 -Counter in file 0 42:13 -> 43:10, #2 +Counter in file 0 40:45 -> 43:10, #1 Emitting segments for file: ../coverage/inner_items.rs Combined regions: 7:9 -> 9:26 (count=1) 10:8 -> 10:15 (count=1) 10:16 -> 12:6 (count=1) 12:6 -> 12:7 (count=0) - 19:13 -> 19:18 (count=3) - 20:13 -> 20:14 (count=3) - 20:17 -> 20:22 (count=3) - 21:9 -> 22:6 (count=3) + 19:13 -> 22:6 (count=3) 33:42 -> 36:10 (count=1) - 41:37 -> 41:41 (count=1) - 42:13 -> 43:10 (count=1) + 40:45 -> 43:10 (count=1) 48:8 -> 48:15 (count=1) 48:16 -> 50:6 (count=1) 50:6 -> 50:7 (count=0) @@ -38,18 +30,10 @@ Segment at 10:16 (count = 1), RegionEntry Segment at 12:6 (count = 0), RegionEntry Segment at 12:7 (count = 0), Skipped Segment at 19:13 (count = 3), RegionEntry -Segment at 19:18 (count = 0), Skipped -Segment at 20:13 (count = 3), RegionEntry -Segment at 20:14 (count = 0), Skipped -Segment at 20:17 (count = 3), RegionEntry -Segment at 20:22 (count = 0), Skipped -Segment at 21:9 (count = 3), RegionEntry Segment at 22:6 (count = 0), Skipped Segment at 33:42 (count = 1), RegionEntry Segment at 36:10 (count = 0), Skipped -Segment at 41:37 (count = 1), RegionEntry -Segment at 41:41 (count = 0), Skipped -Segment at 42:13 (count = 1), RegionEntry +Segment at 40:45 (count = 1), RegionEntry Segment at 43:10 (count = 0), Skipped Segment at 48:8 (count = 1), RegionEntry Segment at 48:15 (count = 0), Skipped diff --git a/src/test/run-make-fulldeps/coverage-reports-deadcode/expected_show_coverage_counters.nested_loops.txt b/src/test/run-make-fulldeps/coverage-reports-deadcode/expected_show_coverage_counters.nested_loops.txt index f50300735331..f8e504c56c48 100644 --- a/src/test/run-make-fulldeps/coverage-reports-deadcode/expected_show_coverage_counters.nested_loops.txt +++ b/src/test/run-make-fulldeps/coverage-reports-deadcode/expected_show_coverage_counters.nested_loops.txt @@ -1,21 +1,20 @@ Counter in file 0 2:9 -> 3:27, #1 -Counter in file 0 5:19 -> 5:32, (#1 + #2) -Counter in file 0 6:13 -> 7:24, ((#1 + #2) - #3) -Counter in file 0 8:13 -> 8:14, ((((#1 + #2) - #3) + (#5 + #6)) - #7) -Counter in file 0 8:18 -> 8:23, (((#1 + #2) - #3) + (#5 + #6)) -Counter in file 0 9:16 -> 9:22, (((((#1 + #2) - #3) + (#5 + #6)) - #7) + 0) -Counter in file 0 10:17 -> 10:22, #8 -Counter in file 0 12:13 -> 12:19, #9 -Counter in file 0 13:13 -> 13:19, #10 -Counter in file 0 14:16 -> 14:22, (#10 + 0) -Counter in file 0 15:17 -> 16:27, #11 -Counter in file 0 17:21 -> 17:33, #4 -Counter in file 0 19:21 -> 21:14, #5 -Counter in file 0 21:14 -> 21:15, #6 -Counter in file 0 22:10 -> 22:11, (#5 + #6) -Counter in file 0 23:9 -> 23:23, #2 -Counter in file 0 24:6 -> 24:7, #3 -Counter in file 0 25:1 -> 25:2, (#4 + #3) +Counter in file 0 5:19 -> 5:32, (#1 + (#2 + #3)) +Counter in file 0 6:13 -> 7:24, ((#1 + (#2 + #3)) - #4) +Counter in file 0 8:13 -> 8:14, ((((#1 + (#2 + #3)) - #4) + (#6 + #7)) - #3) +Counter in file 0 8:18 -> 8:23, (((#1 + (#2 + #3)) - #4) + (#6 + #7)) +Counter in file 0 9:16 -> 9:22, (((((#1 + (#2 + #3)) - #4) + (#6 + #7)) - #3) + 0) +Counter in file 0 10:17 -> 10:22, #2 +Counter in file 0 12:13 -> 13:19, (((((#1 + (#2 + #3)) - #4) + (#6 + #7)) - #3) - #2) +Counter in file 0 14:16 -> 14:22, ((((((#1 + (#2 + #3)) - #4) + (#6 + #7)) - #3) - #2) + 0) +Counter in file 0 15:17 -> 16:27, ((((((#1 + (#2 + #3)) - #4) + (#6 + #7)) - #3) - #2) - #7) +Counter in file 0 17:21 -> 17:33, #5 +Counter in file 0 18:24 -> 21:14, #6 +Counter in file 0 21:14 -> 21:15, #7 +Counter in file 0 22:10 -> 22:11, (#6 + #7) +Counter in file 0 23:9 -> 23:23, (#2 + #3) +Counter in file 0 24:6 -> 24:7, #4 +Counter in file 0 25:1 -> 25:2, (#5 + #4) Emitting segments for file: ../coverage/nested_loops.rs Combined regions: 2:9 -> 3:27 (count=1) @@ -25,12 +24,11 @@ Combined regions: 8:18 -> 8:23 (count=3) 9:16 -> 9:22 (count=3) 10:17 -> 10:22 (count=0) - 12:13 -> 12:19 (count=3) - 13:13 -> 13:19 (count=3) + 12:13 -> 13:19 (count=3) 14:16 -> 14:22 (count=3) 15:17 -> 16:27 (count=1) 17:21 -> 17:33 (count=1) - 19:21 -> 21:14 (count=0) + 18:24 -> 21:14 (count=0) 21:14 -> 21:15 (count=2) 22:10 -> 22:11 (count=2) 23:9 -> 23:23 (count=0) @@ -51,8 +49,6 @@ Segment at 9:22 (count = 0), Skipped Segment at 10:17 (count = 0), RegionEntry Segment at 10:22 (count = 0), Skipped Segment at 12:13 (count = 3), RegionEntry -Segment at 12:19 (count = 0), Skipped -Segment at 13:13 (count = 3), RegionEntry Segment at 13:19 (count = 0), Skipped Segment at 14:16 (count = 3), RegionEntry Segment at 14:22 (count = 0), Skipped @@ -60,7 +56,7 @@ Segment at 15:17 (count = 1), RegionEntry Segment at 16:27 (count = 0), Skipped Segment at 17:21 (count = 1), RegionEntry Segment at 17:33 (count = 0), Skipped -Segment at 19:21 (count = 0), RegionEntry +Segment at 18:24 (count = 0), RegionEntry Segment at 21:14 (count = 2), RegionEntry Segment at 21:15 (count = 0), Skipped Segment at 22:10 (count = 2), RegionEntry diff --git a/src/test/run-make-fulldeps/coverage-reports-deadcode/expected_show_coverage_counters.overflow.txt b/src/test/run-make-fulldeps/coverage-reports-deadcode/expected_show_coverage_counters.overflow.txt new file mode 100644 index 000000000000..8696e102b568 --- /dev/null +++ b/src/test/run-make-fulldeps/coverage-reports-deadcode/expected_show_coverage_counters.overflow.txt @@ -0,0 +1,53 @@ +Counter in file 0 16:9 -> 16:27, #1 +Counter in file 0 17:11 -> 17:24, (#1 + (#2 + (#3 + #4))) +Counter in file 0 18:12 -> 18:26, ((#1 + (#2 + (#3 + #4))) - #5) +Counter in file 0 18:27 -> 21:10, #2 +Counter in file 0 21:19 -> 21:32, (((#1 + (#2 + (#3 + #4))) - #5) - #2) +Counter in file 0 21:33 -> 24:10, #3 +Counter in file 0 24:10 -> 24:11, #4 +Counter in file 0 24:10 -> 24:11, (#3 + #4) +Counter in file 0 25:9 -> 25:23, (#2 + (#3 + #4)) +Counter in file 0 27:5 -> 28:2, #5 +Counter in file 0 5:8 -> 5:18, #1 +Counter in file 0 5:19 -> 7:6, #2 +Counter in file 0 7:6 -> 7:7, (#1 - #2) +Counter in file 0 8:9 -> 13:2, (#2 + (#1 - #2)) +Emitting segments for file: ../coverage/overflow.rs +Combined regions: + 5:8 -> 5:18 (count=4) + 5:19 -> 7:6 (count=1) + 7:6 -> 7:7 (count=3) + 8:9 -> 13:2 (count=4) + 16:9 -> 16:27 (count=1) + 17:11 -> 17:24 (count=10) + 18:12 -> 18:26 (count=10) + 18:27 -> 21:10 (count=0) + 21:19 -> 21:32 (count=10) + 21:33 -> 24:10 (count=3) + 24:10 -> 24:11 (count=15) + 25:9 -> 25:23 (count=9) + 27:5 -> 28:2 (count=0) +Segment at 5:8 (count = 4), RegionEntry +Segment at 5:18 (count = 0), Skipped +Segment at 5:19 (count = 1), RegionEntry +Segment at 7:6 (count = 3), RegionEntry +Segment at 7:7 (count = 0), Skipped +Segment at 8:9 (count = 4), RegionEntry +Segment at 13:2 (count = 0), Skipped +Segment at 16:9 (count = 1), RegionEntry +Segment at 16:27 (count = 0), Skipped +Segment at 17:11 (count = 10), RegionEntry +Segment at 17:24 (count = 0), Skipped +Segment at 18:12 (count = 10), RegionEntry +Segment at 18:26 (count = 0), Skipped +Segment at 18:27 (count = 0), RegionEntry +Segment at 21:10 (count = 0), Skipped +Segment at 21:19 (count = 10), RegionEntry +Segment at 21:32 (count = 0), Skipped +Segment at 21:33 (count = 3), RegionEntry +Segment at 24:10 (count = 15), RegionEntry +Segment at 24:11 (count = 0), Skipped +Segment at 25:9 (count = 9), RegionEntry +Segment at 25:23 (count = 0), Skipped +Segment at 27:5 (count = 0), RegionEntry +Segment at 28:2 (count = 0), Skipped diff --git a/src/test/run-make-fulldeps/coverage-reports-deadcode/expected_show_coverage_counters.panic_unwind.txt b/src/test/run-make-fulldeps/coverage-reports-deadcode/expected_show_coverage_counters.panic_unwind.txt new file mode 100644 index 000000000000..9602ff1a985a --- /dev/null +++ b/src/test/run-make-fulldeps/coverage-reports-deadcode/expected_show_coverage_counters.panic_unwind.txt @@ -0,0 +1,50 @@ +Counter in file 0 14:9 -> 14:27, #1 +Counter in file 0 15:11 -> 15:24, (#1 + (#2 + (#3 + #4))) +Counter in file 0 16:12 -> 16:26, ((#1 + (#2 + (#3 + #4))) - #5) +Counter in file 0 16:27 -> 18:10, #2 +Counter in file 0 18:19 -> 18:32, (((#1 + (#2 + (#3 + #4))) - #5) - #2) +Counter in file 0 18:33 -> 20:10, #3 +Counter in file 0 20:10 -> 20:11, #4 +Counter in file 0 20:10 -> 20:11, (#3 + #4) +Counter in file 0 21:9 -> 21:23, (#2 + (#3 + #4)) +Counter in file 0 23:5 -> 24:2, #5 +Counter in file 0 5:8 -> 5:20, #1 +Counter in file 0 6:9 -> 7:26, #2 +Counter in file 0 8:12 -> 11:2, (#1 - #2) +Emitting segments for file: ../coverage/panic_unwind.rs +Combined regions: + 5:8 -> 5:20 (count=4) + 6:9 -> 7:26 (count=1) + 8:12 -> 11:2 (count=3) + 14:9 -> 14:27 (count=1) + 15:11 -> 15:24 (count=10) + 16:12 -> 16:26 (count=10) + 16:27 -> 18:10 (count=0) + 18:19 -> 18:32 (count=10) + 18:33 -> 20:10 (count=3) + 20:10 -> 20:11 (count=15) + 21:9 -> 21:23 (count=9) + 23:5 -> 24:2 (count=0) +Segment at 5:8 (count = 4), RegionEntry +Segment at 5:20 (count = 0), Skipped +Segment at 6:9 (count = 1), RegionEntry +Segment at 7:26 (count = 0), Skipped +Segment at 8:12 (count = 3), RegionEntry +Segment at 11:2 (count = 0), Skipped +Segment at 14:9 (count = 1), RegionEntry +Segment at 14:27 (count = 0), Skipped +Segment at 15:11 (count = 10), RegionEntry +Segment at 15:24 (count = 0), Skipped +Segment at 16:12 (count = 10), RegionEntry +Segment at 16:26 (count = 0), Skipped +Segment at 16:27 (count = 0), RegionEntry +Segment at 18:10 (count = 0), Skipped +Segment at 18:19 (count = 10), RegionEntry +Segment at 18:32 (count = 0), Skipped +Segment at 18:33 (count = 3), RegionEntry +Segment at 20:10 (count = 15), RegionEntry +Segment at 20:11 (count = 0), Skipped +Segment at 21:9 (count = 9), RegionEntry +Segment at 21:23 (count = 0), Skipped +Segment at 23:5 (count = 0), RegionEntry +Segment at 24:2 (count = 0), Skipped diff --git a/src/test/run-make-fulldeps/coverage-reports-deadcode/expected_show_coverage_counters.partial_eq.txt b/src/test/run-make-fulldeps/coverage-reports-deadcode/expected_show_coverage_counters.partial_eq.txt index 2b9285202f97..329e0f3889a9 100644 --- a/src/test/run-make-fulldeps/coverage-reports-deadcode/expected_show_coverage_counters.partial_eq.txt +++ b/src/test/run-make-fulldeps/coverage-reports-deadcode/expected_show_coverage_counters.partial_eq.txt @@ -1,28 +1,28 @@ -Counter in file 0 4:32 -> 4:33, (#3 + (#1 + #2)) Counter in file 0 4:48 -> 4:49, ((#1 + #2) + ((#3 + #4) + ((#5 + #6) + #7))) +Counter in file 0 7:5 -> 7:6, #1 Counter in file 0 21:11 -> 26:2, #1 -Counter in file 0 8:5 -> 8:17, #1 -Counter in file 0 8:5 -> 8:17, #1 Counter in file 0 4:39 -> 4:40, #1 Counter in file 0 4:48 -> 4:49, (#1 + 0) +Counter in file 0 7:5 -> 7:6, #1 Counter in file 0 4:39 -> 4:40, #1 Counter in file 0 4:48 -> 4:49, (#1 + 0) -Counter in file 0 8:5 -> 8:17, #1 Counter in file 0 4:32 -> 4:33, ((#4 + #5) + #6) +Counter in file 0 7:5 -> 7:6, #1 Counter in file 0 4:53 -> 4:54, (#1 + (#2 + (#3 + #4))) -Counter in file 0 13:9 -> 18:6, #1 -Counter in file 0 4:39 -> 4:40, #1 -Counter in file 0 4:48 -> 4:49, (#1 + 0) -Counter in file 0 7:5 -> 7:6, #1 -Counter in file 0 4:10 -> 4:15, #1 -Counter in file 0 4:35 -> 4:37, #1 -Counter in file 0 7:5 -> 7:6, #1 -Counter in file 0 7:5 -> 7:6, #1 -Counter in file 0 4:17 -> 4:22, #1 Counter in file 0 8:5 -> 8:17, #1 +Counter in file 0 13:9 -> 18:6, #1 +Counter in file 0 7:5 -> 7:6, #1 Counter in file 0 4:39 -> 4:40, #1 Counter in file 0 4:48 -> 4:49, (#1 + 0) -Counter in file 0 7:5 -> 7:6, #1 +Counter in file 0 4:10 -> 4:15, #1 +Counter in file 0 8:5 -> 8:17, #1 +Counter in file 0 4:35 -> 4:37, #1 +Counter in file 0 8:5 -> 8:17, #1 +Counter in file 0 8:5 -> 8:17, #1 +Counter in file 0 4:17 -> 4:22, #1 +Counter in file 0 4:39 -> 4:40, #1 +Counter in file 0 4:48 -> 4:49, (#1 + 0) +Counter in file 0 4:32 -> 4:33, (#3 + (#1 + #2)) Emitting segments for file: ../coverage/partial_eq.rs Combined regions: 4:17 -> 4:22 (count=2) diff --git a/src/test/run-make-fulldeps/coverage-reports-deadcode/expected_show_coverage_counters.simple_loop.txt b/src/test/run-make-fulldeps/coverage-reports-deadcode/expected_show_coverage_counters.simple_loop.txt index 255173e5534d..6ea09248d65c 100644 --- a/src/test/run-make-fulldeps/coverage-reports-deadcode/expected_show_coverage_counters.simple_loop.txt +++ b/src/test/run-make-fulldeps/coverage-reports-deadcode/expected_show_coverage_counters.simple_loop.txt @@ -3,10 +3,10 @@ Counter in file 0 12:9 -> 12:16, (#1 + 0) Counter in file 0 13:5 -> 18:6, #2 Counter in file 0 18:6 -> 18:7, (#1 - #2) Counter in file 0 23:13 -> 25:14, ((#2 + (#1 - #2)) + #3) -Counter in file 0 27:13 -> 27:18, #4 +Counter in file 0 27:13 -> 27:18, (((#2 + (#1 - #2)) + #3) - #3) Counter in file 0 30:9 -> 32:10, #3 Counter in file 0 34:6 -> 34:7, (#2 + (#1 - #2)) -Counter in file 0 35:1 -> 35:2, (#4 + 0) +Counter in file 0 35:1 -> 35:2, ((((#2 + (#1 - #2)) + #3) - #3) + 0) Emitting segments for file: ../coverage/simple_loop.rs Combined regions: 7:9 -> 9:26 (count=1) diff --git a/src/test/run-make-fulldeps/coverage-reports-deadcode/expected_show_coverage_counters.try_error_result.txt b/src/test/run-make-fulldeps/coverage-reports-deadcode/expected_show_coverage_counters.try_error_result.txt index a317cd792910..5b7f5496af81 100644 --- a/src/test/run-make-fulldeps/coverage-reports-deadcode/expected_show_coverage_counters.try_error_result.txt +++ b/src/test/run-make-fulldeps/coverage-reports-deadcode/expected_show_coverage_counters.try_error_result.txt @@ -1,12 +1,12 @@ Counter in file 0 13:9 -> 14:23, #1 Counter in file 0 17:9 -> 17:10, ((#1 + (#2 + #3)) - #4) Counter in file 0 19:9 -> 19:14, (#1 + (#2 + #3)) -Counter in file 0 21:9 -> 25:26, #8 -Counter in file 0 27:13 -> 27:41, #9 +Counter in file 0 21:9 -> 25:26, (((#1 + (#2 + #3)) - #4) + 0) +Counter in file 0 27:13 -> 27:41, #8 Counter in file 0 27:41 -> 27:42, #5 -Counter in file 0 28:13 -> 28:42, (#9 - #5) +Counter in file 0 28:13 -> 28:42, (#8 - #5) Counter in file 0 28:42 -> 28:43, #6 -Counter in file 0 32:13 -> 32:42, (#8 - #9) +Counter in file 0 32:13 -> 32:42, (((#1 + (#2 + #3)) - #4) - #8) Counter in file 0 32:42 -> 32:43, #7 Counter in file 0 33:10 -> 33:11, #2 Counter in file 0 33:10 -> 33:11, #3 diff --git a/src/test/run-make-fulldeps/coverage-reports-deadcode/expected_show_coverage_counters.while_early_ret.txt b/src/test/run-make-fulldeps/coverage-reports-deadcode/expected_show_coverage_counters.while_early_ret.txt index f541baec50c0..7e79a8f00e1a 100644 --- a/src/test/run-make-fulldeps/coverage-reports-deadcode/expected_show_coverage_counters.while_early_ret.txt +++ b/src/test/run-make-fulldeps/coverage-reports-deadcode/expected_show_coverage_counters.while_early_ret.txt @@ -1,7 +1,7 @@ Counter in file 0 5:9 -> 5:27, #1 Counter in file 0 7:9 -> 9:10, (#1 + #2) Counter in file 0 12:13 -> 14:14, ((#1 + #2) - #3) -Counter in file 0 18:21 -> 20:22, #6 +Counter in file 0 18:21 -> 20:22, (((#1 + #2) - #3) - #2) Counter in file 0 22:21 -> 22:27, #4 Counter in file 0 26:21 -> 26:27, #5 Counter in file 0 30:9 -> 32:10, #2 diff --git a/src/test/run-make-fulldeps/coverage-reports-deadcode/expected_show_coverage_counters.yield.txt b/src/test/run-make-fulldeps/coverage-reports-deadcode/expected_show_coverage_counters.yield.txt new file mode 100644 index 000000000000..a10753582116 --- /dev/null +++ b/src/test/run-make-fulldeps/coverage-reports-deadcode/expected_show_coverage_counters.yield.txt @@ -0,0 +1,90 @@ +Counter in file 0 8:9 -> 8:22, #1 +Counter in file 0 13:11 -> 14:35, (#1 + 0) +Counter in file 0 14:39 -> 14:41, #4 +Counter in file 0 15:14 -> 15:52, (#2 + #3) +Counter in file 0 17:11 -> 17:46, (#4 + 0) +Counter in file 0 18:34 -> 18:39, (#4 - #5) +Counter in file 0 18:44 -> 18:46, ((#4 - #5) - #6) +Counter in file 0 19:14 -> 19:52, (#5 + #6) +Counter in file 0 22:9 -> 22:22, (((#4 - #5) - #6) + 0) +Counter in file 0 29:11 -> 30:35, (((#4 - #5) - #6) + 0) +Counter in file 0 30:39 -> 30:41, #9 +Counter in file 0 31:14 -> 31:52, (#7 + #8) +Counter in file 0 33:11 -> 34:35, (#9 + 0) +Counter in file 0 34:39 -> 34:41, #12 +Counter in file 0 35:14 -> 35:52, (#10 + #11) +Counter in file 0 37:1 -> 37:2, (#12 + 0) +Counter in file 0 9:9 -> 9:16, #1 +Counter in file 0 10:16 -> 11:6, #2 +Counter in file 0 23:9 -> 23:16, #1 +Counter in file 0 24:9 -> 24:16, #2 +Counter in file 0 25:9 -> 25:16, #3 +Counter in file 0 26:16 -> 27:6, #4 +Emitting segments for file: ../coverage/yield.rs +Combined regions: + 8:9 -> 8:22 (count=1) + 9:9 -> 9:16 (count=1) + 10:16 -> 11:6 (count=1) + 13:11 -> 14:35 (count=1) + 14:39 -> 14:41 (count=1) + 15:14 -> 15:52 (count=0) + 17:11 -> 17:46 (count=1) + 18:34 -> 18:39 (count=1) + 18:44 -> 18:46 (count=1) + 19:14 -> 19:52 (count=0) + 22:9 -> 22:22 (count=1) + 23:9 -> 23:16 (count=1) + 24:9 -> 24:16 (count=1) + 25:9 -> 25:16 (count=0) + 26:16 -> 27:6 (count=0) + 29:11 -> 30:35 (count=1) + 30:39 -> 30:41 (count=1) + 31:14 -> 31:52 (count=0) + 33:11 -> 34:35 (count=1) + 34:39 -> 34:41 (count=1) + 35:14 -> 35:52 (count=0) + 37:1 -> 37:2 (count=1) +Segment at 8:9 (count = 1), RegionEntry +Segment at 8:22 (count = 0), Skipped +Segment at 9:9 (count = 1), RegionEntry +Segment at 9:16 (count = 0), Skipped +Segment at 10:16 (count = 1), RegionEntry +Segment at 11:6 (count = 0), Skipped +Segment at 13:11 (count = 1), RegionEntry +Segment at 14:35 (count = 0), Skipped +Segment at 14:39 (count = 1), RegionEntry +Segment at 14:41 (count = 0), Skipped +Segment at 15:14 (count = 0), RegionEntry +Segment at 15:52 (count = 0), Skipped +Segment at 17:11 (count = 1), RegionEntry +Segment at 17:46 (count = 0), Skipped +Segment at 18:34 (count = 1), RegionEntry +Segment at 18:39 (count = 0), Skipped +Segment at 18:44 (count = 1), RegionEntry +Segment at 18:46 (count = 0), Skipped +Segment at 19:14 (count = 0), RegionEntry +Segment at 19:52 (count = 0), Skipped +Segment at 22:9 (count = 1), RegionEntry +Segment at 22:22 (count = 0), Skipped +Segment at 23:9 (count = 1), RegionEntry +Segment at 23:16 (count = 0), Skipped +Segment at 24:9 (count = 1), RegionEntry +Segment at 24:16 (count = 0), Skipped +Segment at 25:9 (count = 0), RegionEntry +Segment at 25:16 (count = 0), Skipped +Segment at 26:16 (count = 0), RegionEntry +Segment at 27:6 (count = 0), Skipped +Segment at 29:11 (count = 1), RegionEntry +Segment at 30:35 (count = 0), Skipped +Segment at 30:39 (count = 1), RegionEntry +Segment at 30:41 (count = 0), Skipped +Segment at 31:14 (count = 0), RegionEntry +Segment at 31:52 (count = 0), Skipped +Segment at 33:11 (count = 1), RegionEntry +Segment at 34:35 (count = 0), Skipped +Segment at 34:39 (count = 1), RegionEntry +Segment at 34:41 (count = 0), Skipped +Segment at 35:14 (count = 0), RegionEntry +Segment at 35:52 (count = 0), Skipped +Segment at 37:1 (count = 1), RegionEntry +Segment at 37:2 (count = 0), Skipped diff --git a/src/test/run-make-fulldeps/coverage-spanview-base/Makefile b/src/test/run-make-fulldeps/coverage-spanview-base/Makefile index 9f9440340e0e..c62cbc1c91f7 100644 --- a/src/test/run-make-fulldeps/coverage-spanview-base/Makefile +++ b/src/test/run-make-fulldeps/coverage-spanview-base/Makefile @@ -43,6 +43,9 @@ endif %: $(SOURCEDIR)/%.rs # Compile the test program with coverage instrumentation and generate relevant MIR. $(RUSTC) $(SOURCEDIR)/$@.rs \ + $$( grep -q '^\/\/ require-rust-edition-2018' $(SOURCEDIR)/$@.rs && \ + echo "--edition=2018" \ + ) \ -Zinstrument-coverage \ -Clink-dead-code=$(LINK_DEAD_CODE) \ -Zdump-mir=InstrumentCoverage \ diff --git a/src/test/run-make-fulldeps/coverage-spanview-base/expected_mir_dump.abort/abort.main.-------.InstrumentCoverage.0.html b/src/test/run-make-fulldeps/coverage-spanview-base/expected_mir_dump.abort/abort.main.-------.InstrumentCoverage.0.html new file mode 100644 index 000000000000..a8227cffc60f --- /dev/null +++ b/src/test/run-make-fulldeps/coverage-spanview-base/expected_mir_dump.abort/abort.main.-------.InstrumentCoverage.0.html @@ -0,0 +1,99 @@ + + + + +abort.main - Coverage Spans + + + +
fn main() -> Result<(),u8> { + let @0⦊mut countdown = 10⦉@0; + while @1,2⦊countdown > 0⦉@1,2 { + if @3,5⦊countdown < 5⦉@3,5 @6,8,9⦊{ + might_abort(false); + }⦉@6,8,9@7⦊⦉@7 + @10,11⦊countdown -= 1⦉@10,11; + } + @4⦊Ok(()) +}⦉@4
+ + diff --git a/src/test/run-make-fulldeps/coverage-spanview-base/expected_mir_dump.abort/abort.might_abort.-------.InstrumentCoverage.0.html b/src/test/run-make-fulldeps/coverage-spanview-base/expected_mir_dump.abort/abort.might_abort.-------.InstrumentCoverage.0.html new file mode 100644 index 000000000000..daef056a19aa --- /dev/null +++ b/src/test/run-make-fulldeps/coverage-spanview-base/expected_mir_dump.abort/abort.might_abort.-------.InstrumentCoverage.0.html @@ -0,0 +1,164 @@ + + + + +abort.might_abort - Coverage Spans + + + +
fn might_abort(should_abort: bool) { + if @0⦊should_abort⦉@0 { + @1,3,4,5⦊println!("aborting..."); + panic!("panics and aborts");⦉@1,3,4,5 + } else @2,6,7⦊{ + println!("Don't Panic"); + } +}⦉@2,6,7
+ + diff --git a/src/test/run-make-fulldeps/coverage-spanview-base/expected_mir_dump.assert/assert.main.-------.InstrumentCoverage.0.html b/src/test/run-make-fulldeps/coverage-spanview-base/expected_mir_dump.assert/assert.main.-------.InstrumentCoverage.0.html new file mode 100644 index 000000000000..499825445ace --- /dev/null +++ b/src/test/run-make-fulldeps/coverage-spanview-base/expected_mir_dump.assert/assert.main.-------.InstrumentCoverage.0.html @@ -0,0 +1,103 @@ + + + + +assert.main - Coverage Spans + + + +
fn main() -> Result<(),u8> { + let @0⦊mut countdown = 10⦉@0; + while @1,2⦊countdown > 0⦉@1,2 { + if @3,5⦊countdown == 1⦉@3,5 @6,8,9⦊{ + might_fail_assert(3); + }⦉@6,8,9 else if @7⦊countdown < 5⦉@7 @10,12,13⦊{ + might_fail_assert(2); + }⦉@10,12,13@11⦊⦉@11@14⦊⦉@14 + @15,16⦊countdown -= 1⦉@15,16; + } + @4⦊Ok(()) +}⦉@4
+ + diff --git a/src/test/run-make-fulldeps/coverage-spanview-base/expected_mir_dump.assert/assert.might_fail_assert.-------.InstrumentCoverage.0.html b/src/test/run-make-fulldeps/coverage-spanview-base/expected_mir_dump.assert/assert.might_fail_assert.-------.InstrumentCoverage.0.html new file mode 100644 index 000000000000..98be3485a417 --- /dev/null +++ b/src/test/run-make-fulldeps/coverage-spanview-base/expected_mir_dump.assert/assert.might_fail_assert.-------.InstrumentCoverage.0.html @@ -0,0 +1,97 @@ + + + + +assert.might_fail_assert - Coverage Spans + + + +
fn might_fail_assert(one_plus_one: u32) { + @0,1,2,3,4⦊println!("does 1 + 1 = {}?", one_plus_one);⦉@0,1,2,3,4 + assert_eq!(@0,1,2,3,4⦊1 + 1⦉@0,1,2,3,4, one_plus_one, @5,7,8,9,10,11,12⦊"the argument was wrong"⦉@5,7,8,9,10,11,12); +}@6⦊⦉@6
+ + diff --git a/src/test/run-make-fulldeps/coverage-spanview-base/expected_mir_dump.async/async.executor-block_on-VTABLE-{closure#0}.-------.InstrumentCoverage.0.html b/src/test/run-make-fulldeps/coverage-spanview-base/expected_mir_dump.async/async.executor-block_on-VTABLE-{closure#0}.-------.InstrumentCoverage.0.html new file mode 100644 index 000000000000..31646f8ce81d --- /dev/null +++ b/src/test/run-make-fulldeps/coverage-spanview-base/expected_mir_dump.async/async.executor-block_on-VTABLE-{closure#0}.-------.InstrumentCoverage.0.html @@ -0,0 +1,89 @@ + + + + +async.executor-block_on-VTABLE-{closure#0} - Coverage Spans + + + +
{ + @0,1,2,3⦊$crate::rt::begin_panic_fmt(&$crate::format_args!($fmt, $($arg)+))⦉@0,1,2,3 + }
+ + diff --git a/src/test/run-make-fulldeps/coverage-spanview-base/expected_mir_dump.async/async.executor-block_on-VTABLE-{closure#1}.-------.InstrumentCoverage.0.html b/src/test/run-make-fulldeps/coverage-spanview-base/expected_mir_dump.async/async.executor-block_on-VTABLE-{closure#1}.-------.InstrumentCoverage.0.html new file mode 100644 index 000000000000..ddc791f074fb --- /dev/null +++ b/src/test/run-make-fulldeps/coverage-spanview-base/expected_mir_dump.async/async.executor-block_on-VTABLE-{closure#1}.-------.InstrumentCoverage.0.html @@ -0,0 +1,89 @@ + + + + +async.executor-block_on-VTABLE-{closure#1} - Coverage Spans + + + +
{ + @0,1,2,3⦊$crate::rt::begin_panic_fmt(&$crate::format_args!($fmt, $($arg)+))⦉@0,1,2,3 + }
+ + diff --git a/src/test/run-make-fulldeps/coverage-spanview-base/expected_mir_dump.async/async.executor-block_on-VTABLE-{closure#2}.-------.InstrumentCoverage.0.html b/src/test/run-make-fulldeps/coverage-spanview-base/expected_mir_dump.async/async.executor-block_on-VTABLE-{closure#2}.-------.InstrumentCoverage.0.html new file mode 100644 index 000000000000..709b87fc5019 --- /dev/null +++ b/src/test/run-make-fulldeps/coverage-spanview-base/expected_mir_dump.async/async.executor-block_on-VTABLE-{closure#2}.-------.InstrumentCoverage.0.html @@ -0,0 +1,89 @@ + + + + +async.executor-block_on-VTABLE-{closure#2} - Coverage Spans + + + +
{ + @0,1,2,3⦊$crate::rt::begin_panic_fmt(&$crate::format_args!($fmt, $($arg)+))⦉@0,1,2,3 + }
+ + diff --git a/src/test/run-make-fulldeps/coverage-spanview-base/expected_mir_dump.async/async.executor-block_on-VTABLE-{closure#3}.-------.InstrumentCoverage.0.html b/src/test/run-make-fulldeps/coverage-spanview-base/expected_mir_dump.async/async.executor-block_on-VTABLE-{closure#3}.-------.InstrumentCoverage.0.html new file mode 100644 index 000000000000..abd2621481a3 --- /dev/null +++ b/src/test/run-make-fulldeps/coverage-spanview-base/expected_mir_dump.async/async.executor-block_on-VTABLE-{closure#3}.-------.InstrumentCoverage.0.html @@ -0,0 +1,75 @@ + + + + +async.executor-block_on-VTABLE-{closure#3} - Coverage Spans + + + +
|_| @0⦊()⦉@0
+ + diff --git a/src/test/run-make-fulldeps/coverage-spanview-base/expected_mir_dump.async/async.executor-block_on.-------.InstrumentCoverage.0.html b/src/test/run-make-fulldeps/coverage-spanview-base/expected_mir_dump.async/async.executor-block_on.-------.InstrumentCoverage.0.html new file mode 100644 index 000000000000..9d71d8ccc6e0 --- /dev/null +++ b/src/test/run-make-fulldeps/coverage-spanview-base/expected_mir_dump.async/async.executor-block_on.-------.InstrumentCoverage.0.html @@ -0,0 +1,226 @@ + + + + +async.executor-block_on - Coverage Spans + + + +
pub fn block_on<F: Future>(mut future: F) -> F::Output { + let @0,1,2,3,4,5⦊mut future = unsafe { Pin::new_unchecked(&mut future) }; + + static VTABLE: RawWakerVTable = RawWakerVTable::new( + |_| unimplemented!("clone"), + |_| unimplemented!("wake"), + |_| unimplemented!("wake_by_ref"), + |_| (), + ); + let waker = unsafe { Waker::from_raw(RawWaker::new(core::ptr::null(), &VTABLE)) }; + let mut context = Context::from_waker(&waker)⦉@0,1,2,3,4,5; + + loop { + if let Poll::Ready(@10,12,14,15,16,17⦊val⦉@10,12,14,15,16,17) = @6,7,8,9⦊future.as_mut().poll(&mut context)⦉@6,7,8,9 { + break @10,12,14,15,16,17⦊val⦉@10,12,14,15,16,17; + } + }@11,13⦊⦉@11,13 + }@10,12,14,15,16,17⦊⦉@10,12,14,15,16,17
+ + diff --git a/src/test/run-make-fulldeps/coverage-spanview-base/expected_mir_dump.async/async.f-{closure#0}.-------.InstrumentCoverage.0.html b/src/test/run-make-fulldeps/coverage-spanview-base/expected_mir_dump.async/async.f-{closure#0}.-------.InstrumentCoverage.0.html new file mode 100644 index 000000000000..779f67fd7c10 --- /dev/null +++ b/src/test/run-make-fulldeps/coverage-spanview-base/expected_mir_dump.async/async.f-{closure#0}.-------.InstrumentCoverage.0.html @@ -0,0 +1,75 @@ + + + + +async.f-{closure#0} - Coverage Spans + + + +
{ @0⦊1 }⦉@0
+ + diff --git a/src/test/run-make-fulldeps/coverage-spanview-base/expected_mir_dump.async/async.f.-------.InstrumentCoverage.0.html b/src/test/run-make-fulldeps/coverage-spanview-base/expected_mir_dump.async/async.f.-------.InstrumentCoverage.0.html new file mode 100644 index 000000000000..050ae67efc98 --- /dev/null +++ b/src/test/run-make-fulldeps/coverage-spanview-base/expected_mir_dump.async/async.f.-------.InstrumentCoverage.0.html @@ -0,0 +1,74 @@ + + + + +async.f - Coverage Spans + + + +
async fn f() -> u8 { 1 }@0,1⦊⦉@0,1
+ + diff --git a/src/test/run-make-fulldeps/coverage-spanview-base/expected_mir_dump.async/async.foo-{closure#0}.-------.InstrumentCoverage.0.html b/src/test/run-make-fulldeps/coverage-spanview-base/expected_mir_dump.async/async.foo-{closure#0}.-------.InstrumentCoverage.0.html new file mode 100644 index 000000000000..d176a607d3b5 --- /dev/null +++ b/src/test/run-make-fulldeps/coverage-spanview-base/expected_mir_dump.async/async.foo-{closure#0}.-------.InstrumentCoverage.0.html @@ -0,0 +1,75 @@ + + + + +async.foo-{closure#0} - Coverage Spans + + + +
{ @0⦊[false; 10] }⦉@0
+ + diff --git a/src/test/run-make-fulldeps/coverage-spanview-base/expected_mir_dump.async/async.foo.-------.InstrumentCoverage.0.html b/src/test/run-make-fulldeps/coverage-spanview-base/expected_mir_dump.async/async.foo.-------.InstrumentCoverage.0.html new file mode 100644 index 000000000000..64eeaefa8946 --- /dev/null +++ b/src/test/run-make-fulldeps/coverage-spanview-base/expected_mir_dump.async/async.foo.-------.InstrumentCoverage.0.html @@ -0,0 +1,74 @@ + + + + +async.foo - Coverage Spans + + + +
async fn foo() -> [bool; 10] { [false; 10] }@0,1⦊⦉@0,1
+ + diff --git a/src/test/run-make-fulldeps/coverage-spanview-base/expected_mir_dump.async/async.g-{closure#0}.-------.InstrumentCoverage.0.html b/src/test/run-make-fulldeps/coverage-spanview-base/expected_mir_dump.async/async.g-{closure#0}.-------.InstrumentCoverage.0.html new file mode 100644 index 000000000000..4e894eecd16a --- /dev/null +++ b/src/test/run-make-fulldeps/coverage-spanview-base/expected_mir_dump.async/async.g-{closure#0}.-------.InstrumentCoverage.0.html @@ -0,0 +1,80 @@ + + + + +async.g-{closure#0} - Coverage Spans + + + +
@0,2,3⦊{ + match x⦉@0,2,3 { + @16⦊y⦉@16 if @0,2,3⦊f()⦉@0,2,3.await == @9,12,14,15⦊y⦉@9,12,14,15@17⦊⦉@17 => @16⦊()⦉@16, + _ => @1⦊()⦉@1, + } +}@18,19⦊⦉@18,19
+ + diff --git a/src/test/run-make-fulldeps/coverage-spanview-base/expected_mir_dump.async/async.g.-------.InstrumentCoverage.0.html b/src/test/run-make-fulldeps/coverage-spanview-base/expected_mir_dump.async/async.g.-------.InstrumentCoverage.0.html new file mode 100644 index 000000000000..4788562a9d4f --- /dev/null +++ b/src/test/run-make-fulldeps/coverage-spanview-base/expected_mir_dump.async/async.g.-------.InstrumentCoverage.0.html @@ -0,0 +1,79 @@ + + + + +async.g - Coverage Spans + + + +
pub async fn g(x: u8) { + match x { + y if f().await == y => (), + _ => (), + } +}@0,1⦊⦉@0,1
+ + diff --git a/src/test/run-make-fulldeps/coverage-spanview-base/expected_mir_dump.async/async.h-{closure#0}.-------.InstrumentCoverage.0.html b/src/test/run-make-fulldeps/coverage-spanview-base/expected_mir_dump.async/async.h-{closure#0}.-------.InstrumentCoverage.0.html new file mode 100644 index 000000000000..de48232efde6 --- /dev/null +++ b/src/test/run-make-fulldeps/coverage-spanview-base/expected_mir_dump.async/async.h-{closure#0}.-------.InstrumentCoverage.0.html @@ -0,0 +1,80 @@ + + + + +async.h-{closure#0} - Coverage Spans + + + +
@0,2,3⦊{ + match x⦉@0,2,3 { + @17⦊y⦉@17 if @0,2,3⦊foo()⦉@0,2,3.await[@9,12,14,15,16⦊y⦉@9,12,14,15,16]@18⦊⦉@18 => @17⦊()⦉@17, + _ => @1⦊()⦉@1, + } +}@19,20⦊⦉@19,20
+ + diff --git a/src/test/run-make-fulldeps/coverage-spanview-base/expected_mir_dump.async/async.h.-------.InstrumentCoverage.0.html b/src/test/run-make-fulldeps/coverage-spanview-base/expected_mir_dump.async/async.h.-------.InstrumentCoverage.0.html new file mode 100644 index 000000000000..83b0a3e0d43a --- /dev/null +++ b/src/test/run-make-fulldeps/coverage-spanview-base/expected_mir_dump.async/async.h.-------.InstrumentCoverage.0.html @@ -0,0 +1,79 @@ + + + + +async.h - Coverage Spans + + + +
async fn h(x: usize) { + match x { + y if foo().await[y] => (), + _ => (), + } +}@0,1⦊⦉@0,1
+ + diff --git a/src/test/run-make-fulldeps/coverage-spanview-base/expected_mir_dump.async/async.i-{closure#0}.-------.InstrumentCoverage.0.html b/src/test/run-make-fulldeps/coverage-spanview-base/expected_mir_dump.async/async.i-{closure#0}.-------.InstrumentCoverage.0.html new file mode 100644 index 000000000000..71397d396253 --- /dev/null +++ b/src/test/run-make-fulldeps/coverage-spanview-base/expected_mir_dump.async/async.i-{closure#0}.-------.InstrumentCoverage.0.html @@ -0,0 +1,82 @@ + + + + +async.i-{closure#0} - Coverage Spans + + + +
@0,2,3⦊{ + match x⦉@0,2,3 { + @17⦊y⦉@17 if @0,2,3⦊f()⦉@0,2,3.await == @9,12,14,15,16⦊y + 1⦉@9,12,14,15,16@18⦊⦉@18 => @17⦊()⦉@17, + _ => @1⦊()⦉@1, + } +}@19,20⦊⦉@19,20
+ + diff --git a/src/test/run-make-fulldeps/coverage-spanview-base/expected_mir_dump.async/async.i.-------.InstrumentCoverage.0.html b/src/test/run-make-fulldeps/coverage-spanview-base/expected_mir_dump.async/async.i.-------.InstrumentCoverage.0.html new file mode 100644 index 000000000000..55efca744817 --- /dev/null +++ b/src/test/run-make-fulldeps/coverage-spanview-base/expected_mir_dump.async/async.i.-------.InstrumentCoverage.0.html @@ -0,0 +1,79 @@ + + + + +async.i - Coverage Spans + + + +
async fn i(x: u8) { + match x { + y if f().await == y + 1 => (), + _ => (), + } +}@0,1⦊⦉@0,1
+ + diff --git a/src/test/run-make-fulldeps/coverage-spanview-base/expected_mir_dump.async/async.main.-------.InstrumentCoverage.0.html b/src/test/run-make-fulldeps/coverage-spanview-base/expected_mir_dump.async/async.main.-------.InstrumentCoverage.0.html new file mode 100644 index 000000000000..2f14339d9e95 --- /dev/null +++ b/src/test/run-make-fulldeps/coverage-spanview-base/expected_mir_dump.async/async.main.-------.InstrumentCoverage.0.html @@ -0,0 +1,133 @@ + + + + +async.main - Coverage Spans + + + +
fn main() @0,1,2,3,4,5,6,7,8,9⦊{ + let _ = g(10); + let _ = h(9); + let mut future = Box::pin(i(8)); + executor::block_on(future.as_mut()); +}⦉@0,1,2,3,4,5,6,7,8,9
+ + diff --git a/src/test/run-make-fulldeps/coverage-spanview-base/expected_mir_dump.conditions/conditions.main.-------.InstrumentCoverage.0.html b/src/test/run-make-fulldeps/coverage-spanview-base/expected_mir_dump.conditions/conditions.main.-------.InstrumentCoverage.0.html index cda1040c2911..09adc12cefdb 100644 --- a/src/test/run-make-fulldeps/coverage-spanview-base/expected_mir_dump.conditions/conditions.main.-------.InstrumentCoverage.0.html +++ b/src/test/run-make-fulldeps/coverage-spanview-base/expected_mir_dump.conditions/conditions.main.-------.InstrumentCoverage.0.html @@ -87,10 +87,12 @@ For revisions in Pull Requests (PR): let @25⦊x⦉@25 = if @4⦊countdown > 7⦉@4 { - @8⦊countdown -= 4; - B⦉@8 + @5,7,8⦊countdown -= 4; + B⦉@5,7,8 } else if @6⦊countdown > 2⦉@6 { @@ -106,10 +108,12 @@ For revisions in Pull Requests (PR): }⦉@20,22@21⦊⦉@21 - @24⦊countdown -= 5; - countdown⦉@24 + @23,24⦊countdown -= 5; + countdown⦉@23,24 } else { @10⦊return⦉@10; }; @@ -129,9 +133,15 @@ For revisions in Pull Requests (PR): if @29⦊countdown > 7⦉@29 { - @33⦊countdown -= 4⦉@33; - } else if @29⦊countdown > 7⦉@29 @30,32,33⦊{ + countdown -= 4; + }⦉@30,32,33 else if @31⦊countdown > 2⦉@31 { if }⦉@45,47@46⦊⦉@46 - @49⦊countdown -= 5⦉@49; + @48,49⦊countdown -= 5⦉@48,49; } else { @35⦊return⦉@35; } - let @50⦊mut countdown = 0⦉@50; - if @50⦊true⦉@50 @51,53⦊{ - countdown = 1; - }⦉@51,53@52⦊⦉@52 + if @50⦊true⦉@50 { + // Demonstrate the difference with `TerminatorKind::Assert` as of 2020-11-15. Assert is no + // longer treated as a `BasicCoverageBlock` terminator, which changed the coverage region, + // for the executed `then` block above, to include the closing brace on line 30. That + // changed the line count, but the coverage code region (for the `else if` condition) is + // still valid. + // + // Note that `if` (then) and `else` blocks include the closing brace in their coverage + // code regions when the last line in the block ends in a semicolon, because the Rust + // compiler inserts a `StatementKind::Assign` to assign `const ()` to a `Place`, for the + // empty value for the executed block. When the last line does not end in a semicolon + // (that is, when the block actually results in a value), the additional `Assign` is not + // generated, and the brace is not included. + let @51,53⦊mut countdown = 0⦉@51,53; + if @51,53⦊true⦉@51,53 @54,56⦊{ + countdown = 10; + }⦉@54,56@55⦊⦉@55 - let @77⦊z⦉@77 = if @54⦊countdown > 7⦉@54 { - @58⦊countdown -= 4⦉@58; - } else if @56⦊countdown > 2⦉@56 { - if @59,61⦊countdown < 1⦉@59,61 || @68⦊countdown > 5⦉@68@66⦊⦉@66@67⦊⦉@67 || @64⦊countdown != 9⦉@64@62⦊⦉@62@63⦊⦉@63 @70,72⦊{ - countdown = 0; - }⦉@70,72@71⦊⦉@71 - @74⦊countdown -= 5⦉@74; + if @57⦊countdown > 7⦉@57 @58,60,61⦊{ + countdown -= 4; + }⦉@58,60,61 + // The closing brace of the `then` branch is now included in the coverage region, and shown + // as "executed" (giving its line a count of 1 here). Since, in the original version above, + // the closing brace shares the same line as the `else if` conditional expression (which is + // not executed if the first `then` condition is true), only the condition's code region is + // marked with a count of 0 now. + else if @59⦊countdown > 2⦉@59 { + if @62,64⦊countdown < 1⦉@62,64 || @71⦊countdown > 5⦉@71@69⦊⦉@69@70⦊⦉@70 || @67⦊countdown != 9⦉@67@65⦊⦉@65@66⦊⦉@66 @73,75⦊{ + countdown = 0; + }⦉@73,75@74⦊⦉@74 + @76,77⦊countdown -= 5⦉@76,77; + } else { + @63⦊return⦉@63; + } + }@78⦊⦉@78@52⦊⦉@52 + + let @79⦊mut countdown = 0⦉@79; + if @79⦊true⦉@79 @80,82⦊{ + countdown = 1; + }⦉@80,82@81⦊⦉@81 + + let @106⦊z⦉@106 = if @83⦊countdown > 7⦉@83 @84,86,87⦊{ + countdown -= 4; + }⦉@84,86,87 else if @85⦊countdown > 2⦉@85 { + if @88,90⦊countdown < 1⦉@88,90 || @97⦊countdown > 5⦉@97@95⦊⦉@95@96⦊⦉@96 || @93⦊countdown != 9⦉@93@91⦊⦉@91@92⦊⦉@92 @99,101⦊{ + countdown = 0; + }⦉@99,101@100⦊⦉@100 + @102,103⦊countdown -= 5⦉@102,103; } else { - let @60,75,76⦊should_be_reachable = countdown; - println!("reached"); - return⦉@60,75,76; + let @89,104,105⦊should_be_reachable = countdown; + println!("reached"); + return⦉@89,104,105; }; - let @98⦊w⦉@98 = if @77⦊countdown > 7⦉@77 { - @81⦊countdown -= 4⦉@81; - } else if @79⦊countdown > 2⦉@79 { - if @82,84⦊countdown < 1⦉@82,84 || @91⦊countdown > 5⦉@91@89⦊⦉@89@90⦊⦉@90 || @87⦊countdown != 9⦉@87@85⦊⦉@85@86⦊⦉@86 @93,95⦊{ - countdown = 0; - }⦉@93,95@94⦊⦉@94 - @97⦊countdown -= 5⦉@97; + let @127⦊w⦉@127 = if @106⦊countdown > 7⦉@106 @107,109,110⦊{ + countdown -= 4; + }⦉@107,109,110 else if @108⦊countdown > 2⦉@108 { + if @111,113⦊countdown < 1⦉@111,113 || @120⦊countdown > 5⦉@120@118⦊⦉@118@119⦊⦉@119 || @116⦊countdown != 9⦉@116@114⦊⦉@114@115⦊⦉@115 @122,124⦊{ + countdown = 0; + }⦉@122,124@123⦊⦉@123 + @125,126⦊countdown -= 5⦉@125,126; } else { - @83⦊return⦉@83; + @112⦊return⦉@112; }; -}@101⦊⦉@101@102⦊⦉@102 +}@130⦊⦉@130@131⦊⦉@131 diff --git a/src/test/run-make-fulldeps/coverage-spanview-base/expected_mir_dump.inner_items/inner_items.main-in_func.-------.InstrumentCoverage.0.html b/src/test/run-make-fulldeps/coverage-spanview-base/expected_mir_dump.inner_items/inner_items.main-in_func.-------.InstrumentCoverage.0.html index 31bb57be81b5..fc9f54143ed2 100644 --- a/src/test/run-make-fulldeps/coverage-spanview-base/expected_mir_dump.inner_items/inner_items.main-in_func.-------.InstrumentCoverage.0.html +++ b/src/test/run-make-fulldeps/coverage-spanview-base/expected_mir_dump.inner_items/inner_items.main-in_func.-------.InstrumentCoverage.0.html @@ -71,10 +71,13 @@ For revisions in Pull Requests (PR):
fn in_func(a: u32) { let @0⦊b = 1⦉@0; - let @1,2,3,4⦊c⦉@1,2,3,4 = @0⦊a + b⦉@0; - @1,2,3,4⦊println!("c = {}", c) -@0,1,2,3,4⦊b = 1; + }⦉@1,2,3,4
+22:6-22:6: @4.Return: return"> let c = a + b;
+ println!("c = {}", c) + }⦉@0,1,2,3,4 diff --git a/src/test/run-make-fulldeps/coverage-spanview-base/expected_mir_dump.inner_items/inner_items.main-{impl#0}-trait_func.-------.InstrumentCoverage.0.html b/src/test/run-make-fulldeps/coverage-spanview-base/expected_mir_dump.inner_items/inner_items.main-{impl#0}-trait_func.-------.InstrumentCoverage.0.html index 6c4ce72305e5..325d4483223b 100644 --- a/src/test/run-make-fulldeps/coverage-spanview-base/expected_mir_dump.inner_items/inner_items.main-{impl#0}-trait_func.-------.InstrumentCoverage.0.html +++ b/src/test/run-make-fulldeps/coverage-spanview-base/expected_mir_dump.inner_items/inner_items.main-{impl#0}-trait_func.-------.InstrumentCoverage.0.html @@ -69,13 +69,33 @@ For revisions in Pull Requests (PR): -
fn trait_func(&mut self, incr: u32) { - self.in_struct_field += @0⦊incr⦉@0; - fn trait_func(&mut self, incr: u32) @1,2⦊in_func(self.in_struct_field); -@0,1,2⦊{ + }⦉@1,2
+40:45-43:10: @2[2]: _0 = const () +43:10-43:10: @2.Return: return"> self.in_struct_field += incr; + in_func(self.in_struct_field); + }⦉@0,1,2 diff --git a/src/test/run-make-fulldeps/coverage-spanview-base/expected_mir_dump.nested_loops/nested_loops.main.-------.InstrumentCoverage.0.html b/src/test/run-make-fulldeps/coverage-spanview-base/expected_mir_dump.nested_loops/nested_loops.main.-------.InstrumentCoverage.0.html index 7fbda5d0b3d2..509a949cfcf5 100644 --- a/src/test/run-make-fulldeps/coverage-spanview-base/expected_mir_dump.nested_loops/nested_loops.main.-------.InstrumentCoverage.0.html +++ b/src/test/run-make-fulldeps/coverage-spanview-base/expected_mir_dump.nested_loops/nested_loops.main.-------.InstrumentCoverage.0.html @@ -108,28 +108,46 @@ For revisions in Pull Requests (PR): 9:16-9:22: @16[18]: FakeRead(ForMatchedPlace, _26)">@14,16⦊a < 30⦉@14,16 { @17,19⦊break⦉@17,19; } - @20⦊a -= 5⦉@20; - @21⦊b -= 5⦉@21; - if @18,20,21⦊a -= 5; + b -= 5⦉@18,20,21; + if @21⦊b < 90⦉@21 { - @18,20,21⦊b < 90⦉@18,20,21 { + @25⦊a -= 10; -@22,24,25⦊a -= 10; + if is_true⦉@25 { - @26,28⦊break 'outer⦉@26,28; - } else { - @29⦊a -= 2; - if is_true⦉@22,24,25 { + @26,28⦊break 'outer⦉@26,28; + } else @27,29⦊{ + a -= 2; + } - }⦉@29@23⦊⦉@23 - }@30⦊⦉@30 - @32⦊countdown -= 1⦉@32; - }@7⦊⦉@7 -}@33⦊⦉@33 + }⦉@27,29@23⦊⦉@23 + }@30⦊⦉@30 + @31,32⦊countdown -= 1⦉@31,32; + }@7⦊⦉@7 +}@33⦊⦉@33 diff --git a/src/test/run-make-fulldeps/coverage-spanview-base/expected_mir_dump.overflow/overflow.main.-------.InstrumentCoverage.0.html b/src/test/run-make-fulldeps/coverage-spanview-base/expected_mir_dump.overflow/overflow.main.-------.InstrumentCoverage.0.html new file mode 100644 index 000000000000..2be6bad619ed --- /dev/null +++ b/src/test/run-make-fulldeps/coverage-spanview-base/expected_mir_dump.overflow/overflow.main.-------.InstrumentCoverage.0.html @@ -0,0 +1,259 @@ + + + + +overflow.main - Coverage Spans + + + +
fn main() -> Result<(),u8> { + let @0⦊mut countdown = 10⦉@0; + while @1,2⦊countdown > 0⦉@1,2 { + if @3,5⦊countdown == 1⦉@3,5 @6,8,9,10,11,12⦊{ + let result = might_overflow(10); + println!("Result: {}", result); + }⦉@6,8,9,10,11,12 else if @7⦊countdown < 5⦉@7 @13,15,16,17,18,19⦊{ + let result = might_overflow(1); + println!("Result: {}", result); + }⦉@13,15,16,17,18,19@14⦊⦉@14@20⦊⦉@20 + @21,22⦊countdown -= 1⦉@21,22; + } + @4⦊Ok(()) +}⦉@4
+ + diff --git a/src/test/run-make-fulldeps/coverage-spanview-base/expected_mir_dump.overflow/overflow.might_overflow.-------.InstrumentCoverage.0.html b/src/test/run-make-fulldeps/coverage-spanview-base/expected_mir_dump.overflow/overflow.might_overflow.-------.InstrumentCoverage.0.html new file mode 100644 index 000000000000..44fabaf0d7d2 --- /dev/null +++ b/src/test/run-make-fulldeps/coverage-spanview-base/expected_mir_dump.overflow/overflow.might_overflow.-------.InstrumentCoverage.0.html @@ -0,0 +1,397 @@ + + + + +overflow.might_overflow - Coverage Spans + + + +
fn might_overflow(to_add: u32) -> u32 { + if @0⦊to_add > 5⦉@0 @1,3,4,5⦊{ + println!("this will probably overflow"); + }⦉@1,3,4,5@2⦊⦉@2 + let @6,7,8,9,10,11,12,13,14⦊add_to = u32::MAX - 5; + println!("does {} + {} overflow?", add_to, to_add); + let result = to_add + add_to; + println!("continuing after overflow check"); + result +}⦉@6,7,8,9,10,11,12,13,14
+ + diff --git a/src/test/run-make-fulldeps/coverage-spanview-base/expected_mir_dump.panic_unwind/panic_unwind.main.-------.InstrumentCoverage.0.html b/src/test/run-make-fulldeps/coverage-spanview-base/expected_mir_dump.panic_unwind/panic_unwind.main.-------.InstrumentCoverage.0.html new file mode 100644 index 000000000000..4a44ca0a97bf --- /dev/null +++ b/src/test/run-make-fulldeps/coverage-spanview-base/expected_mir_dump.panic_unwind/panic_unwind.main.-------.InstrumentCoverage.0.html @@ -0,0 +1,103 @@ + + + + +panic_unwind.main - Coverage Spans + + + +
fn main() -> Result<(),u8> { + let @0⦊mut countdown = 10⦉@0; + while @1,2⦊countdown > 0⦉@1,2 { + if @3,5⦊countdown == 1⦉@3,5 @6,8,9⦊{ + might_panic(true); + }⦉@6,8,9 else if @7⦊countdown < 5⦉@7 @10,12,13⦊{ + might_panic(false); + }⦉@10,12,13@11⦊⦉@11@14⦊⦉@14 + @15,16⦊countdown -= 1⦉@15,16; + } + @4⦊Ok(()) +}⦉@4
+ + diff --git a/src/test/run-make-fulldeps/coverage-spanview-base/expected_mir_dump.panic_unwind/panic_unwind.might_panic.-------.InstrumentCoverage.0.html b/src/test/run-make-fulldeps/coverage-spanview-base/expected_mir_dump.panic_unwind/panic_unwind.might_panic.-------.InstrumentCoverage.0.html new file mode 100644 index 000000000000..b209ea9eee98 --- /dev/null +++ b/src/test/run-make-fulldeps/coverage-spanview-base/expected_mir_dump.panic_unwind/panic_unwind.might_panic.-------.InstrumentCoverage.0.html @@ -0,0 +1,164 @@ + + + + +panic_unwind.might_panic - Coverage Spans + + + +
fn might_panic(should_panic: bool) { + if @0⦊should_panic⦉@0 { + @1,3,4,5⦊println!("panicking..."); + panic!("panics");⦉@1,3,4,5 + } else @2,6,7⦊{ + println!("Don't Panic"); + } +}⦉@2,6,7
+ + diff --git a/src/test/run-make-fulldeps/coverage-spanview-base/expected_mir_dump.simple_loop/simple_loop.main.-------.InstrumentCoverage.0.html b/src/test/run-make-fulldeps/coverage-spanview-base/expected_mir_dump.simple_loop/simple_loop.main.-------.InstrumentCoverage.0.html index 914e829faa0b..bc3e67b8c990 100644 --- a/src/test/run-make-fulldeps/coverage-spanview-base/expected_mir_dump.simple_loop/simple_loop.main.-------.InstrumentCoverage.0.html +++ b/src/test/run-make-fulldeps/coverage-spanview-base/expected_mir_dump.simple_loop/simple_loop.main.-------.InstrumentCoverage.0.html @@ -133,9 +133,12 @@ For revisions in Pull Requests (PR): @10,12⦊break⦉@10,12 ; } - @13⦊countdown - -= - 1⦉@13 + @11,13⦊countdown + -= + 1⦉@11,13 ; }@7⦊⦉@7 }@10,12⦊⦉@10,12 diff --git a/src/test/run-make-fulldeps/coverage-spanview-base/expected_mir_dump.try_error_result/try_error_result.main.-------.InstrumentCoverage.0.html b/src/test/run-make-fulldeps/coverage-spanview-base/expected_mir_dump.try_error_result/try_error_result.main.-------.InstrumentCoverage.0.html index 5c9baee5d805..23b354998467 100644 --- a/src/test/run-make-fulldeps/coverage-spanview-base/expected_mir_dump.try_error_result/try_error_result.main.-------.InstrumentCoverage.0.html +++ b/src/test/run-make-fulldeps/coverage-spanview-base/expected_mir_dump.try_error_result/try_error_result.main.-------.InstrumentCoverage.0.html @@ -79,33 +79,38 @@ For revisions in Pull Requests (PR): @6,8⦊_⦉@6,8 +17:9-17:10: @8[5]: _8 = const ()">@6,8,9⦊_⦉@6,8,9
in @2,3,4⦊0..10⦉@2,3,4 { - @9⦊countdown -@6,8,9⦊countdown + -= 1 - ; - if - countdown < 5⦉@9 +25:13-25:26: @9[6]: FakeRead(ForMatchedPlace, _18)"> countdown < 5⦉@6,8,9 { @10,12,13,14⦊call(/*return_error=*/ true)⦉@10,12,13,14 } ; } - @12⦊countdown - -= - 1⦉@12 + @7,12⦊countdown + -= + 1⦉@7,12 ; } + + +yield.main-{closure#0} - Coverage Spans + + + +
|| { + @0⦊yield 1⦉@0; + return @1⦊"foo" + }⦉@1
+ + diff --git a/src/test/run-make-fulldeps/coverage-spanview-base/expected_mir_dump.yield/yield.main-{closure#1}.-------.InstrumentCoverage.0.html b/src/test/run-make-fulldeps/coverage-spanview-base/expected_mir_dump.yield/yield.main-{closure#1}.-------.InstrumentCoverage.0.html new file mode 100644 index 000000000000..00b2b35f3ddc --- /dev/null +++ b/src/test/run-make-fulldeps/coverage-spanview-base/expected_mir_dump.yield/yield.main-{closure#1}.-------.InstrumentCoverage.0.html @@ -0,0 +1,81 @@ + + + + +yield.main-{closure#1} - Coverage Spans + + + +
|| { + @0⦊yield 1⦉@0; + @1⦊yield 2⦉@1; + @2⦊yield 3⦉@2; + return @3⦊"foo" + }⦉@3
+ + diff --git a/src/test/run-make-fulldeps/coverage-spanview-base/expected_mir_dump.yield/yield.main.-------.InstrumentCoverage.0.html b/src/test/run-make-fulldeps/coverage-spanview-base/expected_mir_dump.yield/yield.main.-------.InstrumentCoverage.0.html new file mode 100644 index 000000000000..f5ea50692bfd --- /dev/null +++ b/src/test/run-make-fulldeps/coverage-spanview-base/expected_mir_dump.yield/yield.main.-------.InstrumentCoverage.0.html @@ -0,0 +1,138 @@ + + + + +yield.main - Coverage Spans + + + +
fn main() { + let @0,1,2⦊mut generator⦉@0,1,2 = || { + yield 1; + return "foo" + }; + + match @0,1,2⦊Pin::new(&mut generator).resume(()) { + GeneratorState::Yielded(1)⦉@0,1,2 => @4,6,7,8⦊{}⦉@4,6,7,8 + _ => @5⦊panic!("unexpected value from resume")⦉@5, + } + match @4,6,7,8⦊Pin::new(&mut generator).resume(())⦉@4,6,7,8 { + GeneratorState::Complete(@10,11⦊"foo"⦉@10,11) => @12,13,14,15⦊{}⦉@12,13,14,15 + _ => @9⦊panic!("unexpected value from resume")⦉@9, + } + + let @12,13,14,15⦊mut generator⦉@12,13,14,15 = || { + yield 1; + yield 2; + yield 3; + return "foo" + }; + + match @12,13,14,15⦊Pin::new(&mut generator).resume(()) { + GeneratorState::Yielded(1)⦉@12,13,14,15 => @17,19,20,21⦊{}⦉@17,19,20,21 + _ => @18⦊panic!("unexpected value from resume")⦉@18, + } + match @17,19,20,21⦊Pin::new(&mut generator).resume(()) { + GeneratorState::Yielded(2)⦉@17,19,20,21 => @23,25⦊{}⦉@23,25 + _ => @24⦊panic!("unexpected value from resume")⦉@24, + } +}@23,25⦊⦉@23,25
+ + diff --git a/src/test/run-make-fulldeps/coverage-spanview-deadcode/expected_mir_dump.abort/abort.main.-------.InstrumentCoverage.0.html b/src/test/run-make-fulldeps/coverage-spanview-deadcode/expected_mir_dump.abort/abort.main.-------.InstrumentCoverage.0.html new file mode 100644 index 000000000000..a8227cffc60f --- /dev/null +++ b/src/test/run-make-fulldeps/coverage-spanview-deadcode/expected_mir_dump.abort/abort.main.-------.InstrumentCoverage.0.html @@ -0,0 +1,99 @@ + + + + +abort.main - Coverage Spans + + + +
fn main() -> Result<(),u8> { + let @0⦊mut countdown = 10⦉@0; + while @1,2⦊countdown > 0⦉@1,2 { + if @3,5⦊countdown < 5⦉@3,5 @6,8,9⦊{ + might_abort(false); + }⦉@6,8,9@7⦊⦉@7 + @10,11⦊countdown -= 1⦉@10,11; + } + @4⦊Ok(()) +}⦉@4
+ + diff --git a/src/test/run-make-fulldeps/coverage-spanview-deadcode/expected_mir_dump.abort/abort.might_abort.-------.InstrumentCoverage.0.html b/src/test/run-make-fulldeps/coverage-spanview-deadcode/expected_mir_dump.abort/abort.might_abort.-------.InstrumentCoverage.0.html new file mode 100644 index 000000000000..daef056a19aa --- /dev/null +++ b/src/test/run-make-fulldeps/coverage-spanview-deadcode/expected_mir_dump.abort/abort.might_abort.-------.InstrumentCoverage.0.html @@ -0,0 +1,164 @@ + + + + +abort.might_abort - Coverage Spans + + + +
fn might_abort(should_abort: bool) { + if @0⦊should_abort⦉@0 { + @1,3,4,5⦊println!("aborting..."); + panic!("panics and aborts");⦉@1,3,4,5 + } else @2,6,7⦊{ + println!("Don't Panic"); + } +}⦉@2,6,7
+ + diff --git a/src/test/run-make-fulldeps/coverage-spanview-deadcode/expected_mir_dump.assert/assert.main.-------.InstrumentCoverage.0.html b/src/test/run-make-fulldeps/coverage-spanview-deadcode/expected_mir_dump.assert/assert.main.-------.InstrumentCoverage.0.html new file mode 100644 index 000000000000..499825445ace --- /dev/null +++ b/src/test/run-make-fulldeps/coverage-spanview-deadcode/expected_mir_dump.assert/assert.main.-------.InstrumentCoverage.0.html @@ -0,0 +1,103 @@ + + + + +assert.main - Coverage Spans + + + +
fn main() -> Result<(),u8> { + let @0⦊mut countdown = 10⦉@0; + while @1,2⦊countdown > 0⦉@1,2 { + if @3,5⦊countdown == 1⦉@3,5 @6,8,9⦊{ + might_fail_assert(3); + }⦉@6,8,9 else if @7⦊countdown < 5⦉@7 @10,12,13⦊{ + might_fail_assert(2); + }⦉@10,12,13@11⦊⦉@11@14⦊⦉@14 + @15,16⦊countdown -= 1⦉@15,16; + } + @4⦊Ok(()) +}⦉@4
+ + diff --git a/src/test/run-make-fulldeps/coverage-spanview-deadcode/expected_mir_dump.assert/assert.might_fail_assert.-------.InstrumentCoverage.0.html b/src/test/run-make-fulldeps/coverage-spanview-deadcode/expected_mir_dump.assert/assert.might_fail_assert.-------.InstrumentCoverage.0.html new file mode 100644 index 000000000000..98be3485a417 --- /dev/null +++ b/src/test/run-make-fulldeps/coverage-spanview-deadcode/expected_mir_dump.assert/assert.might_fail_assert.-------.InstrumentCoverage.0.html @@ -0,0 +1,97 @@ + + + + +assert.might_fail_assert - Coverage Spans + + + +
fn might_fail_assert(one_plus_one: u32) { + @0,1,2,3,4⦊println!("does 1 + 1 = {}?", one_plus_one);⦉@0,1,2,3,4 + assert_eq!(@0,1,2,3,4⦊1 + 1⦉@0,1,2,3,4, one_plus_one, @5,7,8,9,10,11,12⦊"the argument was wrong"⦉@5,7,8,9,10,11,12); +}@6⦊⦉@6
+ + diff --git a/src/test/run-make-fulldeps/coverage-spanview-deadcode/expected_mir_dump.async/async.executor-block_on-VTABLE-{closure#0}.-------.InstrumentCoverage.0.html b/src/test/run-make-fulldeps/coverage-spanview-deadcode/expected_mir_dump.async/async.executor-block_on-VTABLE-{closure#0}.-------.InstrumentCoverage.0.html new file mode 100644 index 000000000000..31646f8ce81d --- /dev/null +++ b/src/test/run-make-fulldeps/coverage-spanview-deadcode/expected_mir_dump.async/async.executor-block_on-VTABLE-{closure#0}.-------.InstrumentCoverage.0.html @@ -0,0 +1,89 @@ + + + + +async.executor-block_on-VTABLE-{closure#0} - Coverage Spans + + + +
{ + @0,1,2,3⦊$crate::rt::begin_panic_fmt(&$crate::format_args!($fmt, $($arg)+))⦉@0,1,2,3 + }
+ + diff --git a/src/test/run-make-fulldeps/coverage-spanview-deadcode/expected_mir_dump.async/async.executor-block_on-VTABLE-{closure#1}.-------.InstrumentCoverage.0.html b/src/test/run-make-fulldeps/coverage-spanview-deadcode/expected_mir_dump.async/async.executor-block_on-VTABLE-{closure#1}.-------.InstrumentCoverage.0.html new file mode 100644 index 000000000000..ddc791f074fb --- /dev/null +++ b/src/test/run-make-fulldeps/coverage-spanview-deadcode/expected_mir_dump.async/async.executor-block_on-VTABLE-{closure#1}.-------.InstrumentCoverage.0.html @@ -0,0 +1,89 @@ + + + + +async.executor-block_on-VTABLE-{closure#1} - Coverage Spans + + + +
{ + @0,1,2,3⦊$crate::rt::begin_panic_fmt(&$crate::format_args!($fmt, $($arg)+))⦉@0,1,2,3 + }
+ + diff --git a/src/test/run-make-fulldeps/coverage-spanview-deadcode/expected_mir_dump.async/async.executor-block_on-VTABLE-{closure#2}.-------.InstrumentCoverage.0.html b/src/test/run-make-fulldeps/coverage-spanview-deadcode/expected_mir_dump.async/async.executor-block_on-VTABLE-{closure#2}.-------.InstrumentCoverage.0.html new file mode 100644 index 000000000000..709b87fc5019 --- /dev/null +++ b/src/test/run-make-fulldeps/coverage-spanview-deadcode/expected_mir_dump.async/async.executor-block_on-VTABLE-{closure#2}.-------.InstrumentCoverage.0.html @@ -0,0 +1,89 @@ + + + + +async.executor-block_on-VTABLE-{closure#2} - Coverage Spans + + + +
{ + @0,1,2,3⦊$crate::rt::begin_panic_fmt(&$crate::format_args!($fmt, $($arg)+))⦉@0,1,2,3 + }
+ + diff --git a/src/test/run-make-fulldeps/coverage-spanview-deadcode/expected_mir_dump.async/async.executor-block_on-VTABLE-{closure#3}.-------.InstrumentCoverage.0.html b/src/test/run-make-fulldeps/coverage-spanview-deadcode/expected_mir_dump.async/async.executor-block_on-VTABLE-{closure#3}.-------.InstrumentCoverage.0.html new file mode 100644 index 000000000000..abd2621481a3 --- /dev/null +++ b/src/test/run-make-fulldeps/coverage-spanview-deadcode/expected_mir_dump.async/async.executor-block_on-VTABLE-{closure#3}.-------.InstrumentCoverage.0.html @@ -0,0 +1,75 @@ + + + + +async.executor-block_on-VTABLE-{closure#3} - Coverage Spans + + + +
|_| @0⦊()⦉@0
+ + diff --git a/src/test/run-make-fulldeps/coverage-spanview-deadcode/expected_mir_dump.async/async.executor-block_on.-------.InstrumentCoverage.0.html b/src/test/run-make-fulldeps/coverage-spanview-deadcode/expected_mir_dump.async/async.executor-block_on.-------.InstrumentCoverage.0.html new file mode 100644 index 000000000000..9d71d8ccc6e0 --- /dev/null +++ b/src/test/run-make-fulldeps/coverage-spanview-deadcode/expected_mir_dump.async/async.executor-block_on.-------.InstrumentCoverage.0.html @@ -0,0 +1,226 @@ + + + + +async.executor-block_on - Coverage Spans + + + +
pub fn block_on<F: Future>(mut future: F) -> F::Output { + let @0,1,2,3,4,5⦊mut future = unsafe { Pin::new_unchecked(&mut future) }; + + static VTABLE: RawWakerVTable = RawWakerVTable::new( + |_| unimplemented!("clone"), + |_| unimplemented!("wake"), + |_| unimplemented!("wake_by_ref"), + |_| (), + ); + let waker = unsafe { Waker::from_raw(RawWaker::new(core::ptr::null(), &VTABLE)) }; + let mut context = Context::from_waker(&waker)⦉@0,1,2,3,4,5; + + loop { + if let Poll::Ready(@10,12,14,15,16,17⦊val⦉@10,12,14,15,16,17) = @6,7,8,9⦊future.as_mut().poll(&mut context)⦉@6,7,8,9 { + break @10,12,14,15,16,17⦊val⦉@10,12,14,15,16,17; + } + }@11,13⦊⦉@11,13 + }@10,12,14,15,16,17⦊⦉@10,12,14,15,16,17
+ + diff --git a/src/test/run-make-fulldeps/coverage-spanview-deadcode/expected_mir_dump.async/async.f-{closure#0}.-------.InstrumentCoverage.0.html b/src/test/run-make-fulldeps/coverage-spanview-deadcode/expected_mir_dump.async/async.f-{closure#0}.-------.InstrumentCoverage.0.html new file mode 100644 index 000000000000..779f67fd7c10 --- /dev/null +++ b/src/test/run-make-fulldeps/coverage-spanview-deadcode/expected_mir_dump.async/async.f-{closure#0}.-------.InstrumentCoverage.0.html @@ -0,0 +1,75 @@ + + + + +async.f-{closure#0} - Coverage Spans + + + +
{ @0⦊1 }⦉@0
+ + diff --git a/src/test/run-make-fulldeps/coverage-spanview-deadcode/expected_mir_dump.async/async.f.-------.InstrumentCoverage.0.html b/src/test/run-make-fulldeps/coverage-spanview-deadcode/expected_mir_dump.async/async.f.-------.InstrumentCoverage.0.html new file mode 100644 index 000000000000..050ae67efc98 --- /dev/null +++ b/src/test/run-make-fulldeps/coverage-spanview-deadcode/expected_mir_dump.async/async.f.-------.InstrumentCoverage.0.html @@ -0,0 +1,74 @@ + + + + +async.f - Coverage Spans + + + +
async fn f() -> u8 { 1 }@0,1⦊⦉@0,1
+ + diff --git a/src/test/run-make-fulldeps/coverage-spanview-deadcode/expected_mir_dump.async/async.foo-{closure#0}.-------.InstrumentCoverage.0.html b/src/test/run-make-fulldeps/coverage-spanview-deadcode/expected_mir_dump.async/async.foo-{closure#0}.-------.InstrumentCoverage.0.html new file mode 100644 index 000000000000..d176a607d3b5 --- /dev/null +++ b/src/test/run-make-fulldeps/coverage-spanview-deadcode/expected_mir_dump.async/async.foo-{closure#0}.-------.InstrumentCoverage.0.html @@ -0,0 +1,75 @@ + + + + +async.foo-{closure#0} - Coverage Spans + + + +
{ @0⦊[false; 10] }⦉@0
+ + diff --git a/src/test/run-make-fulldeps/coverage-spanview-deadcode/expected_mir_dump.async/async.foo.-------.InstrumentCoverage.0.html b/src/test/run-make-fulldeps/coverage-spanview-deadcode/expected_mir_dump.async/async.foo.-------.InstrumentCoverage.0.html new file mode 100644 index 000000000000..64eeaefa8946 --- /dev/null +++ b/src/test/run-make-fulldeps/coverage-spanview-deadcode/expected_mir_dump.async/async.foo.-------.InstrumentCoverage.0.html @@ -0,0 +1,74 @@ + + + + +async.foo - Coverage Spans + + + +
async fn foo() -> [bool; 10] { [false; 10] }@0,1⦊⦉@0,1
+ + diff --git a/src/test/run-make-fulldeps/coverage-spanview-deadcode/expected_mir_dump.async/async.g-{closure#0}.-------.InstrumentCoverage.0.html b/src/test/run-make-fulldeps/coverage-spanview-deadcode/expected_mir_dump.async/async.g-{closure#0}.-------.InstrumentCoverage.0.html new file mode 100644 index 000000000000..4e894eecd16a --- /dev/null +++ b/src/test/run-make-fulldeps/coverage-spanview-deadcode/expected_mir_dump.async/async.g-{closure#0}.-------.InstrumentCoverage.0.html @@ -0,0 +1,80 @@ + + + + +async.g-{closure#0} - Coverage Spans + + + +
@0,2,3⦊{ + match x⦉@0,2,3 { + @16⦊y⦉@16 if @0,2,3⦊f()⦉@0,2,3.await == @9,12,14,15⦊y⦉@9,12,14,15@17⦊⦉@17 => @16⦊()⦉@16, + _ => @1⦊()⦉@1, + } +}@18,19⦊⦉@18,19
+ + diff --git a/src/test/run-make-fulldeps/coverage-spanview-deadcode/expected_mir_dump.async/async.g.-------.InstrumentCoverage.0.html b/src/test/run-make-fulldeps/coverage-spanview-deadcode/expected_mir_dump.async/async.g.-------.InstrumentCoverage.0.html new file mode 100644 index 000000000000..4788562a9d4f --- /dev/null +++ b/src/test/run-make-fulldeps/coverage-spanview-deadcode/expected_mir_dump.async/async.g.-------.InstrumentCoverage.0.html @@ -0,0 +1,79 @@ + + + + +async.g - Coverage Spans + + + +
pub async fn g(x: u8) { + match x { + y if f().await == y => (), + _ => (), + } +}@0,1⦊⦉@0,1
+ + diff --git a/src/test/run-make-fulldeps/coverage-spanview-deadcode/expected_mir_dump.async/async.h-{closure#0}.-------.InstrumentCoverage.0.html b/src/test/run-make-fulldeps/coverage-spanview-deadcode/expected_mir_dump.async/async.h-{closure#0}.-------.InstrumentCoverage.0.html new file mode 100644 index 000000000000..de48232efde6 --- /dev/null +++ b/src/test/run-make-fulldeps/coverage-spanview-deadcode/expected_mir_dump.async/async.h-{closure#0}.-------.InstrumentCoverage.0.html @@ -0,0 +1,80 @@ + + + + +async.h-{closure#0} - Coverage Spans + + + +
@0,2,3⦊{ + match x⦉@0,2,3 { + @17⦊y⦉@17 if @0,2,3⦊foo()⦉@0,2,3.await[@9,12,14,15,16⦊y⦉@9,12,14,15,16]@18⦊⦉@18 => @17⦊()⦉@17, + _ => @1⦊()⦉@1, + } +}@19,20⦊⦉@19,20
+ + diff --git a/src/test/run-make-fulldeps/coverage-spanview-deadcode/expected_mir_dump.async/async.h.-------.InstrumentCoverage.0.html b/src/test/run-make-fulldeps/coverage-spanview-deadcode/expected_mir_dump.async/async.h.-------.InstrumentCoverage.0.html new file mode 100644 index 000000000000..83b0a3e0d43a --- /dev/null +++ b/src/test/run-make-fulldeps/coverage-spanview-deadcode/expected_mir_dump.async/async.h.-------.InstrumentCoverage.0.html @@ -0,0 +1,79 @@ + + + + +async.h - Coverage Spans + + + +
async fn h(x: usize) { + match x { + y if foo().await[y] => (), + _ => (), + } +}@0,1⦊⦉@0,1
+ + diff --git a/src/test/run-make-fulldeps/coverage-spanview-deadcode/expected_mir_dump.async/async.i-{closure#0}.-------.InstrumentCoverage.0.html b/src/test/run-make-fulldeps/coverage-spanview-deadcode/expected_mir_dump.async/async.i-{closure#0}.-------.InstrumentCoverage.0.html new file mode 100644 index 000000000000..71397d396253 --- /dev/null +++ b/src/test/run-make-fulldeps/coverage-spanview-deadcode/expected_mir_dump.async/async.i-{closure#0}.-------.InstrumentCoverage.0.html @@ -0,0 +1,82 @@ + + + + +async.i-{closure#0} - Coverage Spans + + + +
@0,2,3⦊{ + match x⦉@0,2,3 { + @17⦊y⦉@17 if @0,2,3⦊f()⦉@0,2,3.await == @9,12,14,15,16⦊y + 1⦉@9,12,14,15,16@18⦊⦉@18 => @17⦊()⦉@17, + _ => @1⦊()⦉@1, + } +}@19,20⦊⦉@19,20
+ + diff --git a/src/test/run-make-fulldeps/coverage-spanview-deadcode/expected_mir_dump.async/async.i.-------.InstrumentCoverage.0.html b/src/test/run-make-fulldeps/coverage-spanview-deadcode/expected_mir_dump.async/async.i.-------.InstrumentCoverage.0.html new file mode 100644 index 000000000000..55efca744817 --- /dev/null +++ b/src/test/run-make-fulldeps/coverage-spanview-deadcode/expected_mir_dump.async/async.i.-------.InstrumentCoverage.0.html @@ -0,0 +1,79 @@ + + + + +async.i - Coverage Spans + + + +
async fn i(x: u8) { + match x { + y if f().await == y + 1 => (), + _ => (), + } +}@0,1⦊⦉@0,1
+ + diff --git a/src/test/run-make-fulldeps/coverage-spanview-deadcode/expected_mir_dump.async/async.main.-------.InstrumentCoverage.0.html b/src/test/run-make-fulldeps/coverage-spanview-deadcode/expected_mir_dump.async/async.main.-------.InstrumentCoverage.0.html new file mode 100644 index 000000000000..2f14339d9e95 --- /dev/null +++ b/src/test/run-make-fulldeps/coverage-spanview-deadcode/expected_mir_dump.async/async.main.-------.InstrumentCoverage.0.html @@ -0,0 +1,133 @@ + + + + +async.main - Coverage Spans + + + +
fn main() @0,1,2,3,4,5,6,7,8,9⦊{ + let _ = g(10); + let _ = h(9); + let mut future = Box::pin(i(8)); + executor::block_on(future.as_mut()); +}⦉@0,1,2,3,4,5,6,7,8,9
+ + diff --git a/src/test/run-make-fulldeps/coverage-spanview-deadcode/expected_mir_dump.conditions/conditions.main.-------.InstrumentCoverage.0.html b/src/test/run-make-fulldeps/coverage-spanview-deadcode/expected_mir_dump.conditions/conditions.main.-------.InstrumentCoverage.0.html index cda1040c2911..09adc12cefdb 100644 --- a/src/test/run-make-fulldeps/coverage-spanview-deadcode/expected_mir_dump.conditions/conditions.main.-------.InstrumentCoverage.0.html +++ b/src/test/run-make-fulldeps/coverage-spanview-deadcode/expected_mir_dump.conditions/conditions.main.-------.InstrumentCoverage.0.html @@ -87,10 +87,12 @@ For revisions in Pull Requests (PR): let @25⦊x⦉@25 = if @4⦊countdown > 7⦉@4 { - @8⦊countdown -= 4; - B⦉@8 + @5,7,8⦊countdown -= 4; + B⦉@5,7,8 } else if @6⦊countdown > 2⦉@6 { @@ -106,10 +108,12 @@ For revisions in Pull Requests (PR): }⦉@20,22@21⦊⦉@21
- @24⦊countdown -= 5; - countdown⦉@24 + @23,24⦊countdown -= 5; + countdown⦉@23,24 } else { @10⦊return⦉@10; }; @@ -129,9 +133,15 @@ For revisions in Pull Requests (PR): if @29⦊countdown > 7⦉@29 { - @33⦊countdown -= 4⦉@33; - } else if @29⦊countdown > 7⦉@29 @30,32,33⦊{ + countdown -= 4; + }⦉@30,32,33 else if @31⦊countdown > 2⦉@31 { if }⦉@45,47@46⦊⦉@46 - @49⦊countdown -= 5⦉@49; + @48,49⦊countdown -= 5⦉@48,49; } else { @35⦊return⦉@35; } - let @50⦊mut countdown = 0⦉@50; - if @50⦊true⦉@50 @51,53⦊{ - countdown = 1; - }⦉@51,53@52⦊⦉@52 + if @50⦊true⦉@50 { + // Demonstrate the difference with `TerminatorKind::Assert` as of 2020-11-15. Assert is no + // longer treated as a `BasicCoverageBlock` terminator, which changed the coverage region, + // for the executed `then` block above, to include the closing brace on line 30. That + // changed the line count, but the coverage code region (for the `else if` condition) is + // still valid. + // + // Note that `if` (then) and `else` blocks include the closing brace in their coverage + // code regions when the last line in the block ends in a semicolon, because the Rust + // compiler inserts a `StatementKind::Assign` to assign `const ()` to a `Place`, for the + // empty value for the executed block. When the last line does not end in a semicolon + // (that is, when the block actually results in a value), the additional `Assign` is not + // generated, and the brace is not included. + let @51,53⦊mut countdown = 0⦉@51,53; + if @51,53⦊true⦉@51,53 @54,56⦊{ + countdown = 10; + }⦉@54,56@55⦊⦉@55 - let @77⦊z⦉@77 = if @54⦊countdown > 7⦉@54 { - @58⦊countdown -= 4⦉@58; - } else if @56⦊countdown > 2⦉@56 { - if @59,61⦊countdown < 1⦉@59,61 || @68⦊countdown > 5⦉@68@66⦊⦉@66@67⦊⦉@67 || @64⦊countdown != 9⦉@64@62⦊⦉@62@63⦊⦉@63 @70,72⦊{ - countdown = 0; - }⦉@70,72@71⦊⦉@71 - @74⦊countdown -= 5⦉@74; + if @57⦊countdown > 7⦉@57 @58,60,61⦊{ + countdown -= 4; + }⦉@58,60,61 + // The closing brace of the `then` branch is now included in the coverage region, and shown + // as "executed" (giving its line a count of 1 here). Since, in the original version above, + // the closing brace shares the same line as the `else if` conditional expression (which is + // not executed if the first `then` condition is true), only the condition's code region is + // marked with a count of 0 now. + else if @59⦊countdown > 2⦉@59 { + if @62,64⦊countdown < 1⦉@62,64 || @71⦊countdown > 5⦉@71@69⦊⦉@69@70⦊⦉@70 || @67⦊countdown != 9⦉@67@65⦊⦉@65@66⦊⦉@66 @73,75⦊{ + countdown = 0; + }⦉@73,75@74⦊⦉@74 + @76,77⦊countdown -= 5⦉@76,77; + } else { + @63⦊return⦉@63; + } + }@78⦊⦉@78@52⦊⦉@52 + + let @79⦊mut countdown = 0⦉@79; + if @79⦊true⦉@79 @80,82⦊{ + countdown = 1; + }⦉@80,82@81⦊⦉@81 + + let @106⦊z⦉@106 = if @83⦊countdown > 7⦉@83 @84,86,87⦊{ + countdown -= 4; + }⦉@84,86,87 else if @85⦊countdown > 2⦉@85 { + if @88,90⦊countdown < 1⦉@88,90 || @97⦊countdown > 5⦉@97@95⦊⦉@95@96⦊⦉@96 || @93⦊countdown != 9⦉@93@91⦊⦉@91@92⦊⦉@92 @99,101⦊{ + countdown = 0; + }⦉@99,101@100⦊⦉@100 + @102,103⦊countdown -= 5⦉@102,103; } else { - let @60,75,76⦊should_be_reachable = countdown; - println!("reached"); - return⦉@60,75,76; + let @89,104,105⦊should_be_reachable = countdown; + println!("reached"); + return⦉@89,104,105; }; - let @98⦊w⦉@98 = if @77⦊countdown > 7⦉@77 { - @81⦊countdown -= 4⦉@81; - } else if @79⦊countdown > 2⦉@79 { - if @82,84⦊countdown < 1⦉@82,84 || @91⦊countdown > 5⦉@91@89⦊⦉@89@90⦊⦉@90 || @87⦊countdown != 9⦉@87@85⦊⦉@85@86⦊⦉@86 @93,95⦊{ - countdown = 0; - }⦉@93,95@94⦊⦉@94 - @97⦊countdown -= 5⦉@97; + let @127⦊w⦉@127 = if @106⦊countdown > 7⦉@106 @107,109,110⦊{ + countdown -= 4; + }⦉@107,109,110 else if @108⦊countdown > 2⦉@108 { + if @111,113⦊countdown < 1⦉@111,113 || @120⦊countdown > 5⦉@120@118⦊⦉@118@119⦊⦉@119 || @116⦊countdown != 9⦉@116@114⦊⦉@114@115⦊⦉@115 @122,124⦊{ + countdown = 0; + }⦉@122,124@123⦊⦉@123 + @125,126⦊countdown -= 5⦉@125,126; } else { - @83⦊return⦉@83; + @112⦊return⦉@112; }; -}@101⦊⦉@101@102⦊⦉@102 +}@130⦊⦉@130@131⦊⦉@131 diff --git a/src/test/run-make-fulldeps/coverage-spanview-deadcode/expected_mir_dump.inner_items/inner_items.main-in_func.-------.InstrumentCoverage.0.html b/src/test/run-make-fulldeps/coverage-spanview-deadcode/expected_mir_dump.inner_items/inner_items.main-in_func.-------.InstrumentCoverage.0.html index 31bb57be81b5..fc9f54143ed2 100644 --- a/src/test/run-make-fulldeps/coverage-spanview-deadcode/expected_mir_dump.inner_items/inner_items.main-in_func.-------.InstrumentCoverage.0.html +++ b/src/test/run-make-fulldeps/coverage-spanview-deadcode/expected_mir_dump.inner_items/inner_items.main-in_func.-------.InstrumentCoverage.0.html @@ -71,10 +71,13 @@ For revisions in Pull Requests (PR):
fn in_func(a: u32) { let @0⦊b = 1⦉@0; - let @1,2,3,4⦊c⦉@1,2,3,4 = @0⦊a + b⦉@0; - @1,2,3,4⦊println!("c = {}", c) -@0,1,2,3,4⦊b = 1; + }⦉@1,2,3,4
+22:6-22:6: @4.Return: return"> let c = a + b;
+ println!("c = {}", c) + }⦉@0,1,2,3,4
diff --git a/src/test/run-make-fulldeps/coverage-spanview-deadcode/expected_mir_dump.inner_items/inner_items.main-{impl#0}-trait_func.-------.InstrumentCoverage.0.html b/src/test/run-make-fulldeps/coverage-spanview-deadcode/expected_mir_dump.inner_items/inner_items.main-{impl#0}-trait_func.-------.InstrumentCoverage.0.html index 6c4ce72305e5..325d4483223b 100644 --- a/src/test/run-make-fulldeps/coverage-spanview-deadcode/expected_mir_dump.inner_items/inner_items.main-{impl#0}-trait_func.-------.InstrumentCoverage.0.html +++ b/src/test/run-make-fulldeps/coverage-spanview-deadcode/expected_mir_dump.inner_items/inner_items.main-{impl#0}-trait_func.-------.InstrumentCoverage.0.html @@ -69,13 +69,33 @@ For revisions in Pull Requests (PR): -
fn trait_func(&mut self, incr: u32) { - self.in_struct_field += @0⦊incr⦉@0; - fn trait_func(&mut self, incr: u32) @1,2⦊in_func(self.in_struct_field); -@0,1,2⦊{ + }⦉@1,2
+40:45-43:10: @2[2]: _0 = const () +43:10-43:10: @2.Return: return"> self.in_struct_field += incr;
+ in_func(self.in_struct_field); + }⦉@0,1,2
diff --git a/src/test/run-make-fulldeps/coverage-spanview-deadcode/expected_mir_dump.nested_loops/nested_loops.main.-------.InstrumentCoverage.0.html b/src/test/run-make-fulldeps/coverage-spanview-deadcode/expected_mir_dump.nested_loops/nested_loops.main.-------.InstrumentCoverage.0.html index 7fbda5d0b3d2..509a949cfcf5 100644 --- a/src/test/run-make-fulldeps/coverage-spanview-deadcode/expected_mir_dump.nested_loops/nested_loops.main.-------.InstrumentCoverage.0.html +++ b/src/test/run-make-fulldeps/coverage-spanview-deadcode/expected_mir_dump.nested_loops/nested_loops.main.-------.InstrumentCoverage.0.html @@ -108,28 +108,46 @@ For revisions in Pull Requests (PR): 9:16-9:22: @16[18]: FakeRead(ForMatchedPlace, _26)">@14,16⦊a < 30⦉@14,16
{ @17,19⦊break⦉@17,19; } - @20⦊a -= 5⦉@20; - @21⦊b -= 5⦉@21; - if @18,20,21⦊a -= 5; + b -= 5⦉@18,20,21; + if @21⦊b < 90⦉@21 { - @18,20,21⦊b < 90⦉@18,20,21 { + @25⦊a -= 10; -@22,24,25⦊a -= 10; + if is_true⦉@25 { - @26,28⦊break 'outer⦉@26,28; - } else { - @29⦊a -= 2; - if is_true⦉@22,24,25 { + @26,28⦊break 'outer⦉@26,28; + } else @27,29⦊{ + a -= 2; + } - }⦉@29@23⦊⦉@23 - }@30⦊⦉@30 - @32⦊countdown -= 1⦉@32; - }@7⦊⦉@7 -}@33⦊⦉@33 + }⦉@27,29@23⦊⦉@23 + }@30⦊⦉@30 + @31,32⦊countdown -= 1⦉@31,32; + }@7⦊⦉@7 +}@33⦊⦉@33 diff --git a/src/test/run-make-fulldeps/coverage-spanview-deadcode/expected_mir_dump.overflow/overflow.main.-------.InstrumentCoverage.0.html b/src/test/run-make-fulldeps/coverage-spanview-deadcode/expected_mir_dump.overflow/overflow.main.-------.InstrumentCoverage.0.html new file mode 100644 index 000000000000..2be6bad619ed --- /dev/null +++ b/src/test/run-make-fulldeps/coverage-spanview-deadcode/expected_mir_dump.overflow/overflow.main.-------.InstrumentCoverage.0.html @@ -0,0 +1,259 @@ + + + + +overflow.main - Coverage Spans + + + +
fn main() -> Result<(),u8> { + let @0⦊mut countdown = 10⦉@0; + while @1,2⦊countdown > 0⦉@1,2 { + if @3,5⦊countdown == 1⦉@3,5 @6,8,9,10,11,12⦊{ + let result = might_overflow(10); + println!("Result: {}", result); + }⦉@6,8,9,10,11,12 else if @7⦊countdown < 5⦉@7 @13,15,16,17,18,19⦊{ + let result = might_overflow(1); + println!("Result: {}", result); + }⦉@13,15,16,17,18,19@14⦊⦉@14@20⦊⦉@20 + @21,22⦊countdown -= 1⦉@21,22; + } + @4⦊Ok(()) +}⦉@4
+ + diff --git a/src/test/run-make-fulldeps/coverage-spanview-deadcode/expected_mir_dump.overflow/overflow.might_overflow.-------.InstrumentCoverage.0.html b/src/test/run-make-fulldeps/coverage-spanview-deadcode/expected_mir_dump.overflow/overflow.might_overflow.-------.InstrumentCoverage.0.html new file mode 100644 index 000000000000..44fabaf0d7d2 --- /dev/null +++ b/src/test/run-make-fulldeps/coverage-spanview-deadcode/expected_mir_dump.overflow/overflow.might_overflow.-------.InstrumentCoverage.0.html @@ -0,0 +1,397 @@ + + + + +overflow.might_overflow - Coverage Spans + + + +
fn might_overflow(to_add: u32) -> u32 { + if @0⦊to_add > 5⦉@0 @1,3,4,5⦊{ + println!("this will probably overflow"); + }⦉@1,3,4,5@2⦊⦉@2 + let @6,7,8,9,10,11,12,13,14⦊add_to = u32::MAX - 5; + println!("does {} + {} overflow?", add_to, to_add); + let result = to_add + add_to; + println!("continuing after overflow check"); + result +}⦉@6,7,8,9,10,11,12,13,14
+ + diff --git a/src/test/run-make-fulldeps/coverage-spanview-deadcode/expected_mir_dump.panic_unwind/panic_unwind.main.-------.InstrumentCoverage.0.html b/src/test/run-make-fulldeps/coverage-spanview-deadcode/expected_mir_dump.panic_unwind/panic_unwind.main.-------.InstrumentCoverage.0.html new file mode 100644 index 000000000000..4a44ca0a97bf --- /dev/null +++ b/src/test/run-make-fulldeps/coverage-spanview-deadcode/expected_mir_dump.panic_unwind/panic_unwind.main.-------.InstrumentCoverage.0.html @@ -0,0 +1,103 @@ + + + + +panic_unwind.main - Coverage Spans + + + +
fn main() -> Result<(),u8> { + let @0⦊mut countdown = 10⦉@0; + while @1,2⦊countdown > 0⦉@1,2 { + if @3,5⦊countdown == 1⦉@3,5 @6,8,9⦊{ + might_panic(true); + }⦉@6,8,9 else if @7⦊countdown < 5⦉@7 @10,12,13⦊{ + might_panic(false); + }⦉@10,12,13@11⦊⦉@11@14⦊⦉@14 + @15,16⦊countdown -= 1⦉@15,16; + } + @4⦊Ok(()) +}⦉@4
+ + diff --git a/src/test/run-make-fulldeps/coverage-spanview-deadcode/expected_mir_dump.panic_unwind/panic_unwind.might_panic.-------.InstrumentCoverage.0.html b/src/test/run-make-fulldeps/coverage-spanview-deadcode/expected_mir_dump.panic_unwind/panic_unwind.might_panic.-------.InstrumentCoverage.0.html new file mode 100644 index 000000000000..b209ea9eee98 --- /dev/null +++ b/src/test/run-make-fulldeps/coverage-spanview-deadcode/expected_mir_dump.panic_unwind/panic_unwind.might_panic.-------.InstrumentCoverage.0.html @@ -0,0 +1,164 @@ + + + + +panic_unwind.might_panic - Coverage Spans + + + +
fn might_panic(should_panic: bool) { + if @0⦊should_panic⦉@0 { + @1,3,4,5⦊println!("panicking..."); + panic!("panics");⦉@1,3,4,5 + } else @2,6,7⦊{ + println!("Don't Panic"); + } +}⦉@2,6,7
+ + diff --git a/src/test/run-make-fulldeps/coverage-spanview-deadcode/expected_mir_dump.simple_loop/simple_loop.main.-------.InstrumentCoverage.0.html b/src/test/run-make-fulldeps/coverage-spanview-deadcode/expected_mir_dump.simple_loop/simple_loop.main.-------.InstrumentCoverage.0.html index 914e829faa0b..bc3e67b8c990 100644 --- a/src/test/run-make-fulldeps/coverage-spanview-deadcode/expected_mir_dump.simple_loop/simple_loop.main.-------.InstrumentCoverage.0.html +++ b/src/test/run-make-fulldeps/coverage-spanview-deadcode/expected_mir_dump.simple_loop/simple_loop.main.-------.InstrumentCoverage.0.html @@ -133,9 +133,12 @@ For revisions in Pull Requests (PR): @10,12⦊break⦉@10,12 ; } - @13⦊countdown - -= - 1⦉@13 + @11,13⦊countdown + -= + 1⦉@11,13 ; }@7⦊⦉@7 }@10,12⦊⦉@10,12 diff --git a/src/test/run-make-fulldeps/coverage-spanview-deadcode/expected_mir_dump.try_error_result/try_error_result.main.-------.InstrumentCoverage.0.html b/src/test/run-make-fulldeps/coverage-spanview-deadcode/expected_mir_dump.try_error_result/try_error_result.main.-------.InstrumentCoverage.0.html index 5c9baee5d805..23b354998467 100644 --- a/src/test/run-make-fulldeps/coverage-spanview-deadcode/expected_mir_dump.try_error_result/try_error_result.main.-------.InstrumentCoverage.0.html +++ b/src/test/run-make-fulldeps/coverage-spanview-deadcode/expected_mir_dump.try_error_result/try_error_result.main.-------.InstrumentCoverage.0.html @@ -79,33 +79,38 @@ For revisions in Pull Requests (PR): @6,8⦊_⦉@6,8 +17:9-17:10: @8[5]: _8 = const ()">@6,8,9⦊_⦉@6,8,9
in @2,3,4⦊0..10⦉@2,3,4 { - @9⦊countdown -@6,8,9⦊countdown + -= 1 - ; - if - countdown < 5⦉@9 +25:13-25:26: @9[6]: FakeRead(ForMatchedPlace, _18)"> countdown < 5⦉@6,8,9 { @10,12,13,14⦊call(/*return_error=*/ true)⦉@10,12,13,14 } ; } - @12⦊countdown - -= - 1⦉@12 + @7,12⦊countdown + -= + 1⦉@7,12 ; } + + +yield.main-{closure#0} - Coverage Spans + + + +
|| { + @0⦊yield 1⦉@0; + return @1⦊"foo" + }⦉@1
+ + diff --git a/src/test/run-make-fulldeps/coverage-spanview-deadcode/expected_mir_dump.yield/yield.main-{closure#1}.-------.InstrumentCoverage.0.html b/src/test/run-make-fulldeps/coverage-spanview-deadcode/expected_mir_dump.yield/yield.main-{closure#1}.-------.InstrumentCoverage.0.html new file mode 100644 index 000000000000..00b2b35f3ddc --- /dev/null +++ b/src/test/run-make-fulldeps/coverage-spanview-deadcode/expected_mir_dump.yield/yield.main-{closure#1}.-------.InstrumentCoverage.0.html @@ -0,0 +1,81 @@ + + + + +yield.main-{closure#1} - Coverage Spans + + + +
|| { + @0⦊yield 1⦉@0; + @1⦊yield 2⦉@1; + @2⦊yield 3⦉@2; + return @3⦊"foo" + }⦉@3
+ + diff --git a/src/test/run-make-fulldeps/coverage-spanview-deadcode/expected_mir_dump.yield/yield.main.-------.InstrumentCoverage.0.html b/src/test/run-make-fulldeps/coverage-spanview-deadcode/expected_mir_dump.yield/yield.main.-------.InstrumentCoverage.0.html new file mode 100644 index 000000000000..f5ea50692bfd --- /dev/null +++ b/src/test/run-make-fulldeps/coverage-spanview-deadcode/expected_mir_dump.yield/yield.main.-------.InstrumentCoverage.0.html @@ -0,0 +1,138 @@ + + + + +yield.main - Coverage Spans + + + +
fn main() { + let @0,1,2⦊mut generator⦉@0,1,2 = || { + yield 1; + return "foo" + }; + + match @0,1,2⦊Pin::new(&mut generator).resume(()) { + GeneratorState::Yielded(1)⦉@0,1,2 => @4,6,7,8⦊{}⦉@4,6,7,8 + _ => @5⦊panic!("unexpected value from resume")⦉@5, + } + match @4,6,7,8⦊Pin::new(&mut generator).resume(())⦉@4,6,7,8 { + GeneratorState::Complete(@10,11⦊"foo"⦉@10,11) => @12,13,14,15⦊{}⦉@12,13,14,15 + _ => @9⦊panic!("unexpected value from resume")⦉@9, + } + + let @12,13,14,15⦊mut generator⦉@12,13,14,15 = || { + yield 1; + yield 2; + yield 3; + return "foo" + }; + + match @12,13,14,15⦊Pin::new(&mut generator).resume(()) { + GeneratorState::Yielded(1)⦉@12,13,14,15 => @17,19,20,21⦊{}⦉@17,19,20,21 + _ => @18⦊panic!("unexpected value from resume")⦉@18, + } + match @17,19,20,21⦊Pin::new(&mut generator).resume(()) { + GeneratorState::Yielded(2)⦉@17,19,20,21 => @23,25⦊{}⦉@23,25 + _ => @24⦊panic!("unexpected value from resume")⦉@24, + } +}@23,25⦊⦉@23,25
+ + diff --git a/src/test/run-make-fulldeps/coverage/abort.rs b/src/test/run-make-fulldeps/coverage/abort.rs new file mode 100644 index 000000000000..01c5c9205471 --- /dev/null +++ b/src/test/run-make-fulldeps/coverage/abort.rs @@ -0,0 +1,34 @@ +#![feature(unwind_attributes)] +#![allow(unused_assignments)] + +#[unwind(aborts)] +fn might_abort(should_abort: bool) { + if should_abort { + println!("aborting..."); + panic!("panics and aborts"); + } else { + println!("Don't Panic"); + } +} + +fn main() -> Result<(),u8> { + let mut countdown = 10; + while countdown > 0 { + if countdown < 5 { + might_abort(false); + } + countdown -= 1; + } + Ok(()) +} + +// Notes: +// 1. Compare this program and its coverage results to those of the similar tests +// `panic_unwind.rs` and `try_error_result.rs`. +// 2. This test confirms the coverage generated when a program includes `TerminatorKind::Abort`. +// 3. The test does not invoke the abort. By executing to a successful completion, the coverage +// results show where the program did and did not execute. +// 4. If the program actually aborted, the coverage counters would not be saved (which "works as +// intended"). Coverage results would show no executed coverage regions. +// 6. If `should_abort` is `true` and the program aborts, the program exits with a `132` status +// (on Linux at least). diff --git a/src/test/run-make-fulldeps/coverage/assert.rs b/src/test/run-make-fulldeps/coverage/assert.rs new file mode 100644 index 000000000000..c85f2748eb9d --- /dev/null +++ b/src/test/run-make-fulldeps/coverage/assert.rs @@ -0,0 +1,32 @@ +#![allow(unused_assignments)] +// expect-exit-status-101 + +fn might_fail_assert(one_plus_one: u32) { + println!("does 1 + 1 = {}?", one_plus_one); + assert_eq!(1 + 1, one_plus_one, "the argument was wrong"); +} + +fn main() -> Result<(),u8> { + let mut countdown = 10; + while countdown > 0 { + if countdown == 1 { + might_fail_assert(3); + } else if countdown < 5 { + might_fail_assert(2); + } + countdown -= 1; + } + Ok(()) +} + +// Notes: +// 1. Compare this program and its coverage results to those of the very similar test +// `panic_unwind.rs`, and similar tests `abort.rs` and `try_error_result.rs`. +// 2. This test confirms the coverage generated when a program passes or fails an `assert!()` or +// related `assert_*!()` macro. +// 3. Notably, the `assert` macros *do not* generate `TerminatorKind::Assert`. The macros produce +// conditional expressions, `TerminatorKind::SwitchInt` branches, and a possible call to +// `begin_panic_fmt()` (that begins a panic unwind, if the assertion test fails). +// 4. `TerminatoKind::Assert` is, however, also present in the MIR generated for this test +// (and in many other coverage tests). The `Assert` terminator is typically generated by the +// Rust compiler to check for runtime failures, such as numeric overflows. diff --git a/src/test/run-make-fulldeps/coverage/async.rs b/src/test/run-make-fulldeps/coverage/async.rs new file mode 100644 index 000000000000..f69b8dce8933 --- /dev/null +++ b/src/test/run-make-fulldeps/coverage/async.rs @@ -0,0 +1,64 @@ +#![allow(unused_assignments)] + +// require-rust-edition-2018 + +async fn f() -> u8 { 1 } + +async fn foo() -> [bool; 10] { [false; 10] } + +pub async fn g(x: u8) { + match x { + y if f().await == y => (), + _ => (), + } +} + +// #78366: check the reference to the binding is recorded even if the binding is not autorefed + +async fn h(x: usize) { + match x { + y if foo().await[y] => (), + _ => (), + } +} + +async fn i(x: u8) { + match x { + y if f().await == y + 1 => (), + _ => (), + } +} + +fn main() { + let _ = g(10); + let _ = h(9); + let mut future = Box::pin(i(8)); + executor::block_on(future.as_mut()); +} + +mod executor { + use core::{ + future::Future, + pin::Pin, + task::{Context, Poll, RawWaker, RawWakerVTable, Waker}, + }; + + pub fn block_on(mut future: F) -> F::Output { + let mut future = unsafe { Pin::new_unchecked(&mut future) }; + + static VTABLE: RawWakerVTable = RawWakerVTable::new( + |_| unimplemented!("clone"), + |_| unimplemented!("wake"), + |_| unimplemented!("wake_by_ref"), + |_| (), + ); + let waker = unsafe { Waker::from_raw(RawWaker::new(core::ptr::null(), &VTABLE)) }; + let mut context = Context::from_waker(&waker); + + loop { + if let Poll::Ready(val) = future.as_mut().poll(&mut context) { + break val; + } + } + } +} diff --git a/src/test/run-make-fulldeps/coverage/conditions.rs b/src/test/run-make-fulldeps/coverage/conditions.rs index da206e28f31d..1a8bafa50d46 100644 --- a/src/test/run-make-fulldeps/coverage/conditions.rs +++ b/src/test/run-make-fulldeps/coverage/conditions.rs @@ -36,6 +36,42 @@ fn main() { return; } + if true { + // Demonstrate the difference with `TerminatorKind::Assert` as of 2020-11-15. Assert is no + // longer treated as a `BasicCoverageBlock` terminator, which changed the coverage region, + // for the executed `then` block above, to include the closing brace on line 30. That + // changed the line count, but the coverage code region (for the `else if` condition) is + // still valid. + // + // Note that `if` (then) and `else` blocks include the closing brace in their coverage + // code regions when the last line in the block ends in a semicolon, because the Rust + // compiler inserts a `StatementKind::Assign` to assign `const ()` to a `Place`, for the + // empty value for the executed block. When the last line does not end in a semicolon + // (that is, when the block actually results in a value), the additional `Assign` is not + // generated, and the brace is not included. + let mut countdown = 0; + if true { + countdown = 10; + } + + if countdown > 7 { + countdown -= 4; + } + // The closing brace of the `then` branch is now included in the coverage region, and shown + // as "executed" (giving its line a count of 1 here). Since, in the original version above, + // the closing brace shares the same line as the `else if` conditional expression (which is + // not executed if the first `then` condition is true), only the condition's code region is + // marked with a count of 0 now. + else if countdown > 2 { + if countdown < 1 || countdown > 5 || countdown != 9 { + countdown = 0; + } + countdown -= 5; + } else { + return; + } + } + let mut countdown = 0; if true { countdown = 1; diff --git a/src/test/run-make-fulldeps/coverage/coverage_tools.mk b/src/test/run-make-fulldeps/coverage/coverage_tools.mk index 99a2e0ba9523..867a3566ac3a 100644 --- a/src/test/run-make-fulldeps/coverage/coverage_tools.mk +++ b/src/test/run-make-fulldeps/coverage/coverage_tools.mk @@ -44,8 +44,3 @@ LLVM_VERSION_11_PLUS := $(shell \ LLVM_VERSION=$$("$(LLVM_BIN_DIR)"/llvm-config --version) && \ LLVM_VERSION_MAJOR=$${LLVM_VERSION/.*/} && \ [ $$LLVM_VERSION_MAJOR -ge 11 ] && echo true || echo false) - -# FIXME(richkadel): Can any of the features tested by `run-make-fulldeps/coverage-*` tests be tested -# just as completely by more focused unit tests of the code logic itself, to reduce the number of -# test result files generated and maintained, and to help identify specific test failures and root -# causes more easily? diff --git a/src/test/run-make-fulldeps/coverage/overflow.rs b/src/test/run-make-fulldeps/coverage/overflow.rs new file mode 100644 index 000000000000..e537b0e95c32 --- /dev/null +++ b/src/test/run-make-fulldeps/coverage/overflow.rs @@ -0,0 +1,63 @@ +#![allow(unused_assignments)] +// expect-exit-status-101 + +fn might_overflow(to_add: u32) -> u32 { + if to_add > 5 { + println!("this will probably overflow"); + } + let add_to = u32::MAX - 5; + println!("does {} + {} overflow?", add_to, to_add); + let result = to_add + add_to; + println!("continuing after overflow check"); + result +} + +fn main() -> Result<(),u8> { + let mut countdown = 10; + while countdown > 0 { + if countdown == 1 { + let result = might_overflow(10); + println!("Result: {}", result); + } else if countdown < 5 { + let result = might_overflow(1); + println!("Result: {}", result); + } + countdown -= 1; + } + Ok(()) +} + +// Notes: +// 1. Compare this program and its coverage results to those of the very similar test `assert.rs`, +// and similar tests `panic_unwind.rs`, abort.rs` and `try_error_result.rs`. +// 2. This test confirms the coverage generated when a program passes or fails a +// compiler-generated `TerminatorKind::Assert` (based on an overflow check, in this case). +// 3. Similar to how the coverage instrumentation handles `TerminatorKind::Call`, +// compiler-generated assertion failures are assumed to be a symptom of a program bug, not +// expected behavior. To simplify the coverage graphs and keep instrumented programs as +// small and fast as possible, `Assert` terminators are assumed to always succeed, and +// therefore are considered "non-branching" terminators. So, an `Assert` terminator does not +// get its own coverage counter. +// 4. After an unhandled panic or failed Assert, coverage results may not always be intuitive. +// In this test, the final count for the statements after the `if` block in `might_overflow()` +// is 4, even though the lines after `to_add + add_to` were executed only 3 times. Depending +// on the MIR graph and the structure of the code, this count could have been 3 (which might +// have been valid for the overflowed add `+`, but should have been 4 for the lines before +// the overflow. The reason for this potential uncertainty is, a `CounterKind` is incremented +// via StatementKind::Counter at the end of the block, but (as in the case in this test), +// a CounterKind::Expression is always evaluated. In this case, the expression was based on +// a `Counter` incremented as part of the evaluation of the `if` expression, which was +// executed, and counted, 4 times, before reaching the overflow add. + +// If the program did not overflow, the coverage for `might_overflow()` would look like this: +// +// 4| |fn might_overflow(to_add: u32) -> u32 { +// 5| 4| if to_add > 5 { +// 6| 0| println!("this will probably overflow"); +// 7| 4| } +// 8| 4| let add_to = u32::MAX - 5; +// 9| 4| println!("does {} + {} overflow?", add_to, to_add); +// 10| 4| let result = to_add + add_to; +// 11| 4| println!("continuing after overflow check"); +// 12| 4| result +// 13| 4|} diff --git a/src/test/run-make-fulldeps/coverage/panic_unwind.rs b/src/test/run-make-fulldeps/coverage/panic_unwind.rs new file mode 100644 index 000000000000..02fa01ab9623 --- /dev/null +++ b/src/test/run-make-fulldeps/coverage/panic_unwind.rs @@ -0,0 +1,49 @@ +#![allow(unused_assignments)] +// expect-exit-status-101 + +fn might_panic(should_panic: bool) { + if should_panic { + println!("panicking..."); + panic!("panics"); + } else { + println!("Don't Panic"); + } +} + +fn main() -> Result<(),u8> { + let mut countdown = 10; + while countdown > 0 { + if countdown == 1 { + might_panic(true); + } else if countdown < 5 { + might_panic(false); + } + countdown -= 1; + } + Ok(()) +} + +// Notes: +// 1. Compare this program and its coverage results to those of the similar tests `abort.rs` and +// `try_error_result.rs`. +// 2. Since the `panic_unwind.rs` test is allowed to unwind, it is also allowed to execute the +// normal program exit cleanup, including writing out the current values of the coverage +// counters. +// 3. The coverage results show (interestingly) that the `panic!()` call did execute, but it does +// not show coverage of the `if countdown == 1` branch in `main()` that calls +// `might_panic(true)` (causing the call to `panic!()`). +// 4. The reason `main()`s `if countdown == 1` branch, calling `might_panic(true)`, appears +// "uncovered" is, InstrumentCoverage (intentionally) treats `TerminatorKind::Call` terminators +// as non-branching, because when a program executes normally, they always are. Errors handled +// via the try `?` operator produce error handling branches that *are* treated as branches in +// coverage results. By treating calls without try `?` operators as non-branching (assumed to +// return normally and continue) the coverage graph can be simplified, producing smaller, +// faster binaries, and cleaner coverage results. +// 5. The reason the coverage results actually show `panic!()` was called is most likely because +// `panic!()` is a macro, not a simple function call, and there are other `Statement`s and/or +// `Terminator`s that execute with a coverage counter before the panic and unwind occur. +// 6. By best practice, programs should not panic. By design, the coverage implementation will not +// incur additional cost (in program size and execution time) to improve coverage results for +// an event that is not supposted to happen. +// 7. FIXME(#78544): This issue describes a feature request for a proposed option to enable +// more accurate coverage results for tests that intentionally panic. diff --git a/src/test/run-make-fulldeps/coverage/yield.rs b/src/test/run-make-fulldeps/coverage/yield.rs new file mode 100644 index 000000000000..ff7616656ff5 --- /dev/null +++ b/src/test/run-make-fulldeps/coverage/yield.rs @@ -0,0 +1,37 @@ +#![feature(generators, generator_trait)] +#![allow(unused_assignments)] + +use std::ops::{Generator, GeneratorState}; +use std::pin::Pin; + +fn main() { + let mut generator = || { + yield 1; + return "foo" + }; + + match Pin::new(&mut generator).resume(()) { + GeneratorState::Yielded(1) => {} + _ => panic!("unexpected value from resume"), + } + match Pin::new(&mut generator).resume(()) { + GeneratorState::Complete("foo") => {} + _ => panic!("unexpected value from resume"), + } + + let mut generator = || { + yield 1; + yield 2; + yield 3; + return "foo" + }; + + match Pin::new(&mut generator).resume(()) { + GeneratorState::Yielded(1) => {} + _ => panic!("unexpected value from resume"), + } + match Pin::new(&mut generator).resume(()) { + GeneratorState::Yielded(2) => {} + _ => panic!("unexpected value from resume"), + } +} diff --git a/src/tools/compiletest/src/main.rs b/src/tools/compiletest/src/main.rs index 0541548aefd6..5177dae8a660 100644 --- a/src/tools/compiletest/src/main.rs +++ b/src/tools/compiletest/src/main.rs @@ -508,8 +508,6 @@ fn common_inputs_stamp(config: &Config) -> Stamp { stamp.add_path(&rustdoc_path); stamp.add_path(&rust_src_dir.join("src/etc/htmldocck.py")); } - // FIXME(richkadel): Do I need to add an `if let Some(rust_demangler_path) contribution to the - // stamp here as well? // Compiletest itself. stamp.add_dir(&rust_src_dir.join("src/tools/compiletest/"));