@@ -27,6 +27,14 @@ impl<T> Deref for MySmartPointer<T> {
27
27
}
28
28
}
29
29
30
+ struct S < T > ( T ) ;
31
+
32
+ impl < T > S < T > {
33
+ fn foo ( & self ) -> & T {
34
+ & self . 0 // $ fieldof=S
35
+ }
36
+ }
37
+
30
38
fn explicit_monomorphic_dereference ( ) {
31
39
// Dereference with method call
32
40
let a1 = MyIntPointer { value : 34i64 } ;
@@ -91,6 +99,9 @@ fn implicit_dereference() {
91
99
// Call method on implicitly dereferenced value
92
100
let x = MySmartPointer { value : 34i64 } ;
93
101
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
94
105
}
95
106
96
107
mod implicit_deref_coercion_cycle {
@@ -128,11 +139,90 @@ mod implicit_deref_coercion_cycle {
128
139
}
129
140
}
130
141
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
+
131
219
pub fn test ( ) {
132
220
explicit_monomorphic_dereference ( ) ; // $ target=explicit_monomorphic_dereference
133
221
explicit_polymorphic_dereference ( ) ; // $ target=explicit_polymorphic_dereference
134
222
explicit_ref_dereference ( ) ; // $ target=explicit_ref_dereference
135
223
explicit_box_dereference ( ) ; // $ target=explicit_box_dereference
136
224
implicit_dereference ( ) ; // $ target=implicit_dereference
137
225
implicit_deref_coercion_cycle:: test ( ) ; // $ target=test
226
+ ref_vs_mut_ref:: test ( ) ; // $ target=test
227
+ rust_reference_example:: main ( ) ; // $ target=main
138
228
}
0 commit comments