65 lines
1.2 KiB
Rust
65 lines
1.2 KiB
Rust
//@ build-fail
|
|
//@ normalize-stderr-test: "<\{closure@.+`" -> "$$CLOSURE`"
|
|
//@ normalize-stderr-test: ".nll/" -> "/"
|
|
//@ ignore-compare-mode-next-solver (hangs)
|
|
|
|
#![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(&(|| ()))
|
|
}
|