| LL| |#![feature(coverage_attribute, stmt_expr_attributes)] | |
| LL| |//@ edition: 2021 | |
| LL| |//@ reference: attributes.coverage.nesting | |
| LL| | | |
| LL| |// Demonstrates the interaction between #[coverage(off)] and various kinds of | |
| LL| |// nested function. | |
| LL| | | |
| LL| |#[coverage(off)] | |
| LL| |fn do_stuff() {} | |
| LL| | | |
| LL| |#[coverage(off)] | |
| LL| |fn outer_fn() { | |
| LL| | fn middle_fn() { | |
| LL| | fn inner_fn() { | |
| LL| | do_stuff(); | |
| LL| | } | |
| LL| | do_stuff(); | |
| LL| | } | |
| LL| | do_stuff(); | |
| LL| |} | |
| LL| | | |
| LL| |struct MyOuter; | |
| LL| |impl MyOuter { | |
| LL| | #[coverage(off)] | |
| LL| | fn outer_method(&self) { | |
| LL| | struct MyMiddle; | |
| LL| | impl MyMiddle { | |
| LL| | fn middle_method(&self) { | |
| LL| | struct MyInner; | |
| LL| | impl MyInner { | |
| LL| | fn inner_method(&self) { | |
| LL| | do_stuff(); | |
| LL| | } | |
| LL| | } | |
| LL| | do_stuff(); | |
| LL| | } | |
| LL| | } | |
| LL| | do_stuff(); | |
| LL| | } | |
| LL| |} | |
| LL| | | |
| LL| |trait MyTrait { | |
| LL| | fn trait_method(&self); | |
| LL| |} | |
| LL| |impl MyTrait for MyOuter { | |
| LL| | #[coverage(off)] | |
| LL| | fn trait_method(&self) { | |
| LL| | struct MyMiddle; | |
| LL| | impl MyTrait for MyMiddle { | |
| LL| | fn trait_method(&self) { | |
| LL| | struct MyInner; | |
| LL| | impl MyTrait for MyInner { | |
| LL| | fn trait_method(&self) { | |
| LL| | do_stuff(); | |
| LL| | } | |
| LL| | } | |
| LL| | do_stuff(); | |
| LL| | } | |
| LL| | } | |
| LL| | do_stuff(); | |
| LL| | } | |
| LL| |} | |
| LL| | | |
| LL| 1|fn closure_expr() { | |
| LL| 1| let _outer = #[coverage(off)] | |
| LL| | || { | |
| LL| | let _middle = || { | |
| LL| | let _inner = || { | |
| LL| | do_stuff(); | |
| LL| | }; | |
| LL| | do_stuff(); | |
| LL| | }; | |
| LL| | do_stuff(); | |
| LL| | }; | |
| LL| 1| do_stuff(); | |
| LL| 1|} | |
| LL| | | |
| LL| |// This syntax is allowed, even without #![feature(stmt_expr_attributes)]. | |
| LL| 1|fn closure_tail() { | |
| LL| 1| let _outer = { | |
| LL| | #[coverage(off)] | |
| LL| | || { | |
| LL| | let _middle = { | |
| LL| | || { | |
| LL| | let _inner = { | |
| LL| | || { | |
| LL| | do_stuff(); | |
| LL| | } | |
| LL| | }; | |
| LL| | do_stuff(); | |
| LL| | } | |
| LL| | }; | |
| LL| | do_stuff(); | |
| LL| | } | |
| LL| | }; | |
| LL| 1| do_stuff(); | |
| LL| 1|} | |
| LL| | | |
| LL| |#[coverage(off)] | |
| LL| |fn main() { | |
| LL| | outer_fn(); | |
| LL| | MyOuter.outer_method(); | |
| LL| | MyOuter.trait_method(); | |
| LL| | closure_expr(); | |
| LL| | closure_tail(); | |
| LL| |} | |