@@ -259,36 +259,86 @@ mod issue4291 {
259
259
}
260
260
}
261
261
262
+ mod issue2944 {
263
+ trait Foo { }
264
+ struct Bar { }
265
+ struct Baz < ' a > {
266
+ bar : & ' a Bar ,
267
+ }
268
+
269
+ impl < ' a > Foo for Baz < ' a > { }
270
+ impl Bar {
271
+ fn baz < ' a > ( & ' a self ) -> impl Foo + ' a {
272
+ Baz { bar : self }
273
+ }
274
+ }
275
+ }
276
+
262
277
mod nested_elision_sites {
263
- // Don't lint these cases, they cause FPs.
264
- // The lint does not support nested elision sites.
278
+ // issue #issue2944
265
279
266
- fn nested_fn_trait_bound < ' a > ( i : & ' a i32 ) -> impl Fn ( ) -> & ' a i32 {
280
+ // closure trait bounds subject to nested elision
281
+ // don't lint because they refer to outer lifetimes
282
+ fn trait_fn < ' a > ( i : & ' a i32 ) -> impl Fn ( ) -> & ' a i32 {
267
283
move || i
268
284
}
269
-
270
- fn nested_fn_mut_trait_bound < ' a > ( i : & ' a i32 ) -> impl FnMut ( ) -> & ' a i32 {
285
+ fn trait_fn_mut < ' a > ( i : & ' a i32 ) -> impl FnMut ( ) -> & ' a i32 {
286
+ move || i
287
+ }
288
+ fn trait_fn_once < ' a > ( i : & ' a i32 ) -> impl FnOnce ( ) -> & ' a i32 {
271
289
move || i
272
290
}
273
291
274
- fn nested_fn_once_trait_bound < ' a > ( i : & ' a i32 ) -> impl FnOnce ( ) -> & ' a i32 {
292
+ // don't lint
293
+ fn impl_trait_in_input_position < ' a > ( f : impl Fn ( ) -> & ' a i32 ) -> & ' a i32 {
294
+ f ( )
295
+ }
296
+ fn impl_trait_in_output_position < ' a > ( i : & ' a i32 ) -> impl Fn ( ) -> & ' a i32 {
275
297
move || i
276
298
}
299
+ // lint
300
+ fn impl_trait_elidable_nested_named_lifetimes < ' a > ( i : & ' a i32 , f : impl for < ' b > Fn ( & ' b i32 ) -> & ' b i32 ) -> & ' a i32 {
301
+ f ( i)
302
+ }
303
+ fn impl_trait_elidable_nested_anonymous_lifetimes < ' a > ( i : & ' a i32 , f : impl Fn ( & i32 ) -> & i32 ) -> & ' a i32 {
304
+ f ( i)
305
+ }
277
306
278
- fn nested_generic_fn_trait_bound < ' a , T : Fn ( ) -> & ' a i32 > ( f : T ) -> & ' a i32 {
307
+ // don't lint
308
+ fn generics_not_elidable < ' a , T : Fn ( ) -> & ' a i32 > ( f : T ) -> & ' a i32 {
279
309
f ( )
280
310
}
311
+ // lint
312
+ fn generics_elidable < ' a , T : Fn ( & i32 ) -> & i32 > ( i : & ' a i32 , f : T ) -> & ' a i32 {
313
+ f ( i)
314
+ }
281
315
282
- fn nested_where_clause_fn_trait_bound < ' a , T > ( f : T ) -> & ' a i32
316
+ // don't lint
317
+ fn where_clause_not_elidable < ' a , T > ( f : T ) -> & ' a i32
283
318
where
284
319
T : Fn ( ) -> & ' a i32 ,
285
320
{
286
321
f ( )
287
322
}
323
+ // lint
324
+ fn where_clause_elidadable < ' a , T > ( i : & ' a i32 , f : T ) -> & ' a i32
325
+ where
326
+ T : Fn ( & i32 ) -> & i32 ,
327
+ {
328
+ f ( i)
329
+ }
288
330
289
- fn nested_pointer_fn < ' a > ( _: & ' a i32 ) -> fn ( & ' a i32 ) -> & ' a i32 {
331
+ // don't lint
332
+ fn pointer_fn_in_input_position < ' a > ( f : fn ( & ' a i32 ) -> & ' a i32 , i : & ' a i32 ) -> & ' a i32 {
333
+ f ( i)
334
+ }
335
+ fn pointer_fn_in_output_position < ' a > ( _: & ' a i32 ) -> fn ( & ' a i32 ) -> & ' a i32 {
290
336
|i| i
291
337
}
338
+ // lint
339
+ fn pointer_fn_elidable < ' a > ( f : fn ( & i32 ) -> & i32 , i : & ' a i32 ) -> & ' a i32 {
340
+ f ( i)
341
+ }
292
342
}
293
343
294
344
fn main ( ) { }
0 commit comments