| // Checks that the cold attribute adds the llvm cold attribute. |
| // |
| //@ reference: attributes.codegen.cold.intro |
| //@ reference: attributes.codegen.cold.trait |
| //@ edition:2024 |
| //@ compile-flags: -Copt-level=0 |
| |
| #![crate_type = "lib"] |
| |
| // CHECK-LABEL: ; cold_attribute::free_function |
| // CHECK-NEXT: Function Attrs: cold {{.*}} |
| #[cold] |
| pub fn free_function() {} |
| |
| // CHECK-LABEL: ; cold_attribute::async_block |
| // CHECK-NEXT: Function Attrs: cold {{.*}} |
| #[cold] |
| pub async fn async_block() { |
| async fn x(f: impl Future<Output = ()>) { |
| f.await; |
| } |
| x( |
| // CHECK-LABEL: ; cold_attribute::async_block::{{{{closure}}}}::{{{{closure}}}} |
| // CHECK-NEXT: Function Attrs: cold {{.*}} |
| #[cold] |
| async {}, |
| ) |
| .await; |
| } |
| |
| pub fn closure() { |
| fn x(f: impl Fn()) { |
| f() |
| } |
| x( |
| // CHECK-LABEL: ; cold_attribute::closure::{{{{closure}}}} |
| // CHECK-NEXT: Function Attrs: cold {{.*}} |
| #[cold] |
| || {}, |
| ); |
| } |
| |
| pub struct S; |
| |
| impl S { |
| // CHECK-LABEL: ; cold_attribute::S::method |
| // CHECK-NEXT: Function Attrs: cold {{.*}} |
| #[cold] |
| pub fn method(&self) {} |
| } |
| |
| pub trait Trait { |
| // CHECK-LABEL: ; cold_attribute::Trait::trait_fn |
| // CHECK-NEXT: Function Attrs: cold {{.*}} |
| #[cold] |
| fn trait_fn(&self) {} |
| |
| #[cold] |
| fn trait_fn_overridden(&self) {} |
| |
| fn impl_fn(&self); |
| } |
| |
| impl Trait for S { |
| // CHECK-LABEL: ; <cold_attribute::S as cold_attribute::Trait>::impl_fn |
| // CHECK-NEXT: Function Attrs: cold {{.*}} |
| #[cold] |
| fn impl_fn(&self) { |
| self.trait_fn(); |
| } |
| |
| // This does not have #[cold], and does not inherit the cold attribute from the trait. |
| // CHECK-LABEL: ; <cold_attribute::S as cold_attribute::Trait>::trait_fn_overridden |
| // CHECK: ; Function Attrs: |
| // CHECK-NOT: cold |
| // CHECK: define |
| fn trait_fn_overridden(&self) {} |
| } |