Auto merge of #10844 - Centri3:let_unit_value, r=Alexendoo
Don't lint `let_unit_value` when `()` is explicit since these are explicitly written (and not the result of a function call or anything else), they should be allowed, as they are both useful in some cases described in #9048 Fixes #9048 changelog: [`let_unit_value`]: Don't lint when `()` is explicit
This commit is contained in:
commit
394f63fe94
7 changed files with 71 additions and 127 deletions
|
|
@ -13,12 +13,31 @@ use rustc_middle::ty;
|
|||
use super::LET_UNIT_VALUE;
|
||||
|
||||
pub(super) fn check<'tcx>(cx: &LateContext<'tcx>, local: &'tcx Local<'_>) {
|
||||
// skip `let () = { ... }`
|
||||
if let PatKind::Tuple(fields, ..) = local.pat.kind
|
||||
&& fields.is_empty()
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if let Some(init) = local.init
|
||||
&& !local.pat.span.from_expansion()
|
||||
&& !in_external_macro(cx.sess(), local.span)
|
||||
&& !is_from_async_await(local.span)
|
||||
&& cx.typeck_results().pat_ty(local.pat).is_unit()
|
||||
{
|
||||
// skip `let awa = ()`
|
||||
if let ExprKind::Tup([]) = init.kind {
|
||||
return;
|
||||
}
|
||||
|
||||
// skip `let _: () = { ... }`
|
||||
if let Some(ty) = local.ty
|
||||
&& let TyKind::Tup([]) = ty.kind
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (local.ty.map_or(false, |ty| !matches!(ty.kind, TyKind::Infer))
|
||||
|| matches!(local.pat.kind, PatKind::Tuple([], ddpos) if ddpos.as_opt_usize().is_none()))
|
||||
&& expr_needs_inferred_result(cx, init)
|
||||
|
|
@ -34,7 +53,7 @@ pub(super) fn check<'tcx>(cx: &LateContext<'tcx>, local: &'tcx Local<'_>) {
|
|||
|diag| {
|
||||
diag.span_suggestion(
|
||||
local.pat.span,
|
||||
"use a wild (`_`) binding",
|
||||
"use a wildcard binding",
|
||||
"_",
|
||||
Applicability::MaybeIncorrect, // snippet
|
||||
);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue