blob: 198ceccc2c33cd95cc9f884e60afac413a8465e2 (
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
// normalize-stderr-test: "<\[closure@.+`" -> "$$CLOSURE`"
// normalize-stderr-test: ".nll/" -> "/"
#![allow(unused)]
#![recursion_limit = "20"]
#![type_length_limit = "20000000"]
#![crate_type = "rlib"]
#[derive(Clone)]
struct A (B);
impl A {
pub fn matches<F: Fn()>(&self, f: &F) {
let &A(ref term) = self;
term.matches(f);
}
}
#[derive(Clone)]
enum B {
Variant1,
Variant2(C),
}
impl B {
pub fn matches<F: Fn()>(&self, f: &F) {
match self {
&B::Variant2(ref factor) => {
factor.matches(&|| ())
}
_ => unreachable!("")
}
}
}
#[derive(Clone)]
struct C (D);
impl C {
pub fn matches<F: Fn()>(&self, f: &F) {
let &C(ref base) = self;
base.matches(&|| {
C(base.clone()).matches(f)
})
}
}
#[derive(Clone)]
struct D (Box<A>);
impl D {
pub fn matches<F: Fn()>(&self, f: &F) {
let &D(ref a) = self;
a.matches(f)
//~^ ERROR reached the recursion limit while instantiating `A::matches::<[closure
}
}
pub fn matches() {
A(B::Variant1).matches(&(|| ()))
}
|