1- mod m1 {
1+ mod field_access {
2+ #[derive(Debug)]
3+ struct S;
4+
5+ #[derive(Debug)]
6+ struct MyThing {
7+ a: S,
8+ }
9+
10+ #[derive(Debug)]
11+ enum MyOption<T> {
12+ MyNone(),
13+ MySome(T),
14+ }
15+
16+ #[derive(Debug)]
17+ struct GenericThing<A> {
18+ a: A,
19+ }
20+
21+ struct OptionS {
22+ a: MyOption<S>,
23+ }
24+
25+ fn simple_field_access() {
26+ let x = MyThing { a: S };
27+ println!("{:?}", x.a);
28+ }
29+
30+ fn generic_field_access() {
31+ // Explicit type argument
32+ let x = GenericThing::<S> { a: S };
33+ println!("{:?}", x.a);
34+
35+ // Implicit type argument
36+ let y = GenericThing { a: S };
37+ println!("{:?}", x.a);
38+
39+ // The type of the field `a` can only be infered from the concrete type
40+ // in the struct declaration.
41+ let x = OptionS {
42+ a: MyOption::MyNone(),
43+ };
44+ println!("{:?}", x.a);
45+
46+ // The type of the field `a` can only be infered from the type argument
47+ let x = GenericThing::<MyOption<S>> {
48+ a: MyOption::MyNone(),
49+ };
50+ println!("{:?}", x.a);
51+
52+ let mut x = GenericThing {
53+ a: MyOption::MyNone(),
54+ };
55+ // Only after this access can we infer the type parameter of `x`
56+ let a: MyOption<S> = x.a;
57+ println!("{:?}", a);
58+ }
59+
60+ pub fn f() {
61+ simple_field_access();
62+ generic_field_access();
63+ }
64+ }
65+
66+ mod method_impl {
267 pub struct Foo {}
368
469 impl Foo {
@@ -25,7 +90,7 @@ mod m1 {
2590 }
2691}
2792
28- mod m2 {
93+ mod method_non_parametric_impl {
2994 #[derive(Debug)]
3095 struct MyThing<A> {
3196 a: A,
@@ -58,6 +123,10 @@ mod m2 {
58123 let x = MyThing { a: S1 };
59124 let y = MyThing { a: S2 };
60125
126+ // simple field access
127+ println!("{:?}", x.a);
128+ println!("{:?}", y.a);
129+
61130 println!("{:?}", x.m1()); // missing call target
62131 println!("{:?}", y.m1().a); // missing call target
63132
@@ -69,7 +138,7 @@ mod m2 {
69138 }
70139}
71140
72- mod m3 {
141+ mod method_non_parametric_trait_impl {
73142 #[derive(Debug)]
74143 struct MyThing<A> {
75144 a: A,
@@ -122,7 +191,7 @@ mod m3 {
122191 }
123192}
124193
125- mod m4 {
194+ mod function_trait_bounds {
126195 #[derive(Debug)]
127196 struct MyThing<A> {
128197 a: A,
@@ -175,7 +244,7 @@ mod m4 {
175244 }
176245}
177246
178- mod m5 {
247+ mod trait_associated_type {
179248 trait MyTrait {
180249 type AssociatedType;
181250
@@ -210,7 +279,7 @@ mod m5 {
210279 }
211280}
212281
213- mod m6 {
282+ mod generic_enum {
214283 #[derive(Debug)]
215284 enum MyEnum<A> {
216285 C1(A),
@@ -240,7 +309,7 @@ mod m6 {
240309 }
241310}
242311
243- mod m7 {
312+ mod method_supertraits {
244313 #[derive(Debug)]
245314 struct MyThing<A> {
246315 a: A,
@@ -325,7 +394,7 @@ mod m7 {
325394 }
326395}
327396
328- mod m8 {
397+ mod function_trait_bounds_2 {
329398 use std::convert::From;
330399 use std::fmt::Debug;
331400
@@ -374,7 +443,7 @@ mod m8 {
374443 }
375444}
376445
377- mod m9 {
446+ mod option_methods {
378447 #[derive(Debug)]
379448 enum MyOption<T> {
380449 MyNone(),
@@ -456,7 +525,7 @@ mod m9 {
456525 }
457526}
458527
459- mod m10 {
528+ mod method_call_type_conversion {
460529
461530 #[derive(Debug, Copy, Clone)]
462531 struct S<T>(T);
@@ -508,7 +577,7 @@ mod m10 {
508577 }
509578}
510579
511- mod m11 {
580+ mod trait_implicit_self_borrow {
512581 trait MyTrait {
513582 fn foo(&self) -> &Self;
514583
@@ -531,7 +600,7 @@ mod m11 {
531600 }
532601}
533602
534- mod m12 {
603+ mod implicit_self_borrow {
535604 struct S;
536605
537606 struct MyStruct<T>(T);
@@ -548,7 +617,7 @@ mod m12 {
548617 }
549618}
550619
551- mod m13 {
620+ mod borrowed_typed {
552621 struct S;
553622
554623 impl S {
@@ -578,18 +647,19 @@ mod m13 {
578647}
579648
580649fn main() {
581- m1::f();
582- m1::g(m1::Foo {}, m1::Foo {});
583- m2::f();
584- m3::f();
585- m4::f();
586- m5::f();
587- m6::f();
588- m7::f();
589- m8::f();
590- m9::f();
591- m10::f();
592- m11::f();
593- m12::f();
594- m13::f();
650+ field_access::f();
651+ method_impl::f();
652+ method_impl::g(method_impl::Foo {}, method_impl::Foo {});
653+ method_non_parametric_impl::f();
654+ method_non_parametric_trait_impl::f();
655+ function_trait_bounds::f();
656+ trait_associated_type::f();
657+ generic_enum::f();
658+ method_supertraits::f();
659+ function_trait_bounds_2::f();
660+ option_methods::f();
661+ method_call_type_conversion::f();
662+ trait_implicit_self_borrow::f();
663+ implicit_self_borrow::f();
664+ borrowed_typed::f();
595665}
0 commit comments