//@ build-fail #![allow(unused)] #![recursion_limit = "20"] #![type_length_limit = "20000000"] #![crate_type = "rlib"] #[derive(Clone)] struct A (B); impl A { pub fn matches(&self, f: &F) { let &A(ref term) = self; term.matches(f); } } #[derive(Clone)] enum B { Variant1, Variant2(C), } impl B { pub fn matches(&self, f: &F) { match self { &B::Variant2(ref factor) => { factor.matches(&|| ()) } _ => unreachable!("") } } } #[derive(Clone)] struct C (D); impl C { pub fn matches(&self, f: &F) { let &C(ref base) = self; base.matches(&|| { C(base.clone()).matches(f) }) } } #[derive(Clone)] struct D (Box); impl D { pub fn matches(&self, f: &F) { let &D(ref a) = self; a.matches(f) //~^ ERROR reached the recursion limit while instantiating } } pub fn matches() { A(B::Variant1).matches(&(|| ())) }