| //! Ensure that `#[optimize]` applied to an outer function is inherited by closures |
| //! and their coercion shims, unless overridden by an explicit `#[optimize]` on the closure. |
| |
| //@ compile-flags: -C no-prepopulate-passes |
| |
| #![feature(optimize_attribute)] |
| #![crate_type = "lib"] |
| |
| // CHECK-DAG: define{{.*}}test_none{{.*}}call_once{{.*}}#[[ATTR_NONE:[0-9]+]] |
| // CHECK-DAG: define{{.*}}test_size{{.*}}call_once{{.*}}#[[ATTR_SIZE:[0-9]+]] |
| // CHECK-DAG: define{{.*}}test_override_size{{.*}}call_once{{.*}}#[[ATTR_SIZE]] |
| // CHECK-DAG: define{{.*}}test_override_none{{.*}}call_once{{.*}}#[[ATTR_NONE]] |
| |
| // CHECK-DAG: attributes #[[ATTR_NONE]] = { {{.*}}optnone{{.*}} } |
| // CHECK-DAG: attributes #[[ATTR_SIZE]] = { {{.*}}optsize{{.*}} } |
| |
| #[optimize(none)] |
| #[no_mangle] |
| pub fn test_none() -> fn() { |
| let closure = || (); |
| closure |
| } |
| |
| #[optimize(size)] |
| #[no_mangle] |
| pub fn test_size() -> fn() { |
| let closure = || (); |
| closure |
| } |
| |
| #[optimize(none)] |
| #[no_mangle] |
| pub fn test_override_size() -> fn() { |
| let closure = { |
| #[optimize(size)] |
| || () |
| }; |
| closure |
| } |
| |
| #[optimize(size)] |
| #[no_mangle] |
| pub fn test_override_none() -> fn() { |
| let closure = { |
| #[optimize(none)] |
| || () |
| }; |
| closure |
| } |