@@ -27,6 +27,14 @@ impl<T> Deref for MySmartPointer<T> {
2727 }
2828}
2929
30+ struct S < T > ( T ) ;
31+
32+ impl < T > S < T > {
33+ fn foo ( & self ) -> & T {
34+ & self . 0 // $ fieldof=S
35+ }
36+ }
37+
3038fn explicit_monomorphic_dereference ( ) {
3139 // Dereference with method call
3240 let a1 = MyIntPointer { value : 34i64 } ;
@@ -91,6 +99,9 @@ fn implicit_dereference() {
9199 // Call method on implicitly dereferenced value
92100 let x = MySmartPointer { value : 34i64 } ;
93101 let _y = x. is_positive ( ) ; // $ MISSING: target=is_positive type=_y:bool
102+
103+ let z = MySmartPointer { value : S ( 0i64 ) } ;
104+ let z_ = z. foo ( ) ; // $ MISSING: target=foo type=z_:&T.i64
94105}
95106
96107mod implicit_deref_coercion_cycle {
@@ -128,11 +139,90 @@ mod implicit_deref_coercion_cycle {
128139 }
129140}
130141
142+ mod ref_vs_mut_ref {
143+ trait MyTrait1 < T > {
144+ fn foo ( self ) -> T ;
145+ }
146+
147+ struct S ;
148+
149+ impl MyTrait1 < S > for & S {
150+ // MyTrait1::foo1
151+ fn foo ( self ) -> S {
152+ S
153+ }
154+ }
155+
156+ impl MyTrait1 < i64 > for & mut S {
157+ // MyTrait1::foo2
158+ fn foo ( self ) -> i64 {
159+ 42
160+ }
161+ }
162+
163+ trait MyTrait2 < T1 , T2 > {
164+ fn bar ( self , arg : T1 ) -> T2 ;
165+ }
166+
167+ impl MyTrait2 < & S , S > for S {
168+ // MyTrait2::bar1
169+ fn bar ( self , arg : & S ) -> S {
170+ S
171+ }
172+ }
173+
174+ impl MyTrait2 < & mut S , i64 > for S {
175+ // MyTrait2::bar2
176+ fn bar ( self , arg : & mut S ) -> i64 {
177+ 42
178+ }
179+ }
180+
181+ pub fn test ( ) {
182+ let x = ( & S ) . foo ( ) ; // $ MISSING: target=MyTrait1::foo1 type=x:S
183+ let y = S . foo ( ) ; // $ MISSING: target=MyTrait1::foo1 type=y:S
184+ let z = ( & mut S ) . foo ( ) ; // $ MISSING: target=MyTrait1::foo2 type=z:i64
185+
186+ let x = S . bar ( & S ) ; // $ target=MyTrait2::bar1 type=x:S $ SPURIOUS: target=MyTrait2::bar2
187+ let y = S . bar ( & mut S ) ; // $ target=MyTrait2::bar2 type=y:i64 $ SPURIOUS: target=MyTrait2::bar1
188+ }
189+ }
190+
191+ // from https://doc.rust-lang.org/reference/expressions/method-call-expr.html#r-expr.method.candidate-search
192+ mod rust_reference_example {
193+ struct Foo { }
194+
195+ trait Bar {
196+ fn bar ( & self ) ;
197+ }
198+
199+ impl Foo {
200+ // bar1
201+ fn bar ( & mut self ) {
202+ println ! ( "In struct impl!" )
203+ }
204+ }
205+
206+ impl Bar for Foo {
207+ // bar2
208+ fn bar ( & self ) {
209+ println ! ( "In trait impl!" )
210+ }
211+ }
212+
213+ pub fn main ( ) {
214+ let mut f = Foo { } ;
215+ f. bar ( ) ; // $ SPURIOUS: target=bar1 $ MISSING: target=bar2
216+ }
217+ }
218+
131219pub fn test ( ) {
132220 explicit_monomorphic_dereference ( ) ; // $ target=explicit_monomorphic_dereference
133221 explicit_polymorphic_dereference ( ) ; // $ target=explicit_polymorphic_dereference
134222 explicit_ref_dereference ( ) ; // $ target=explicit_ref_dereference
135223 explicit_box_dereference ( ) ; // $ target=explicit_box_dereference
136224 implicit_dereference ( ) ; // $ target=implicit_dereference
137225 implicit_deref_coercion_cycle:: test ( ) ; // $ target=test
226+ ref_vs_mut_ref:: test ( ) ; // $ target=test
227+ rust_reference_example:: main ( ) ; // $ target=main
138228}
0 commit comments