// 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) { 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: ; ::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: ; ::trait_fn_overridden // CHECK: ; Function Attrs: // CHECK-NOT: cold // CHECK: define fn trait_fn_overridden(&self) {} }