summaryrefslogtreecommitdiffstats
path: root/src/test/ui/overloaded/overloaded-index-in-field.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/test/ui/overloaded/overloaded-index-in-field.rs')
-rw-r--r--src/test/ui/overloaded/overloaded-index-in-field.rs46
1 files changed, 46 insertions, 0 deletions
diff --git a/src/test/ui/overloaded/overloaded-index-in-field.rs b/src/test/ui/overloaded/overloaded-index-in-field.rs
new file mode 100644
index 000000000..8a1fa7deb
--- /dev/null
+++ b/src/test/ui/overloaded/overloaded-index-in-field.rs
@@ -0,0 +1,46 @@
+// run-pass
+// Test using overloaded indexing when the "map" is stored in a
+// field. This caused problems at some point.
+
+use std::ops::Index;
+
+struct Foo {
+ x: isize,
+ y: isize,
+}
+
+struct Bar {
+ foo: Foo
+}
+
+impl Index<isize> for Foo {
+ type Output = isize;
+
+ fn index(&self, z: isize) -> &isize {
+ if z == 0 {
+ &self.x
+ } else {
+ &self.y
+ }
+ }
+}
+
+trait Int {
+ fn get(self) -> isize;
+ fn get_from_ref(&self) -> isize;
+ fn inc(&mut self);
+}
+
+impl Int for isize {
+ fn get(self) -> isize { self }
+ fn get_from_ref(&self) -> isize { *self }
+ fn inc(&mut self) { *self += 1; }
+}
+
+fn main() {
+ let f = Bar { foo: Foo {
+ x: 1,
+ y: 2,
+ } };
+ assert_eq!(f.foo[1].get(), 2);
+}