Skip to content

Commit 9720619

Browse files
committed
Auto merge of rust-lang#7901 - samueltardieu:fix-7893, r=xFrednet,flip1995
Prevent clippy::needless_lifetimes false positive in async function definition Scan `OpaqueDef` bounds for lifetimes as well. Those `OpaqueDef` instances are generated while desugaring an `async` function definition. This fixes rust-lang#7893 changelog: Prevent [`clippy::needless_lifetimes`] false positive in `async` function definition
2 parents 276e895 + 9bcf966 commit 9720619

File tree

3 files changed

+32
-23
lines changed

3 files changed

+32
-23
lines changed

clippy_lints/src/lifetimes.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -378,11 +378,15 @@ impl<'a, 'tcx> Visitor<'tcx> for RefVisitor<'a, 'tcx> {
378378

379379
fn visit_ty(&mut self, ty: &'tcx Ty<'_>) {
380380
match ty.kind {
381-
TyKind::OpaqueDef(item, _) => {
381+
TyKind::OpaqueDef(item, bounds) => {
382382
let map = self.cx.tcx.hir();
383383
let item = map.item(item);
384384
walk_item(self, item);
385385
walk_ty(self, ty);
386+
self.lts.extend(bounds.iter().filter_map(|bound| match bound {
387+
GenericArg::Lifetime(l) => Some(RefLt::Named(l.name.ident().name)),
388+
_ => None,
389+
}));
386390
},
387391
TyKind::BareFn(&BareFnTy { decl, .. }) => {
388392
let mut sub_visitor = RefVisitor::new(self.cx);

tests/ui/needless_lifetimes.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,11 @@ fn multiple_in_and_out_2<'a, 'b>(x: &'a u8, _y: &'b u8) -> &'a u8 {
2727
x
2828
}
2929

30+
// No error; multiple input refs
31+
async fn func<'a>(args: &[&'a str]) -> Option<&'a str> {
32+
args.get(0).cloned()
33+
}
34+
3035
// No error; static involved.
3136
fn in_static_and_out<'a>(x: &'a u8, _y: &'static u8) -> &'a u8 {
3237
x

tests/ui/needless_lifetimes.stderr

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -19,133 +19,133 @@ LL | fn in_and_out<'a>(x: &'a u8, _y: u8) -> &'a u8 {
1919
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
2020

2121
error: explicit lifetimes given in parameter types where they could be elided (or replaced with `'_` if needed by type declaration)
22-
--> $DIR/needless_lifetimes.rs:45:1
22+
--> $DIR/needless_lifetimes.rs:50:1
2323
|
2424
LL | fn deep_reference_3<'a>(x: &'a u8, _y: u8) -> Result<&'a u8, ()> {
2525
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
2626

2727
error: explicit lifetimes given in parameter types where they could be elided (or replaced with `'_` if needed by type declaration)
28-
--> $DIR/needless_lifetimes.rs:50:1
28+
--> $DIR/needless_lifetimes.rs:55:1
2929
|
3030
LL | fn where_clause_without_lt<'a, T>(x: &'a u8, _y: u8) -> Result<&'a u8, ()>
3131
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
3232

3333
error: explicit lifetimes given in parameter types where they could be elided (or replaced with `'_` if needed by type declaration)
34-
--> $DIR/needless_lifetimes.rs:62:1
34+
--> $DIR/needless_lifetimes.rs:67:1
3535
|
3636
LL | fn lifetime_param_2<'a, 'b>(_x: Ref<'a>, _y: &'b u8) {}
3737
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
3838

3939
error: explicit lifetimes given in parameter types where they could be elided (or replaced with `'_` if needed by type declaration)
40-
--> $DIR/needless_lifetimes.rs:86:1
40+
--> $DIR/needless_lifetimes.rs:91:1
4141
|
4242
LL | fn fn_bound_2<'a, F, I>(_m: Lt<'a, I>, _f: F) -> Lt<'a, I>
4343
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
4444

4545
error: explicit lifetimes given in parameter types where they could be elided (or replaced with `'_` if needed by type declaration)
46-
--> $DIR/needless_lifetimes.rs:116:5
46+
--> $DIR/needless_lifetimes.rs:121:5
4747
|
4848
LL | fn self_and_out<'s>(&'s self) -> &'s u8 {
4949
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
5050

5151
error: explicit lifetimes given in parameter types where they could be elided (or replaced with `'_` if needed by type declaration)
52-
--> $DIR/needless_lifetimes.rs:125:5
52+
--> $DIR/needless_lifetimes.rs:130:5
5353
|
5454
LL | fn distinct_self_and_in<'s, 't>(&'s self, _x: &'t u8) {}
5555
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
5656

5757
error: explicit lifetimes given in parameter types where they could be elided (or replaced with `'_` if needed by type declaration)
58-
--> $DIR/needless_lifetimes.rs:144:1
58+
--> $DIR/needless_lifetimes.rs:149:1
5959
|
6060
LL | fn struct_with_lt<'a>(_foo: Foo<'a>) -> &'a str {
6161
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
6262

6363
error: explicit lifetimes given in parameter types where they could be elided (or replaced with `'_` if needed by type declaration)
64-
--> $DIR/needless_lifetimes.rs:174:1
64+
--> $DIR/needless_lifetimes.rs:179:1
6565
|
6666
LL | fn trait_obj_elided2<'a>(_arg: &'a dyn Drop) -> &'a str {
6767
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
6868

6969
error: explicit lifetimes given in parameter types where they could be elided (or replaced with `'_` if needed by type declaration)
70-
--> $DIR/needless_lifetimes.rs:180:1
70+
--> $DIR/needless_lifetimes.rs:185:1
7171
|
7272
LL | fn alias_with_lt<'a>(_foo: FooAlias<'a>) -> &'a str {
7373
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
7474

7575
error: explicit lifetimes given in parameter types where they could be elided (or replaced with `'_` if needed by type declaration)
76-
--> $DIR/needless_lifetimes.rs:199:1
76+
--> $DIR/needless_lifetimes.rs:204:1
7777
|
7878
LL | fn named_input_elided_output<'a>(_arg: &'a str) -> &str {
7979
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
8080

8181
error: explicit lifetimes given in parameter types where they could be elided (or replaced with `'_` if needed by type declaration)
82-
--> $DIR/needless_lifetimes.rs:207:1
82+
--> $DIR/needless_lifetimes.rs:212:1
8383
|
8484
LL | fn trait_bound_ok<'a, T: WithLifetime<'static>>(_: &'a u8, _: T) {
8585
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
8686

8787
error: explicit lifetimes given in parameter types where they could be elided (or replaced with `'_` if needed by type declaration)
88-
--> $DIR/needless_lifetimes.rs:243:1
88+
--> $DIR/needless_lifetimes.rs:248:1
8989
|
9090
LL | fn out_return_type_lts<'a>(e: &'a str) -> Cow<'a> {
9191
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
9292

9393
error: explicit lifetimes given in parameter types where they could be elided (or replaced with `'_` if needed by type declaration)
94-
--> $DIR/needless_lifetimes.rs:250:9
94+
--> $DIR/needless_lifetimes.rs:255:9
9595
|
9696
LL | fn needless_lt<'a>(x: &'a u8) {}
9797
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
9898

9999
error: explicit lifetimes given in parameter types where they could be elided (or replaced with `'_` if needed by type declaration)
100-
--> $DIR/needless_lifetimes.rs:254:9
100+
--> $DIR/needless_lifetimes.rs:259:9
101101
|
102102
LL | fn needless_lt<'a>(_x: &'a u8) {}
103103
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
104104

105105
error: explicit lifetimes given in parameter types where they could be elided (or replaced with `'_` if needed by type declaration)
106-
--> $DIR/needless_lifetimes.rs:267:9
106+
--> $DIR/needless_lifetimes.rs:272:9
107107
|
108108
LL | fn baz<'a>(&'a self) -> impl Foo + 'a {
109109
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
110110

111111
error: explicit lifetimes given in parameter types where they could be elided (or replaced with `'_` if needed by type declaration)
112-
--> $DIR/needless_lifetimes.rs:296:5
112+
--> $DIR/needless_lifetimes.rs:301:5
113113
|
114114
LL | fn impl_trait_elidable_nested_named_lifetimes<'a>(i: &'a i32, f: impl for<'b> Fn(&'b i32) -> &'b i32) -> &'a i32 {
115115
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
116116

117117
error: explicit lifetimes given in parameter types where they could be elided (or replaced with `'_` if needed by type declaration)
118-
--> $DIR/needless_lifetimes.rs:299:5
118+
--> $DIR/needless_lifetimes.rs:304:5
119119
|
120120
LL | fn impl_trait_elidable_nested_anonymous_lifetimes<'a>(i: &'a i32, f: impl Fn(&i32) -> &i32) -> &'a i32 {
121121
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
122122

123123
error: explicit lifetimes given in parameter types where they could be elided (or replaced with `'_` if needed by type declaration)
124-
--> $DIR/needless_lifetimes.rs:308:5
124+
--> $DIR/needless_lifetimes.rs:313:5
125125
|
126126
LL | fn generics_elidable<'a, T: Fn(&i32) -> &i32>(i: &'a i32, f: T) -> &'a i32 {
127127
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
128128

129129
error: explicit lifetimes given in parameter types where they could be elided (or replaced with `'_` if needed by type declaration)
130-
--> $DIR/needless_lifetimes.rs:320:5
130+
--> $DIR/needless_lifetimes.rs:325:5
131131
|
132132
LL | fn where_clause_elidadable<'a, T>(i: &'a i32, f: T) -> &'a i32
133133
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
134134

135135
error: explicit lifetimes given in parameter types where they could be elided (or replaced with `'_` if needed by type declaration)
136-
--> $DIR/needless_lifetimes.rs:335:5
136+
--> $DIR/needless_lifetimes.rs:340:5
137137
|
138138
LL | fn pointer_fn_elidable<'a>(i: &'a i32, f: fn(&i32) -> &i32) -> &'a i32 {
139139
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
140140

141141
error: explicit lifetimes given in parameter types where they could be elided (or replaced with `'_` if needed by type declaration)
142-
--> $DIR/needless_lifetimes.rs:348:5
142+
--> $DIR/needless_lifetimes.rs:353:5
143143
|
144144
LL | fn nested_fn_pointer_3<'a>(_: &'a i32) -> fn(fn(&i32) -> &i32) -> i32 {
145145
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
146146

147147
error: explicit lifetimes given in parameter types where they could be elided (or replaced with `'_` if needed by type declaration)
148-
--> $DIR/needless_lifetimes.rs:351:5
148+
--> $DIR/needless_lifetimes.rs:356:5
149149
|
150150
LL | fn nested_fn_pointer_4<'a>(_: &'a i32) -> impl Fn(fn(&i32)) {
151151
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

0 commit comments

Comments
 (0)