| #![feature(coverage_attribute)] | |
| //@ edition: 2024 | |
| //@ revisions: base auto on | |
| // Tests for how `#[automatically_derived]` affects coverage instrumentation. | |
| // | |
| // The actual behaviour is an implementation detail, so this test mostly exists | |
| // to show when that behaviour has been accidentally or deliberately changed. | |
| // | |
| // Revision guide: | |
| // - base: Test baseline instrumentation behaviour without `#[automatically_derived]` | |
| // - auto: Test how `#[automatically_derived]` affects instrumentation | |
| // - on: Test interaction between auto-derived and `#[coverage(on)]` | |
| struct MyStruct; | |
| trait MyTrait { | |
| fn my_assoc_fn(); | |
| } | |
| #[cfg_attr(auto, automatically_derived)] | |
| #[cfg_attr(on, automatically_derived)] | |
| #[cfg_attr(on, coverage(on))] | |
| impl MyTrait for MyStruct { | |
| fn my_assoc_fn() { | |
| fn inner_fn() { | |
| say("in inner fn"); | |
| } | |
| #[coverage(on)] | |
| fn inner_fn_on() { | |
| say("in inner fn (on)"); | |
| } | |
| let closure = || { | |
| say("in closure"); | |
| }; | |
| closure(); | |
| inner_fn(); | |
| inner_fn_on(); | |
| } | |
| } | |
| #[coverage(off)] | |
| #[inline(never)] | |
| fn say(s: &str) { | |
| println!("{s}"); | |
| } | |
| fn main() { | |
| MyStruct::my_assoc_fn(); | |
| } |