mirror of
https://github.com/rust-lang/rust.git
synced 2024-12-04 20:54:13 +00:00
57 lines
967 B
Rust
57 lines
967 B
Rust
|
#![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();
|
||
|
}
|
||
|
}
|