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