File: post-mono-higher-ranked-hang.rs

package info (click to toggle)
rustc 1.86.0%2Bdfsg1-1
  • links: PTS, VCS
  • area: main
  • in suites: experimental, forky, sid
  • size: 913,560 kB
  • sloc: xml: 158,127; python: 35,921; javascript: 19,689; sh: 19,600; cpp: 18,906; ansic: 13,124; asm: 4,376; makefile: 708; perl: 29; lisp: 29; ruby: 19; sql: 11
file content (63 lines) | stat: -rw-r--r-- 1,550 bytes parent folder | download | duplicates (7)
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;
    });
}