|  | #![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(); | 
|  | } |