79 lines
1.8 KiB
Rust
79 lines
1.8 KiB
Rust
|
|
// 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) {}
|
||
|
|
}
|