about summary refs log tree commit diff
path: root/tests/ui/issues/issue-14959.rs
diff options
context:
space:
mode:
Diffstat (limited to 'tests/ui/issues/issue-14959.rs')
-rw-r--r--tests/ui/issues/issue-14959.rs55
1 files changed, 55 insertions, 0 deletions
diff --git a/tests/ui/issues/issue-14959.rs b/tests/ui/issues/issue-14959.rs
new file mode 100644
index 00000000000..e31a9431558
--- /dev/null
+++ b/tests/ui/issues/issue-14959.rs
@@ -0,0 +1,55 @@
+// check-pass
+// pretty-expanded FIXME #23616
+
+#![feature(fn_traits, unboxed_closures)]
+
+use std::ops::Fn;
+
+trait Response { fn dummy(&self) { } }
+trait Request { fn dummy(&self) { } }
+trait Ingot<R, S> {
+    fn enter(&mut self, _: &mut R, _: &mut S, a: &mut Alloy) -> Status;
+}
+
+#[allow(dead_code)]
+struct HelloWorld;
+
+struct SendFile;
+struct Alloy;
+enum Status {
+    Continue
+}
+
+impl Alloy {
+    fn find<T>(&self) -> Option<T> {
+        None
+    }
+}
+
+impl<'b> Fn<(&'b mut (dyn Response + 'b),)> for SendFile {
+    extern "rust-call" fn call(&self, (_res,): (&'b mut (dyn Response + 'b),)) {}
+}
+
+impl<'b> FnMut<(&'b mut (dyn Response + 'b),)> for SendFile {
+    extern "rust-call" fn call_mut(&mut self, (_res,): (&'b mut (dyn Response+'b),)) {
+        self.call((_res,))
+    }
+}
+
+impl<'b> FnOnce<(&'b mut (dyn Response + 'b),)> for SendFile {
+    type Output = ();
+
+    extern "rust-call" fn call_once(self, (_res,): (&'b mut (dyn Response+'b),)) {
+        self.call((_res,))
+    }
+}
+
+impl<Rq: Request, Rs: Response> Ingot<Rq, Rs> for HelloWorld {
+    fn enter(&mut self, _req: &mut Rq, res: &mut Rs, alloy: &mut Alloy) -> Status {
+        let send_file = alloy.find::<SendFile>().unwrap();
+        send_file(res);
+        Status::Continue
+    }
+}
+
+fn main() {}