By default, edition 2024 will capture all types and lifetimes present in the function signature when using RPIT, while edition 2021 will capture only the lifetimes present in the RPIT itself. Adding explicit `use<>` markers will disable the edition-specific automatic rules when they differ.
142 lines
2.8 KiB
Rust
142 lines
2.8 KiB
Rust
#![warn(clippy::manual_async_fn)]
|
|
#![allow(clippy::needless_pub_self, unused)]
|
|
|
|
use std::future::Future;
|
|
|
|
async fn fut() -> i32 { 42 }
|
|
|
|
#[rustfmt::skip]
|
|
async fn fut2() -> i32 { 42 }
|
|
|
|
#[rustfmt::skip]
|
|
async fn fut3() -> i32 { 42 }
|
|
|
|
async fn empty_fut() {}
|
|
|
|
#[rustfmt::skip]
|
|
async fn empty_fut2() {}
|
|
|
|
#[rustfmt::skip]
|
|
async fn empty_fut3() {}
|
|
|
|
async fn core_fut() -> i32 { 42 }
|
|
|
|
// should be ignored
|
|
fn has_other_stmts() -> impl core::future::Future<Output = i32> {
|
|
let _ = 42;
|
|
async move { 42 }
|
|
}
|
|
|
|
// should be ignored
|
|
fn not_fut() -> i32 {
|
|
42
|
|
}
|
|
|
|
// should be ignored
|
|
async fn already_async() -> impl Future<Output = i32> {
|
|
async { 42 }
|
|
}
|
|
|
|
struct S;
|
|
impl S {
|
|
async fn inh_fut() -> i32 {
|
|
// NOTE: this code is here just to check that the indentation is correct in the suggested fix
|
|
let a = 42;
|
|
let b = 21;
|
|
if a < b {
|
|
let c = 21;
|
|
let d = 42;
|
|
if c < d {
|
|
let _ = 42;
|
|
}
|
|
}
|
|
42
|
|
}
|
|
|
|
// should be ignored
|
|
fn not_fut(&self) -> i32 {
|
|
42
|
|
}
|
|
|
|
// should be ignored
|
|
fn has_other_stmts() -> impl core::future::Future<Output = i32> {
|
|
let _ = 42;
|
|
async move { 42 }
|
|
}
|
|
|
|
// should be ignored
|
|
async fn already_async(&self) -> impl Future<Output = i32> {
|
|
async { 42 }
|
|
}
|
|
}
|
|
|
|
// Tests related to lifetime capture
|
|
|
|
async fn elided(_: &i32) -> i32 { 42 }
|
|
|
|
// should be ignored
|
|
fn elided_not_bound(_: &i32) -> impl Future<Output = i32> + use<> {
|
|
async { 42 }
|
|
}
|
|
|
|
#[allow(clippy::needless_lifetimes)]
|
|
async fn explicit<'a, 'b>(_: &'a i32, _: &'b i32) -> i32 { 42 }
|
|
|
|
// should be ignored
|
|
#[allow(clippy::needless_lifetimes)]
|
|
fn explicit_not_bound<'a, 'b>(_: &'a i32, _: &'b i32) -> impl Future<Output = i32> + use<> {
|
|
async { 42 }
|
|
}
|
|
|
|
// should be ignored
|
|
mod issue_5765 {
|
|
use std::future::Future;
|
|
|
|
struct A;
|
|
impl A {
|
|
fn f(&self) -> impl Future<Output = ()> + use<> {
|
|
async {}
|
|
}
|
|
}
|
|
|
|
fn test() {
|
|
let _future = {
|
|
let a = A;
|
|
a.f()
|
|
};
|
|
}
|
|
}
|
|
|
|
pub async fn issue_10450() -> i32 { 42 }
|
|
|
|
pub(crate) async fn issue_10450_2() -> i32 { 42 }
|
|
|
|
pub(self) async fn issue_10450_3() -> i32 { 42 }
|
|
|
|
macro_rules! issue_12407 {
|
|
(
|
|
$(
|
|
$(#[$m:meta])*
|
|
$v:vis $(override($($overrides:tt),* $(,)?))? fn $name:ident $([$($params:tt)*])? (
|
|
$($arg_name:ident: $arg_typ:ty),* $(,)?
|
|
) $(-> $ret_ty:ty)? = $e:expr;
|
|
)*
|
|
) => {
|
|
$(
|
|
$(#[$m])*
|
|
$v $($($overrides)*)? fn $name$(<$($params)*>)?(
|
|
$($arg_name: $arg_typ),*
|
|
) $(-> $ret_ty)? {
|
|
$e
|
|
}
|
|
)*
|
|
};
|
|
}
|
|
|
|
issue_12407! {
|
|
fn _hello() -> impl Future<Output = ()> = async {};
|
|
fn non_async() = println!("hello");
|
|
fn foo() = non_async();
|
|
}
|
|
|
|
fn main() {}
|