71 lines
2.4 KiB
Text
71 lines
2.4 KiB
Text
LL| |#![feature(coverage_attribute)]
|
|
LL| |//@ edition: 2024
|
|
LL| |
|
|
LL| |// Test that when a macro expands to another macro, without any significant
|
|
LL| |// spans of its own, that this doesn't cause coverage instrumentation to give
|
|
LL| |// up and ignore the inner spans.
|
|
LL| |
|
|
LL| |macro_rules! inner_macro {
|
|
LL| | () => {
|
|
LL| | if core::hint::black_box(true) {
|
|
LL| | say("true");
|
|
LL| | } else {
|
|
LL| | say("false");
|
|
LL| | }
|
|
LL| | };
|
|
LL| |}
|
|
LL| |
|
|
LL| |macro_rules! middle_macro {
|
|
LL| | () => {
|
|
LL| | inner_macro!()
|
|
LL| | };
|
|
LL| |}
|
|
LL| |
|
|
LL| |macro_rules! outer_macro {
|
|
LL| | () => {
|
|
LL| | middle_macro!()
|
|
LL| | };
|
|
LL| |}
|
|
LL| |
|
|
LL| |// In each of these three functions, the macro call should be instrumented,
|
|
LL| |// and should have an execution count of 1.
|
|
LL| |//
|
|
LL| |// Each function contains some extra code to ensure that control flow is
|
|
LL| |// non-trivial.
|
|
LL| |
|
|
LL| 1|fn uses_inner_macro() {
|
|
LL| 1| if core::hint::black_box(true) {
|
|
LL| 1| say("before inner_macro");
|
|
LL| 1| inner_macro!();
|
|
LL| 1| say("after inner_macro");
|
|
LL| 0| }
|
|
LL| 1|}
|
|
LL| |
|
|
LL| 1|fn uses_middle_macro() {
|
|
LL| 1| if core::hint::black_box(true) {
|
|
LL| 1| say("before middle_macro");
|
|
LL| 1| middle_macro!();
|
|
LL| 1| say("after middle_macro")
|
|
LL| 0| }
|
|
LL| 1|}
|
|
LL| |
|
|
LL| 1|fn uses_outer_macro() {
|
|
LL| 1| if core::hint::black_box(true) {
|
|
LL| 1| say("before outer_macro");
|
|
LL| 1| outer_macro!();
|
|
LL| 1| say("after outer_macro");
|
|
LL| 0| }
|
|
LL| 1|}
|
|
LL| |
|
|
LL| |#[coverage(off)]
|
|
LL| |fn main() {
|
|
LL| | uses_inner_macro();
|
|
LL| | uses_middle_macro();
|
|
LL| | uses_outer_macro();
|
|
LL| |}
|
|
LL| |
|
|
LL| |#[coverage(off)]
|
|
LL| |fn say(message: &str) {
|
|
LL| | println!("{message}");
|
|
LL| |}
|
|
|