]> git.proxmox.com Git - rustc.git/blame - src/test/ui/issues/issue-26186.rs
New upstream version 1.67.1+dfsg1
[rustc.git] / src / test / ui / issues / issue-26186.rs
CommitLineData
a2a8927a
XL
1// check-pass
2use std::sync::Mutex;
3use std::cell::RefCell;
4use std::rc::Rc;
5use std::ops::*;
6
7//eefriedman example
8struct S<'a, T:FnMut() + 'static + ?Sized>(&'a mut T);
9impl<'a, T:?Sized + FnMut() + 'static> DerefMut for S<'a, T> {
10 fn deref_mut(&mut self) -> &mut Self::Target { &mut self.0 }
11}
12impl<'a, T:?Sized + FnMut() + 'static> Deref for S<'a, T> {
13 type Target = dyn FnMut() + 'a;
14 fn deref(&self) -> &Self::Target { &self.0 }
15}
16
17//Ossipal example
18struct FunctionIcon {
19 get_icon: Mutex<Box<dyn FnMut() -> u32>>,
20}
21
22impl FunctionIcon {
23 fn get_icon(&self) -> impl '_ + std::ops::DerefMut<Target=Box<dyn FnMut() -> u32>> {
24 self.get_icon.lock().unwrap()
25 }
26
27 fn load_icon(&self) {
28 let mut get_icon = self.get_icon();
29 let _rgba_icon = (*get_icon)();
30 }
31}
32
33//shepmaster example
34struct Foo;
35
36impl Deref for Foo {
37 type Target = dyn FnMut() + 'static;
38 fn deref(&self) -> &Self::Target {
39 unimplemented!()
40 }
41}
42
43impl DerefMut for Foo {
44 fn deref_mut(&mut self) -> &mut Self::Target {
45 unimplemented!()
46 }
47}
48
49fn main() {
50 //eefriedman example
51 let mut f = ||{};
52 let mut s = S(&mut f);
53 s();
54
55 //Diggsey/Mark-Simulacrum example
56 let a: Rc<RefCell<dyn FnMut()>> = Rc::new(RefCell::new(||{}));
57 a.borrow_mut()();
58
59 //shepmaster example
60 let mut t = Foo;
61 t();
62}