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