blob: d97300dd6046c9e8a9970906f6152e3144b49535 [file]
// Checks that inline attributes on `async fn`s and async closures apply to the coroutine holding
// their body (i.e. the `Future::poll` implementation) rather than to the function or closure that
// merely constructs it. See #129347.
//
//@ edition: 2024
//@ compile-flags: -Cno-prepopulate-passes -Csymbol-mangling-version=v0 -Zinline-mir=no
#![crate_type = "lib"]
#![feature(stmt_expr_attributes)]
use std::future::Future;
use std::pin::pin;
use std::task::Context;
// CHECK: ; async_fn_inline_attr::never{{$}}
// CHECK-NEXT: ; Function Attrs:
// CHECK-NOT: noinline
// CHECK-SAME: {{$}}
// CHECK: ; async_fn_inline_attr::never::{closure#0}
// CHECK-NEXT: ; Function Attrs: noinline
#[inline(never)]
pub async fn never() {}
// CHECK: ; async_fn_inline_attr::always{{$}}
// CHECK-NEXT: ; Function Attrs:
// CHECK-NOT: alwaysinline
// CHECK-SAME: {{$}}
// CHECK: ; async_fn_inline_attr::always::{closure#0}
// CHECK-NEXT: ; Function Attrs: alwaysinline
#[inline(always)]
pub async fn always() {}
// The body coroutine would get an inline hint regardless, like all closures.
// CHECK: ; async_fn_inline_attr::hint{{$}}
// CHECK-NEXT: ; Function Attrs:
// CHECK-NOT: inlinehint
// CHECK-SAME: {{$}}
// CHECK: ; async_fn_inline_attr::hint::{closure#0}
// CHECK-NEXT: ; Function Attrs: inlinehint
#[inline]
pub async fn hint() {}
pub struct S;
impl S {
// CHECK: ; <async_fn_inline_attr::S>::method{{$}}
// CHECK-NEXT: ; Function Attrs:
// CHECK-NOT: noinline
// CHECK-SAME: {{$}}
// CHECK: ; <async_fn_inline_attr::S>::method::{closure#0}
// CHECK-NEXT: ; Function Attrs: noinline
#[inline(never)]
pub async fn method(&self) {}
}
// CHECK: ; async_fn_inline_attr::poll_all{{$}}
pub fn poll_all(cx: &mut Context<'_>) {
let _ = pin!(never()).poll(cx);
let _ = pin!(always()).poll(cx);
let _ = pin!(hint()).poll(cx);
let _ = pin!(S.method()).poll(cx);
// CHECK: ; async_fn_inline_attr::poll_all::{closure#0}{{$}}
// CHECK-NEXT: ; Function Attrs:
// CHECK-NOT: noinline
// CHECK-SAME: {{$}}
// CHECK: ; async_fn_inline_attr::poll_all::{closure#0}::{closure#0}::<i16>
// CHECK-NEXT: ; Function Attrs: noinline
let closure = #[inline(never)]
async || {};
let _ = pin!(closure()).poll(cx);
}