Rollup merge of #109158 - Ezrashaw:expand-sugg-for-unused-lint, r=Nilstrieb

error-msg: expand suggestion for `unused_def` lint

Fixes #108885

Expands `let _ = ..` suggestion into more positions.
This commit is contained in:
Matthias Krüger 2023-03-16 08:57:07 +01:00 committed by GitHub
commit 36b82373e0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 138 additions and 31 deletions

View File

@ -1390,7 +1390,7 @@ pub struct UnusedOp<'a> {
pub op: &'a str, pub op: &'a str,
#[label] #[label]
pub label: Span, pub label: Span,
#[suggestion(style = "verbose", code = "let _ = ", applicability = "machine-applicable")] #[suggestion(style = "verbose", code = "let _ = ", applicability = "maybe-incorrect")]
pub suggestion: Span, pub suggestion: Span,
} }
@ -1434,17 +1434,15 @@ pub struct UnusedDef<'a, 'b> {
} }
#[derive(Subdiagnostic)] #[derive(Subdiagnostic)]
pub enum UnusedDefSuggestion {
#[suggestion( #[suggestion(
lint_suggestion, lint_suggestion,
style = "verbose", style = "verbose",
code = "let _ = ", code = "let _ = ",
applicability = "machine-applicable" applicability = "maybe-incorrect"
)] )]
Default { pub struct UnusedDefSuggestion {
#[primary_span] #[primary_span]
span: Span, pub span: Span,
},
} }
// Needed because of def_path_str // Needed because of def_path_str

View File

@ -123,7 +123,7 @@ impl<'tcx> LateLintPass<'tcx> for UnusedResults {
let must_use_result = is_ty_must_use(cx, ty, &expr, expr.span); let must_use_result = is_ty_must_use(cx, ty, &expr, expr.span);
let type_lint_emitted_or_suppressed = match must_use_result { let type_lint_emitted_or_suppressed = match must_use_result {
Some(path) => { Some(path) => {
emit_must_use_untranslated(cx, &path, "", "", 1); emit_must_use_untranslated(cx, &path, "", "", 1, false);
true true
} }
None => false, None => false,
@ -358,6 +358,7 @@ impl<'tcx> LateLintPass<'tcx> for UnusedResults {
descr_pre_path, descr_pre_path,
descr_post_path, descr_post_path,
1, 1,
false,
) )
}) })
.is_some() .is_some()
@ -370,6 +371,7 @@ impl<'tcx> LateLintPass<'tcx> for UnusedResults {
descr_pre: &str, descr_pre: &str,
descr_post: &str, descr_post: &str,
plural_len: usize, plural_len: usize,
is_inner: bool,
) { ) {
let plural_suffix = pluralize!(plural_len); let plural_suffix = pluralize!(plural_len);
@ -377,20 +379,22 @@ impl<'tcx> LateLintPass<'tcx> for UnusedResults {
MustUsePath::Suppressed => {} MustUsePath::Suppressed => {}
MustUsePath::Boxed(path) => { MustUsePath::Boxed(path) => {
let descr_pre = &format!("{}boxed ", descr_pre); let descr_pre = &format!("{}boxed ", descr_pre);
emit_must_use_untranslated(cx, path, descr_pre, descr_post, plural_len); emit_must_use_untranslated(cx, path, descr_pre, descr_post, plural_len, true);
} }
MustUsePath::Opaque(path) => { MustUsePath::Opaque(path) => {
let descr_pre = &format!("{}implementer{} of ", descr_pre, plural_suffix); let descr_pre = &format!("{}implementer{} of ", descr_pre, plural_suffix);
emit_must_use_untranslated(cx, path, descr_pre, descr_post, plural_len); emit_must_use_untranslated(cx, path, descr_pre, descr_post, plural_len, true);
} }
MustUsePath::TraitObject(path) => { MustUsePath::TraitObject(path) => {
let descr_post = &format!(" trait object{}{}", plural_suffix, descr_post); let descr_post = &format!(" trait object{}{}", plural_suffix, descr_post);
emit_must_use_untranslated(cx, path, descr_pre, descr_post, plural_len); emit_must_use_untranslated(cx, path, descr_pre, descr_post, plural_len, true);
} }
MustUsePath::TupleElement(elems) => { MustUsePath::TupleElement(elems) => {
for (index, path) in elems { for (index, path) in elems {
let descr_post = &format!(" in tuple element {}", index); let descr_post = &format!(" in tuple element {}", index);
emit_must_use_untranslated(cx, path, descr_pre, descr_post, plural_len); emit_must_use_untranslated(
cx, path, descr_pre, descr_post, plural_len, true,
);
} }
} }
MustUsePath::Array(path, len) => { MustUsePath::Array(path, len) => {
@ -401,6 +405,7 @@ impl<'tcx> LateLintPass<'tcx> for UnusedResults {
descr_pre, descr_pre,
descr_post, descr_post,
plural_len.saturating_add(usize::try_from(*len).unwrap_or(usize::MAX)), plural_len.saturating_add(usize::try_from(*len).unwrap_or(usize::MAX)),
true,
); );
} }
MustUsePath::Closure(span) => { MustUsePath::Closure(span) => {
@ -418,19 +423,6 @@ impl<'tcx> LateLintPass<'tcx> for UnusedResults {
); );
} }
MustUsePath::Def(span, def_id, reason) => { MustUsePath::Def(span, def_id, reason) => {
let suggestion = if matches!(
cx.tcx.get_diagnostic_name(*def_id),
Some(sym::add)
| Some(sym::sub)
| Some(sym::mul)
| Some(sym::div)
| Some(sym::rem)
| Some(sym::neg),
) {
Some(UnusedDefSuggestion::Default { span: span.shrink_to_lo() })
} else {
None
};
cx.emit_spanned_lint( cx.emit_spanned_lint(
UNUSED_MUST_USE, UNUSED_MUST_USE,
*span, *span,
@ -440,7 +432,8 @@ impl<'tcx> LateLintPass<'tcx> for UnusedResults {
cx, cx,
def_id: *def_id, def_id: *def_id,
note: *reason, note: *reason,
suggestion, suggestion: (!is_inner)
.then_some(UnusedDefSuggestion { span: span.shrink_to_lo() }),
}, },
); );
} }

View File

@ -35,6 +35,10 @@ note: the lint level is defined here
| |
LL | #![warn(unused_must_use)] LL | #![warn(unused_must_use)]
| ^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^
help: use `let _ = ...` to ignore the resulting value
|
LL | let _ = MustUseDeprecated::new();
| +++++++
warning: 5 warnings emitted warning: 5 warnings emitted

View File

@ -10,12 +10,21 @@ note: the lint level is defined here
| |
LL | #![warn(unused_must_use)] LL | #![warn(unused_must_use)]
| ^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^
help: use `let _ = ...` to ignore the resulting value
|
LL | let _ = need_to_use_this_value();
| +++++++
warning: unused return value of `MyStruct::need_to_use_this_method_value` that must be used warning: unused return value of `MyStruct::need_to_use_this_method_value` that must be used
--> $DIR/fn_must_use.rs:60:5 --> $DIR/fn_must_use.rs:60:5
| |
LL | m.need_to_use_this_method_value(); LL | m.need_to_use_this_method_value();
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
help: use `let _ = ...` to ignore the resulting value
|
LL | let _ = m.need_to_use_this_method_value();
| +++++++
warning: unused return value of `EvenNature::is_even` that must be used warning: unused return value of `EvenNature::is_even` that must be used
--> $DIR/fn_must_use.rs:61:5 --> $DIR/fn_must_use.rs:61:5
@ -24,24 +33,43 @@ LL | m.is_even(); // trait method!
| ^^^^^^^^^^^ | ^^^^^^^^^^^
| |
= note: no side effects = note: no side effects
help: use `let _ = ...` to ignore the resulting value
|
LL | let _ = m.is_even(); // trait method!
| +++++++
warning: unused return value of `MyStruct::need_to_use_this_associated_function_value` that must be used warning: unused return value of `MyStruct::need_to_use_this_associated_function_value` that must be used
--> $DIR/fn_must_use.rs:64:5 --> $DIR/fn_must_use.rs:64:5
| |
LL | MyStruct::need_to_use_this_associated_function_value(); LL | MyStruct::need_to_use_this_associated_function_value();
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
help: use `let _ = ...` to ignore the resulting value
|
LL | let _ = MyStruct::need_to_use_this_associated_function_value();
| +++++++
warning: unused return value of `std::cmp::PartialEq::eq` that must be used warning: unused return value of `std::cmp::PartialEq::eq` that must be used
--> $DIR/fn_must_use.rs:70:5 --> $DIR/fn_must_use.rs:70:5
| |
LL | 2.eq(&3); LL | 2.eq(&3);
| ^^^^^^^^ | ^^^^^^^^
|
help: use `let _ = ...` to ignore the resulting value
|
LL | let _ = 2.eq(&3);
| +++++++
warning: unused return value of `std::cmp::PartialEq::eq` that must be used warning: unused return value of `std::cmp::PartialEq::eq` that must be used
--> $DIR/fn_must_use.rs:71:5 --> $DIR/fn_must_use.rs:71:5
| |
LL | m.eq(&n); LL | m.eq(&n);
| ^^^^^^^^ | ^^^^^^^^
|
help: use `let _ = ...` to ignore the resulting value
|
LL | let _ = m.eq(&n);
| +++++++
warning: unused comparison that must be used warning: unused comparison that must be used
--> $DIR/fn_must_use.rs:74:5 --> $DIR/fn_must_use.rs:74:5

View File

@ -10,6 +10,10 @@ note: the lint level is defined here
| |
LL | #![warn(unused_must_use)] LL | #![warn(unused_must_use)]
| ^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^
help: use `let _ = ...` to ignore the resulting value
|
LL | let _ = Box::from_raw(ptr);
| +++++++
warning: 1 warning emitted warning: 1 warning emitted

View File

@ -9,12 +9,21 @@ note: the lint level is defined here
| |
LL | #![deny(unused_must_use)] LL | #![deny(unused_must_use)]
| ^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^
help: use `let _ = ...` to ignore the resulting value
|
LL | let _ = foo();
| +++++++
error: unused return value of `bar` that must be used error: unused return value of `bar` that must be used
--> $DIR/must_use-unit.rs:15:5 --> $DIR/must_use-unit.rs:15:5
| |
LL | bar(); LL | bar();
| ^^^^^ | ^^^^^
|
help: use `let _ = ...` to ignore the resulting value
|
LL | let _ = bar();
| +++++++
error: aborting due to 2 previous errors error: aborting due to 2 previous errors

View File

@ -16,12 +16,22 @@ error: unused return value of `foo` that must be used
| |
LL | foo(); LL | foo();
| ^^^^^ | ^^^^^
|
help: use `let _ = ...` to ignore the resulting value
|
LL | let _ = foo();
| +++++++
error: unused output of future returned by `foo` that must be used error: unused output of future returned by `foo` that must be used
--> $DIR/unused-async.rs:33:5 --> $DIR/unused-async.rs:33:5
| |
LL | foo().await; LL | foo().await;
| ^^^^^^^^^^^ | ^^^^^^^^^^^
|
help: use `let _ = ...` to ignore the resulting value
|
LL | let _ = foo().await;
| +++++++
error: unused implementer of `Future` that must be used error: unused implementer of `Future` that must be used
--> $DIR/unused-async.rs:34:5 --> $DIR/unused-async.rs:34:5
@ -36,12 +46,22 @@ error: unused return value of `bar` that must be used
| |
LL | bar(); LL | bar();
| ^^^^^ | ^^^^^
|
help: use `let _ = ...` to ignore the resulting value
|
LL | let _ = bar();
| +++++++
error: unused output of future returned by `bar` that must be used error: unused output of future returned by `bar` that must be used
--> $DIR/unused-async.rs:36:5 --> $DIR/unused-async.rs:36:5
| |
LL | bar().await; LL | bar().await;
| ^^^^^^^^^^^ | ^^^^^^^^^^^
|
help: use `let _ = ...` to ignore the resulting value
|
LL | let _ = bar().await;
| +++++++
error: unused implementer of `Future` that must be used error: unused implementer of `Future` that must be used
--> $DIR/unused-async.rs:37:5 --> $DIR/unused-async.rs:37:5

View File

@ -9,6 +9,10 @@ note: the lint level is defined here
| |
LL | #![deny(unused_results, unused_must_use)] LL | #![deny(unused_results, unused_must_use)]
| ^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^
help: use `let _ = ...` to ignore the resulting value
|
LL | let _ = foo::<MustUse>();
| +++++++
error: unused `MustUseMsg` that must be used error: unused `MustUseMsg` that must be used
--> $DIR/unused-result.rs:22:5 --> $DIR/unused-result.rs:22:5
@ -17,6 +21,10 @@ LL | foo::<MustUseMsg>();
| ^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^
| |
= note: some message = note: some message
help: use `let _ = ...` to ignore the resulting value
|
LL | let _ = foo::<MustUseMsg>();
| +++++++
error: unused result of type `isize` error: unused result of type `isize`
--> $DIR/unused-result.rs:34:5 --> $DIR/unused-result.rs:34:5
@ -35,6 +43,11 @@ error: unused `MustUse` that must be used
| |
LL | foo::<MustUse>(); LL | foo::<MustUse>();
| ^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^
|
help: use `let _ = ...` to ignore the resulting value
|
LL | let _ = foo::<MustUse>();
| +++++++
error: unused `MustUseMsg` that must be used error: unused `MustUseMsg` that must be used
--> $DIR/unused-result.rs:36:5 --> $DIR/unused-result.rs:36:5
@ -43,6 +56,10 @@ LL | foo::<MustUseMsg>();
| ^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^
| |
= note: some message = note: some message
help: use `let _ = ...` to ignore the resulting value
|
LL | let _ = foo::<MustUseMsg>();
| +++++++
error: aborting due to 5 previous errors error: aborting due to 5 previous errors

View File

@ -146,42 +146,76 @@ note: the lint level is defined here
| |
LL | #![deny(unused_attributes, unused_must_use)] LL | #![deny(unused_attributes, unused_must_use)]
| ^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^
help: use `let _ = ...` to ignore the resulting value
|
LL | let _ = X;
| +++++++
error: unused `Y` that must be used error: unused `Y` that must be used
--> $DIR/unused_attributes-must_use.rs:104:5 --> $DIR/unused_attributes-must_use.rs:104:5
| |
LL | Y::Z; LL | Y::Z;
| ^^^^ | ^^^^
|
help: use `let _ = ...` to ignore the resulting value
|
LL | let _ = Y::Z;
| +++++++
error: unused `U` that must be used error: unused `U` that must be used
--> $DIR/unused_attributes-must_use.rs:105:5 --> $DIR/unused_attributes-must_use.rs:105:5
| |
LL | U { unit: () }; LL | U { unit: () };
| ^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^
|
help: use `let _ = ...` to ignore the resulting value
|
LL | let _ = U { unit: () };
| +++++++
error: unused return value of `U::method` that must be used error: unused return value of `U::method` that must be used
--> $DIR/unused_attributes-must_use.rs:106:5 --> $DIR/unused_attributes-must_use.rs:106:5
| |
LL | U::method(); LL | U::method();
| ^^^^^^^^^^^ | ^^^^^^^^^^^
|
help: use `let _ = ...` to ignore the resulting value
|
LL | let _ = U::method();
| +++++++
error: unused return value of `foo` that must be used error: unused return value of `foo` that must be used
--> $DIR/unused_attributes-must_use.rs:107:5 --> $DIR/unused_attributes-must_use.rs:107:5
| |
LL | foo(); LL | foo();
| ^^^^^ | ^^^^^
|
help: use `let _ = ...` to ignore the resulting value
|
LL | let _ = foo();
| +++++++
error: unused return value of `foreign_foo` that must be used error: unused return value of `foreign_foo` that must be used
--> $DIR/unused_attributes-must_use.rs:110:9 --> $DIR/unused_attributes-must_use.rs:110:9
| |
LL | foreign_foo(); LL | foreign_foo();
| ^^^^^^^^^^^^^ | ^^^^^^^^^^^^^
|
help: use `let _ = ...` to ignore the resulting value
|
LL | let _ = foreign_foo();
| +++++++
error: unused return value of `Use::get_four` that must be used error: unused return value of `Use::get_four` that must be used
--> $DIR/unused_attributes-must_use.rs:118:5 --> $DIR/unused_attributes-must_use.rs:118:5
| |
LL | ().get_four(); LL | ().get_four();
| ^^^^^^^^^^^^^ | ^^^^^^^^^^^^^
|
help: use `let _ = ...` to ignore the resulting value
|
LL | let _ = ().get_four();
| +++++++
error: aborting due to 28 previous errors error: aborting due to 28 previous errors