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