summaryrefslogtreecommitdiffstats
path: root/src/test/ui/methods/method-projection.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/test/ui/methods/method-projection.rs')
-rw-r--r--src/test/ui/methods/method-projection.rs61
1 files changed, 61 insertions, 0 deletions
diff --git a/src/test/ui/methods/method-projection.rs b/src/test/ui/methods/method-projection.rs
new file mode 100644
index 000000000..21d983f19
--- /dev/null
+++ b/src/test/ui/methods/method-projection.rs
@@ -0,0 +1,61 @@
+// run-pass
+// Test that we can use method notation to call methods based on a
+// projection bound from a trait. Issue #20469.
+
+trait MakeString {
+ fn make_string(&self) -> String;
+}
+
+impl MakeString for isize {
+ fn make_string(&self) -> String {
+ format!("{}", *self)
+ }
+}
+
+impl MakeString for usize {
+ fn make_string(&self) -> String {
+ format!("{}", *self)
+ }
+}
+
+trait Foo {
+ type F: MakeString;
+
+ fn get(&self) -> &Self::F;
+}
+
+fn foo<F:Foo>(f: &F) -> String {
+ f.get().make_string()
+}
+
+struct SomeStruct {
+ field: isize,
+}
+
+impl Foo for SomeStruct {
+ type F = isize;
+
+ fn get(&self) -> &isize {
+ &self.field
+ }
+}
+
+struct SomeOtherStruct {
+ field: usize,
+}
+
+impl Foo for SomeOtherStruct {
+ type F = usize;
+
+ fn get(&self) -> &usize {
+ &self.field
+ }
+}
+
+fn main() {
+ let x = SomeStruct { field: 22 };
+ assert_eq!(foo(&x), format!("22"));
+
+ let x = SomeOtherStruct { field: 44 };
+ assert_eq!(foo(&x), format!("44"));
+}