| //! Ensure that `#[optimize]` applied to a closure is inherited by its coercion shim. | |
| //@ compile-flags: -Copt-level=3 | |
| #![feature(optimize_attribute)] | |
| #![feature(stmt_expr_attributes)] | |
| #![crate_type = "lib"] | |
| // CHECK-DAG: define{{.*}}void {{.*}}shim{{.*}}none{{.*}}(){{.*}}#[[ATTR_NONE:[0-9]+]] | |
| // CHECK-DAG: define{{.*}}void {{.*}}shim{{.*}}size{{.*}}(){{.*}}#[[ATTR_SIZE:[0-9]+]] | |
| // CHECK-DAG: define{{.*}}void {{.*}}shim{{.*}}test_passed_directly{{.*}}(){{.*}}#[[ATTR_SIZE]] | |
| // CHECK-DAG: attributes #[[ATTR_NONE]] = { {{.*}}noinline{{.*}}optnone{{.*}} } | |
| // CHECK-DAG: attributes #[[ATTR_SIZE]] = { {{.*}}optsize{{.*}} } | |
| extern "C" { | |
| fn side_effect_1(); | |
| fn side_effect_2(); | |
| fn side_effect_3(); | |
| } | |
| #[no_mangle] | |
| pub fn test_none() -> fn() { | |
| let closure = #[optimize(none)] | |
| || unsafe { side_effect_1() }; | |
| closure | |
| } | |
| #[no_mangle] | |
| pub fn test_size() -> fn() { | |
| let closure = #[optimize(size)] | |
| || unsafe { side_effect_2() }; | |
| closure | |
| } | |
| #[no_mangle] | |
| #[inline(never)] | |
| pub fn test_passed_directly() { | |
| f( | |
| #[optimize(size)] | |
| || unsafe { side_effect_3() }, | |
| ); | |
| } | |
| #[no_mangle] | |
| #[inline(never)] | |
| pub fn f(x: fn()) { | |
| x(); | |
| } |