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