about summary refs log tree commit diff
path: root/tests/ui/issues/issue-26186.rs
diff options
context:
space:
mode:
Diffstat (limited to 'tests/ui/issues/issue-26186.rs')
-rw-r--r--tests/ui/issues/issue-26186.rs62
1 files changed, 62 insertions, 0 deletions
diff --git a/tests/ui/issues/issue-26186.rs b/tests/ui/issues/issue-26186.rs
new file mode 100644
index 00000000000..f93869352ea
--- /dev/null
+++ b/tests/ui/issues/issue-26186.rs
@@ -0,0 +1,62 @@
+// check-pass
+use std::sync::Mutex;
+use std::cell::RefCell;
+use std::rc::Rc;
+use std::ops::*;
+
+//eefriedman example
+struct S<'a, T:FnMut() + 'static + ?Sized>(&'a mut T);
+impl<'a, T:?Sized + FnMut() + 'static> DerefMut for S<'a, T> {
+    fn deref_mut(&mut self) -> &mut Self::Target { &mut self.0 }
+}
+impl<'a, T:?Sized + FnMut() + 'static> Deref for S<'a, T> {
+    type Target = dyn FnMut() + 'a;
+    fn deref(&self) -> &Self::Target { &self.0 }
+}
+
+//Ossipal example
+struct FunctionIcon {
+    get_icon: Mutex<Box<dyn FnMut() -> u32>>,
+}
+
+impl FunctionIcon {
+    fn get_icon(&self) -> impl '_ + std::ops::DerefMut<Target=Box<dyn FnMut() -> u32>> {
+        self.get_icon.lock().unwrap()
+    }
+
+    fn load_icon(&self)  {
+        let mut get_icon = self.get_icon();
+        let _rgba_icon = (*get_icon)();
+    }
+}
+
+//shepmaster example
+struct Foo;
+
+impl Deref for Foo {
+    type Target = dyn FnMut() + 'static;
+    fn deref(&self) -> &Self::Target {
+        unimplemented!()
+    }
+}
+
+impl DerefMut for Foo {
+    fn deref_mut(&mut self) -> &mut Self::Target {
+        unimplemented!()
+    }
+}
+
+fn main() {
+    //eefriedman example
+    let mut f = ||{};
+    let mut s = S(&mut f);
+    s();
+
+    //Diggsey/Mark-Simulacrum example
+    let a: Rc<RefCell<dyn FnMut()>> = Rc::new(RefCell::new(||{}));
+    a.borrow_mut()();
+
+    //shepmaster example
+    let mut t = Foo;
+    t();
+}