-
Notifications
You must be signed in to change notification settings - Fork 12.9k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Coverage instruments closure bodies in macros (not the macro body) #84897
Conversation
I do have a new idea to explore, but still believe this PR is the right intermediate solution. So, just FYI, in a future PR I think this may work: When collecting spans in I think I can improve on this by returning ALL spans for every statement/terminator, that is, return the given span, it's parent span if any, and all other ancestor spans. Then when sorting the With that change, I should be able to still add all resolved (selected and/or merged) spans to the same Some debugging features (e.g., spanview) may assume all spans are in the same file and contiguous function block, so there will probably be some cleanup needed to support this. I think the coverage map generation code might also assume all spans for a single function are associated with a single file, and if so, I'll need to make some adjustments to support multiple files for a given function. But generally this seems doable, and seems like we would get even more coverage of macros, plus coverage of macro callers if the body starts in a macro. (It shouldn't matter anymore either way.) |
Fixes: rust-lang#84884 This solution might be considered a compromise, but I think it is the better choice. The results in the `closure.rs` test correctly resolve all test cases broken as described in rust-lang#84884. One test pattern (in both `closure_macro.rs` and `closure_macro_async.rs`) was also affected, and removes coverage statistics for the lines inside the closure, because the closure includes a macro. (The coverage remains at the callsite of the macro, so we lose some detail, but there isn't a perfect choice with macros. Often macro implementations are split across the macro and the callsite, and there doesn't appear to be a single "right choice" for which body should be covered. For the current implementation, we can't do both. The callsite is most likely to be the preferred site for coverage. I applied this fix to all `MacroKinds`, not just `Bang`. I'm trying to resolve an issue of lost coverage in a `MacroKind::Attr`-based, function-scoped macro. Instead of only searching for a body_span that is "not a function-like macro" (that is, MacroKind::Bang), I'm expanding this to all `MacroKind`s. Maybe I should expand this to `ExpnKind::Desugaring` and `ExpnKind::AstPass` (or subsets, depending on their sub-kinds) as well, but I'm not sure that's a good idea. I'd like to add a test of the `Attr` macro on functions, but I need time to figure out how to constract a good, simple example without external crate dependencies. For the moment, all tests still work as expected (no change), this new commit shouldn't have a negative affect, and more importantly, I believe it will have a positive effect. I will try to confirm this.
4b74084
to
cb70221
Compare
@bors r+ |
📌 Commit cb70221 has been approved by |
@bors rollup |
Rollup of 9 pull requests Successful merges: - rust-lang#84779 (Add support for --test-args to cargotest) - rust-lang#84781 (Don't check bootstrap artifacts by default) - rust-lang#84787 (bump deps) - rust-lang#84815 (Update coverage docs and command line help) - rust-lang#84875 (Removes unneeded check of `#[no_coverage]` in mapgen) - rust-lang#84897 (Coverage instruments closure bodies in macros (not the macro body)) - rust-lang#84911 (Retry clang+llvm download) - rust-lang#84972 (CTFE inbounds-error-messages tweak) - rust-lang#84990 (Sort rustdoc-gui tests) Failed merges: r? `@ghost` `@rustbot` modify labels: rollup
Fixes: #84884
This solution might be considered a compromise, but I think it is the
better choice.
The results in the
closure.rs
test correctly resolve all test casesbroken as described in #84884.
One test pattern (in both
closure_macro.rs
andclosure_macro_async.rs
) was also affected, and removes coveragestatistics for the lines inside the closure, because the closure
includes a macro. (The coverage remains at the callsite of the macro, so
we lose some detail, but there isn't a perfect choice with macros.
Often macro implementations are split across the macro and the callsite,
and there doesn't appear to be a single "right choice" for which body
should be covered. For the current implementation, we can't do both.
The callsite is most likely to be the preferred site for coverage.
r? @tmandry
cc: @wesleywiser