about summary refs log tree commit diff
path: root/tests/ui/async-await/async-closures/post-mono-higher-ranked-hang.rs
blob: f6ebf787f81b997d96d4c2c1d9d790fa1cb0ffcb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
//@ build-fail
//@ aux-build:block-on.rs
//@ edition:2021

// Regression test for <https://github.com/rust-lang/rust/issues/135780>.

extern crate block_on;

use std::future::Future;
use std::ops::AsyncFnMut;
use std::pin::{Pin, pin};
use std::task::*;

trait Db {}

impl Db for () {}

struct Env<'db> {
    db: &'db (),
}

#[derive(Debug)]
enum SymPerm<'db> {
    Dummy(&'db ()),
    Apply(Box<SymPerm<'db>>, Box<SymPerm<'db>>),
}

pub struct ToChain<'env, 'db> {
    db: &'db dyn crate::Db,
    env: &'env Env<'db>,
}

impl<'env, 'db> ToChain<'env, 'db> {
    fn perm_pairs<'l>(
        &'l self,
        perm: &'l SymPerm<'db>,
        yield_chain: &'l mut impl AsyncFnMut(&SymPerm<'db>),
    ) -> Pin<Box<dyn std::future::Future<Output = ()> + 'l>> {
        Box::pin(async move {
            match perm {
                SymPerm::Dummy(_) => yield_chain(perm).await,
                SymPerm::Apply(l, r) => {
                    self.perm_pairs(l, &mut async move |left_pair| {
                        //~^ ERROR reached the recursion limit while instantiating
                        self.perm_pairs(r, yield_chain).await
                    })
                    .await
                }
            }
        })
    }
}

fn main() {
    block_on::block_on(async {
        let pair = SymPerm::Apply(Box::new(SymPerm::Dummy(&())), Box::new(SymPerm::Dummy(&())));
        ToChain { db: &(), env: &Env { db: &() } }
            .perm_pairs(&pair, &mut async |p| {
                eprintln!("{p:?}");
            })
            .await;
    });
}