Adds feature-gated #[no_coverage] function attribute, to fix derived Eq 0 coverage issue #83601#84562
Conversation
The Eq trait has a special hidden function. MIR `InstrumentCoverage` would add this function to the coverage map, but it is never called, so the `Eq` trait would always appear uncovered. Fixes: rust-lang#83601 The fix required creating a new function attribute `no_coverage` to mark functions that should be ignored by `InstrumentCoverage` and the coverage `mapgen` (during codegen). While testing, I also noticed two other issues: * spanview debug file output ICEd on a function with no body. The workaround for this is included in this PR. * `assert_*!()` macro coverage can appear covered if followed by another `assert_*!()` macro. Normally they appear uncovered. I submitted a new Issue rust-lang#84561, and added a coverage test to demonstrate this issue.
|
@nikomatsakis - Does this implementation work for you? Is there anything else needed before this can be approved and merged (now that feature gating is supported)? |
#[no_coverage] option for functions, to fix derived Eq 0 coverage issue #83601
#[no_coverage] option for functions, to fix derived Eq 0 coverage issue #83601#[no_coverage] function attribute, to fix derived Eq 0 coverage issue #83601
tmandry
left a comment
There was a problem hiding this comment.
I'm thinking we should go ahead and add this attribute to all the builtin derives (in either this change or a future one). I don't see much point in making sure they have coverage; they're already well tested in the compiler.
| if list.iter().any(|nested_meta_item| nested_meta_item.has_name(sym::no_coverage)) { | ||
| tcx.sess.mark_attr_used(attr); | ||
| no_coverage_feature_enabled = true; | ||
| } |
There was a problem hiding this comment.
Shouldn't AssumeUsed make this unnecessary?
There was a problem hiding this comment.
No, it appears to be necessary. I tried removing it, and when compiling rustc I now get the error:
error: unused attribute
--> library/core/src/cmp.rs:277:32
|
277 | #[cfg_attr(not(bootstrap), feature(no_coverage))]
| ^^^^^^^^^^^^^^^^^^^^
|
= note: `-D unused-attributes` implied by `-D warnings`
|
Looks great modulo comments. |
|
✌️ @richkadel can now approve this pull request |
|
I also like the idea of combining the first two comments on #84605 by making it The particulars of which things to make covered by default are a little hazy to me at this point, though. Really the problem I want to fix is that assert messages in tests appear uncovered, but that's kind of the point :) |
Hmm... Maybe I could be convinced, but I think we should discuss this, and for now I think it should be left out of this PR. The function with But I think it's worth discussing, but skipping coverage reporting that can provide valid feedback to the user, for builtin traits, feels like a judgement call we would be making. |
Yes, I saw the comments, and I do want to consider them. Since this is feature-gated (and fixes a bug), I'd like to land this with I did consider something like In fact, I think coverage is especially relevant to tests, so I wouldn't want to disable it for tests by default, or require the user add the attribute in order to get test coverage. The only other coverage-related attribute we may want to consider, in the future, is an attribute to enable coverage of unwind paths (#78544). But the MIR It's definitely not uncommon for attributes to start with |
|
@bors r=tmandry |
|
📌 Commit 3a5df48 has been approved by |
|
Agreed that coverage is relevant to tests, but I don't know if it's very relevant to the test functions themselves. But like I said, there might be a different way of getting at the problem I'm talking about. In fact, your reply made me think of an approach I like better, which is removing counters that are along a path that always panics. We don't instrument the full panic paths anyway, and this is a straightforward analysis to do. None of this is very relevant to this PR though! I just wanted to put my ideas down somewhere.. |
|
☀️ Test successful - checks-actions |
Derived Eq no longer shows uncovered
The Eq trait has a special hidden function. MIR
InstrumentCoveragewould add this function to the coverage map, but it is never called, so
the
Eqtrait would always appear uncovered.Fixes: #83601
The fix required creating a new function attribute
no_coverageto markfunctions that should be ignored by
InstrumentCoverageand thecoverage
mapgen(during codegen).Adding a
no_coveragefeature gate with tracking issue #84605.r? @tmandry
cc: @wesleywiser