Allow return types for closures with lifetime binder

This commit is contained in:
koka 2022-11-15 12:58:17 +09:00
parent 3c7f74de0b
commit 7c4611c7e1
No known key found for this signature in database
GPG key ID: A5917A40697774CD
4 changed files with 40 additions and 22 deletions

View file

@ -1,8 +1,7 @@
use clippy_utils::diagnostics::span_lint_and_sugg; use clippy_utils::diagnostics::span_lint_and_sugg;
use clippy_utils::source::{position_before_rarrow, snippet_opt}; use clippy_utils::source::{position_before_rarrow, snippet_opt};
use if_chain::if_chain; use if_chain::if_chain;
use rustc_ast::ast; use rustc_ast::{ast, visit::FnKind, ClosureBinder};
use rustc_ast::visit::FnKind;
use rustc_errors::Applicability; use rustc_errors::Applicability;
use rustc_lint::{EarlyContext, EarlyLintPass}; use rustc_lint::{EarlyContext, EarlyLintPass};
use rustc_session::{declare_lint_pass, declare_tool_lint}; use rustc_session::{declare_lint_pass, declare_tool_lint};
@ -43,6 +42,11 @@ impl EarlyLintPass for UnusedUnit {
if let ast::TyKind::Tup(ref vals) = ty.kind; if let ast::TyKind::Tup(ref vals) = ty.kind;
if vals.is_empty() && !ty.span.from_expansion() && get_def(span) == get_def(ty.span); if vals.is_empty() && !ty.span.from_expansion() && get_def(span) == get_def(ty.span);
then { then {
// implicit types in closure signatures are forbidden when `for<...>` is present
if let FnKind::Closure(&ClosureBinder::For { .. }, ..) = kind {
return;
}
lint_unneeded_unit_return(cx, ty, span); lint_unneeded_unit_return(cx, ty, span);
} }
} }

View file

@ -7,6 +7,7 @@
// test of the JSON error format. // test of the JSON error format.
#![feature(custom_inner_attributes)] #![feature(custom_inner_attributes)]
#![feature(closure_lifetime_binder)]
#![rustfmt::skip] #![rustfmt::skip]
#![deny(clippy::unused_unit)] #![deny(clippy::unused_unit)]
@ -87,3 +88,9 @@ fn macro_expr() {
} }
e!() e!()
} }
mod issue9748 {
fn main() {
let _ = for<'a> |_: &'a u32| -> () {};
}
}

View file

@ -7,6 +7,7 @@
// test of the JSON error format. // test of the JSON error format.
#![feature(custom_inner_attributes)] #![feature(custom_inner_attributes)]
#![feature(closure_lifetime_binder)]
#![rustfmt::skip] #![rustfmt::skip]
#![deny(clippy::unused_unit)] #![deny(clippy::unused_unit)]
@ -87,3 +88,9 @@ fn macro_expr() {
} }
e!() e!()
} }
mod issue9748 {
fn main() {
let _ = for<'a> |_: &'a u32| -> () {};
}
}

View file

@ -1,119 +1,119 @@
error: unneeded unit return type error: unneeded unit return type
--> $DIR/unused_unit.rs:19:58 --> $DIR/unused_unit.rs:20:58
| |
LL | pub fn get_unit<F: Fn() -> (), G>(&self, f: F, _g: G) -> () LL | pub fn get_unit<F: Fn() -> (), G>(&self, f: F, _g: G) -> ()
| ^^^^^^ help: remove the `-> ()` | ^^^^^^ help: remove the `-> ()`
| |
note: the lint level is defined here note: the lint level is defined here
--> $DIR/unused_unit.rs:12:9 --> $DIR/unused_unit.rs:13:9
| |
LL | #![deny(clippy::unused_unit)] LL | #![deny(clippy::unused_unit)]
| ^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^
error: unneeded unit return type error: unneeded unit return type
--> $DIR/unused_unit.rs:19:28 --> $DIR/unused_unit.rs:20:28
| |
LL | pub fn get_unit<F: Fn() -> (), G>(&self, f: F, _g: G) -> () LL | pub fn get_unit<F: Fn() -> (), G>(&self, f: F, _g: G) -> ()
| ^^^^^^ help: remove the `-> ()` | ^^^^^^ help: remove the `-> ()`
error: unneeded unit return type error: unneeded unit return type
--> $DIR/unused_unit.rs:20:18 --> $DIR/unused_unit.rs:21:18
| |
LL | where G: Fn() -> () { LL | where G: Fn() -> () {
| ^^^^^^ help: remove the `-> ()` | ^^^^^^ help: remove the `-> ()`
error: unneeded unit return type error: unneeded unit return type
--> $DIR/unused_unit.rs:21:26 --> $DIR/unused_unit.rs:22:26
| |
LL | let _y: &dyn Fn() -> () = &f; LL | let _y: &dyn Fn() -> () = &f;
| ^^^^^^ help: remove the `-> ()` | ^^^^^^ help: remove the `-> ()`
error: unneeded unit return type error: unneeded unit return type
--> $DIR/unused_unit.rs:28:18 --> $DIR/unused_unit.rs:29:18
| |
LL | fn into(self) -> () { LL | fn into(self) -> () {
| ^^^^^^ help: remove the `-> ()` | ^^^^^^ help: remove the `-> ()`
error: unneeded unit expression error: unneeded unit expression
--> $DIR/unused_unit.rs:29:9 --> $DIR/unused_unit.rs:30:9
| |
LL | () LL | ()
| ^^ help: remove the final `()` | ^^ help: remove the final `()`
error: unneeded unit return type error: unneeded unit return type
--> $DIR/unused_unit.rs:34:29 --> $DIR/unused_unit.rs:35:29
| |
LL | fn redundant<F: FnOnce() -> (), G, H>(&self, _f: F, _g: G, _h: H) LL | fn redundant<F: FnOnce() -> (), G, H>(&self, _f: F, _g: G, _h: H)
| ^^^^^^ help: remove the `-> ()` | ^^^^^^ help: remove the `-> ()`
error: unneeded unit return type error: unneeded unit return type
--> $DIR/unused_unit.rs:36:19 --> $DIR/unused_unit.rs:37:19
| |
LL | G: FnMut() -> (), LL | G: FnMut() -> (),
| ^^^^^^ help: remove the `-> ()` | ^^^^^^ help: remove the `-> ()`
error: unneeded unit return type error: unneeded unit return type
--> $DIR/unused_unit.rs:37:16 --> $DIR/unused_unit.rs:38:16
| |
LL | H: Fn() -> (); LL | H: Fn() -> ();
| ^^^^^^ help: remove the `-> ()` | ^^^^^^ help: remove the `-> ()`
error: unneeded unit return type error: unneeded unit return type
--> $DIR/unused_unit.rs:41:29 --> $DIR/unused_unit.rs:42:29
| |
LL | fn redundant<F: FnOnce() -> (), G, H>(&self, _f: F, _g: G, _h: H) LL | fn redundant<F: FnOnce() -> (), G, H>(&self, _f: F, _g: G, _h: H)
| ^^^^^^ help: remove the `-> ()` | ^^^^^^ help: remove the `-> ()`
error: unneeded unit return type error: unneeded unit return type
--> $DIR/unused_unit.rs:43:19 --> $DIR/unused_unit.rs:44:19
| |
LL | G: FnMut() -> (), LL | G: FnMut() -> (),
| ^^^^^^ help: remove the `-> ()` | ^^^^^^ help: remove the `-> ()`
error: unneeded unit return type error: unneeded unit return type
--> $DIR/unused_unit.rs:44:16 --> $DIR/unused_unit.rs:45:16
| |
LL | H: Fn() -> () {} LL | H: Fn() -> () {}
| ^^^^^^ help: remove the `-> ()` | ^^^^^^ help: remove the `-> ()`
error: unneeded unit return type error: unneeded unit return type
--> $DIR/unused_unit.rs:47:17 --> $DIR/unused_unit.rs:48:17
| |
LL | fn return_unit() -> () { () } LL | fn return_unit() -> () { () }
| ^^^^^^ help: remove the `-> ()` | ^^^^^^ help: remove the `-> ()`
error: unneeded unit expression error: unneeded unit expression
--> $DIR/unused_unit.rs:47:26 --> $DIR/unused_unit.rs:48:26
| |
LL | fn return_unit() -> () { () } LL | fn return_unit() -> () { () }
| ^^ help: remove the final `()` | ^^ help: remove the final `()`
error: unneeded `()` error: unneeded `()`
--> $DIR/unused_unit.rs:57:14 --> $DIR/unused_unit.rs:58:14
| |
LL | break(); LL | break();
| ^^ help: remove the `()` | ^^ help: remove the `()`
error: unneeded `()` error: unneeded `()`
--> $DIR/unused_unit.rs:59:11 --> $DIR/unused_unit.rs:60:11
| |
LL | return(); LL | return();
| ^^ help: remove the `()` | ^^ help: remove the `()`
error: unneeded unit return type error: unneeded unit return type
--> $DIR/unused_unit.rs:76:10 --> $DIR/unused_unit.rs:77:10
| |
LL | fn test()->(){} LL | fn test()->(){}
| ^^^^ help: remove the `-> ()` | ^^^^ help: remove the `-> ()`
error: unneeded unit return type error: unneeded unit return type
--> $DIR/unused_unit.rs:79:11 --> $DIR/unused_unit.rs:80:11
| |
LL | fn test2() ->(){} LL | fn test2() ->(){}
| ^^^^^ help: remove the `-> ()` | ^^^^^ help: remove the `-> ()`
error: unneeded unit return type error: unneeded unit return type
--> $DIR/unused_unit.rs:82:11 --> $DIR/unused_unit.rs:83:11
| |
LL | fn test3()-> (){} LL | fn test3()-> (){}
| ^^^^^ help: remove the `-> ()` | ^^^^^ help: remove the `-> ()`