| #![crate_name = "interesting"] |
| #![crate_type = "rlib"] |
| |
| extern crate opaque; |
| |
| #[no_mangle] |
| pub fn function_called_always() { |
| opaque::opaque_f1(); |
| } |
| |
| #[no_mangle] |
| pub fn function_called_never() { |
| opaque::opaque_f2(); |
| } |
| |
| #[no_mangle] |
| pub fn call_a_bunch_of_functions(fns: &[fn()]) { |
| // Indirect call promotion transforms the below into something like |
| // |
| // for f in fns { |
| // if f == function_called_always { |
| // function_called_always() |
| // } else { |
| // f(); |
| // } |
| // } |
| // |
| // where `function_called_always` actually gets inlined too. |
| |
| for f in fns { |
| f(); |
| } |
| } |
| |
| pub trait Foo { |
| fn foo(&self); |
| } |
| |
| impl Foo for u32 { |
| #[no_mangle] |
| fn foo(&self) { |
| opaque::opaque_f2(); |
| } |
| } |
| |
| #[no_mangle] |
| pub fn call_a_bunch_of_trait_methods(trait_objects: &[&dyn Foo]) { |
| // Same as above, just with vtables in between |
| for x in trait_objects { |
| x.foo(); |
| } |
| } |