coverage: Add a test case for a previously-unknown span mismatch

This commit is contained in:
Zalathar 2026-02-03 22:53:38 +11:00
parent 46c86aef65
commit 0418f9aa42
4 changed files with 91 additions and 5 deletions

View file

@ -55,12 +55,10 @@ pub(super) fn extract_refined_covspans<'tcx>(
}
// Each pushed covspan should have the same context as the body span.
// If it somehow doesn't, discard the covspan, or panic in debug builds.
// If it somehow doesn't, discard the covspan.
if !body_span.eq_ctxt(covspan_span) {
debug_assert!(
false,
"span context mismatch: body_span={body_span:?}, covspan.span={covspan_span:?}"
);
// FIXME(Zalathar): Investigate how and why this is triggered
// by `tests/coverage/macros/context-mismatch-issue-147339.rs`.
return false;
}

View file

@ -0,0 +1,40 @@
Function name: context_mismatch_issue_147339::a (unused)
Raw bytes (14): 0x[01, 01, 00, 02, 00, 0c, 27, 00, 35, 00, 00, 3b, 00, 3c]
Number of files: 1
- file 0 => $DIR/context-mismatch-issue-147339.rs
Number of expressions: 0
Number of file 0 mappings: 2
- Code(Zero) at (prev + 12, 39) to (start + 0, 53)
- Code(Zero) at (prev + 0, 59) to (start + 0, 60)
Highest counter ID seen: (none)
Function name: context_mismatch_issue_147339::b (unused)
Raw bytes (14): 0x[01, 01, 00, 02, 00, 0c, 27, 00, 35, 00, 00, 3b, 00, 3c]
Number of files: 1
- file 0 => $DIR/context-mismatch-issue-147339.rs
Number of expressions: 0
Number of file 0 mappings: 2
- Code(Zero) at (prev + 12, 39) to (start + 0, 53)
- Code(Zero) at (prev + 0, 59) to (start + 0, 60)
Highest counter ID seen: (none)
Function name: context_mismatch_issue_147339::c (unused)
Raw bytes (14): 0x[01, 01, 00, 02, 00, 0c, 27, 00, 35, 00, 00, 3b, 00, 3c]
Number of files: 1
- file 0 => $DIR/context-mismatch-issue-147339.rs
Number of expressions: 0
Number of file 0 mappings: 2
- Code(Zero) at (prev + 12, 39) to (start + 0, 53)
- Code(Zero) at (prev + 0, 59) to (start + 0, 60)
Highest counter ID seen: (none)
Function name: context_mismatch_issue_147339::main
Raw bytes (14): 0x[01, 01, 00, 02, 01, 14, 01, 00, 0a, 01, 00, 0c, 00, 0d]
Number of files: 1
- file 0 => $DIR/context-mismatch-issue-147339.rs
Number of expressions: 0
Number of file 0 mappings: 2
- Code(Counter(0)) at (prev + 20, 1) to (start + 0, 10)
- Code(Counter(0)) at (prev + 0, 12) to (start + 0, 13)
Highest counter ID seen: c0

View file

@ -0,0 +1,28 @@
LL| |//@ edition: 2024
LL| |
LL| |// These nested macro expansions were found to cause span refinement to produce
LL| |// spans with a context that doesn't match the function body span, triggering
LL| |// a defensive check that discards the span.
LL| |//
LL| |// Reported in <https://github.com/rust-lang/rust/issues/147339>.
LL| |
LL| |macro_rules! foo {
LL| | ($($m:ident $($f:ident $v:tt)+),*) => {
LL| | $($(macro_rules! $f { () => { $v } })+)*
LL| 0| $(macro_rules! $m { () => { $(fn $f() -> i32 { $v })+ } })*
------------------
| Unexecuted instantiation: context_mismatch_issue_147339::a
------------------
| Unexecuted instantiation: context_mismatch_issue_147339::b
------------------
| Unexecuted instantiation: context_mismatch_issue_147339::c
------------------
LL| | }
LL| |}
LL| |
LL| |foo!(m a 1 b 2, n c 3);
LL| |m!();
LL| |n!();
LL| |
LL| 1|fn main() {}

View file

@ -0,0 +1,20 @@
//@ edition: 2024
// These nested macro expansions were found to cause span refinement to produce
// spans with a context that doesn't match the function body span, triggering
// a defensive check that discards the span.
//
// Reported in <https://github.com/rust-lang/rust/issues/147339>.
macro_rules! foo {
($($m:ident $($f:ident $v:tt)+),*) => {
$($(macro_rules! $f { () => { $v } })+)*
$(macro_rules! $m { () => { $(fn $f() -> i32 { $v })+ } })*
}
}
foo!(m a 1 b 2, n c 3);
m!();
n!();
fn main() {}