about summary refs log tree commit diff
path: root/tests/ui/autoref-autoderef/deref-chain-method-calls-13264.rs
diff options
context:
space:
mode:
Diffstat (limited to 'tests/ui/autoref-autoderef/deref-chain-method-calls-13264.rs')
-rw-r--r--tests/ui/autoref-autoderef/deref-chain-method-calls-13264.rs76
1 files changed, 76 insertions, 0 deletions
diff --git a/tests/ui/autoref-autoderef/deref-chain-method-calls-13264.rs b/tests/ui/autoref-autoderef/deref-chain-method-calls-13264.rs
new file mode 100644
index 00000000000..f471c1c7eef
--- /dev/null
+++ b/tests/ui/autoref-autoderef/deref-chain-method-calls-13264.rs
@@ -0,0 +1,76 @@
+//! Regression test for https://github.com/rust-lang/rust/issues/13264
+
+//@ run-pass
+#![allow(non_camel_case_types)]
+#![allow(non_snake_case)]
+
+use std::ops::Deref;
+
+struct Root {
+    jsref: JSRef
+}
+
+impl Deref for Root {
+    type Target = JSRef;
+
+    fn deref<'a>(&'a self) -> &'a JSRef {
+        &self.jsref
+    }
+}
+
+#[derive(Copy, Clone)]
+struct JSRef {
+    node: *const Node
+}
+
+impl Deref for JSRef {
+    type Target = Node;
+
+    fn deref<'a>(&'a self) -> &'a Node {
+        self.get()
+    }
+}
+
+trait INode {
+    fn RemoveChild(&self);
+}
+
+impl INode for JSRef {
+    fn RemoveChild(&self) {
+        self.get().RemoveChild(0)
+    }
+}
+
+impl JSRef {
+    fn AddChild(&self) {
+        self.get().AddChild(0);
+    }
+
+    fn get<'a>(&'a self) -> &'a Node {
+        unsafe {
+            &*self.node
+        }
+    }
+}
+
+struct Node;
+
+impl Node {
+    fn RemoveChild(&self, _a: usize) {
+    }
+
+    fn AddChild(&self, _a: usize) {
+    }
+}
+
+fn main() {
+    let n = Node;
+    let jsref = JSRef { node: &n };
+    let root = Root { jsref: jsref };
+
+    root.AddChild();
+    jsref.AddChild();
+
+    root.RemoveChild();
+    jsref.RemoveChild();
+}