about summary refs log tree commit diff
path: root/tests/ui/issues/issue-22638.rs
diff options
context:
space:
mode:
Diffstat (limited to 'tests/ui/issues/issue-22638.rs')
-rw-r--r--tests/ui/issues/issue-22638.rs63
1 files changed, 63 insertions, 0 deletions
diff --git a/tests/ui/issues/issue-22638.rs b/tests/ui/issues/issue-22638.rs
new file mode 100644
index 00000000000..198ceccc2c3
--- /dev/null
+++ b/tests/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(&(|| ()))
+}