#![feature(type_alias_impl_trait)] // edition:2021 // unset-rustc-env:RUST_BACKTRACE // compile-flags:-Z treat-err-as-bug=1 // error-pattern:stack backtrace: // failure-status:101 // normalize-stderr-test "note: .*" -> "" // normalize-stderr-test "thread 'rustc' .*" -> "" // normalize-stderr-test " +[0-9]+:.*\n" -> "" // normalize-stderr-test " +at .*\n" -> "" use std::future::Future; struct Connection { } trait Transaction { } struct TestTransaction<'conn> { conn: &'conn Connection } impl<'conn> Transaction for TestTransaction<'conn> { } struct Context { } type TransactionResult = Result; type TransactionFuture<'__, O> = impl '__ + Future>; fn execute_transaction_fut<'f, F, O>( f: F, ) -> impl FnOnce(&mut dyn Transaction) -> TransactionFuture<'_, O> where F: FnOnce(&mut dyn Transaction) -> TransactionFuture<'_, O> + 'f { f } impl Context { async fn do_transaction( &self, f: impl FnOnce(&mut dyn Transaction) -> TransactionFuture<'_, O> ) -> TransactionResult { let mut conn = Connection {}; let mut transaction = TestTransaction { conn: &mut conn }; f(&mut transaction).await } } fn main() {}