summaryrefslogtreecommitdiffstats
path: root/src/test/ui/issues/issue-22638.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/test/ui/issues/issue-22638.rs')
-rw-r--r--src/test/ui/issues/issue-22638.rs63
1 files changed, 63 insertions, 0 deletions
diff --git a/src/test/ui/issues/issue-22638.rs b/src/test/ui/issues/issue-22638.rs
new file mode 100644
index 000000000..198ceccc2
--- /dev/null
+++ b/src/test/ui/issues/issue-22638.rs
@@ -0,0 +1,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(&(|| ()))
+}