2019-12-14 03:28:32 +00:00
|
|
|
// build-fail
|
2023-09-09 06:36:50 +00:00
|
|
|
// normalize-stderr-test: "<\{closure@.+`" -> "$$CLOSURE`"
|
2020-09-16 02:45:58 +00:00
|
|
|
// normalize-stderr-test: ".nll/" -> "/"
|
2018-08-09 10:48:31 +00:00
|
|
|
|
2015-09-10 15:26:19 +00:00
|
|
|
#![allow(unused)]
|
|
|
|
|
2016-11-15 21:25:59 +00:00
|
|
|
#![recursion_limit = "20"]
|
|
|
|
#![type_length_limit = "20000000"]
|
2017-10-30 17:19:31 +00:00
|
|
|
#![crate_type = "rlib"]
|
2015-11-18 17:27:35 +00:00
|
|
|
|
2015-09-10 15:26:19 +00:00
|
|
|
#[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)
|
2023-09-09 06:36:50 +00:00
|
|
|
//~^ ERROR reached the recursion limit while instantiating `A::matches::<{closure
|
2015-09-10 15:26:19 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn matches() {
|
|
|
|
A(B::Variant1).matches(&(|| ()))
|
|
|
|
}
|