diff options
| author | Dylan DPC <99973273+Dylan-DPC@users.noreply.github.com> | 2022-03-01 03:41:49 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-03-01 03:41:49 +0100 |
| commit | daed86445de99e6dfcf128948bf34fff96c733ef (patch) | |
| tree | 984fc55b42c3a2f3a37b73c54fc1dadecbcb2fc7 /compiler | |
| parent | 2fb5a1643872bfe8f266e53d6281602b2baad9e8 (diff) | |
| parent | 6dcf5d8fdeb341a3ec2ed00d2cb4449da35d8623 (diff) | |
| download | rust-daed86445de99e6dfcf128948bf34fff96c733ef.tar.gz rust-daed86445de99e6dfcf128948bf34fff96c733ef.zip | |
Rollup merge of #93926 - PatchMixolydic:bugfix/must_use-on-exprs, r=cjgillot
Lint against more useless `#[must_use]` attributes This expands the existing `#[must_use]` check in `unused_attributes` to lint against pretty much everything `#[must_use]` doesn't support. Fixes #93906.
Diffstat (limited to 'compiler')
| -rw-r--r-- | compiler/rustc_macros/src/session_diagnostic.rs | 1 | ||||
| -rw-r--r-- | compiler/rustc_passes/src/check_attr.rs | 35 |
2 files changed, 34 insertions, 2 deletions
diff --git a/compiler/rustc_macros/src/session_diagnostic.rs b/compiler/rustc_macros/src/session_diagnostic.rs index 9a7784ca72f..f29683e5e1d 100644 --- a/compiler/rustc_macros/src/session_diagnostic.rs +++ b/compiler/rustc_macros/src/session_diagnostic.rs @@ -587,7 +587,6 @@ impl<'a> SessionDiagnosticDeriveBuilder<'a> { // next call to `it.next()` retrieves the next character. while let Some(c) = it.next() { if c == '{' && *it.peek().unwrap_or(&'\0') != '{' { - #[must_use] let mut eat_argument = || -> Option<String> { let mut result = String::new(); // Format specifiers look like diff --git a/compiler/rustc_passes/src/check_attr.rs b/compiler/rustc_passes/src/check_attr.rs index 6e4907fe518..39e7a3019a5 100644 --- a/compiler/rustc_passes/src/check_attr.rs +++ b/compiler/rustc_passes/src/check_attr.rs @@ -1111,7 +1111,7 @@ impl CheckAttrVisitor<'_> { } /// Warns against some misuses of `#[must_use]` - fn check_must_use(&self, hir_id: HirId, attr: &Attribute, span: Span, _target: Target) -> bool { + fn check_must_use(&self, hir_id: HirId, attr: &Attribute, span: Span, target: Target) -> bool { let node = self.tcx.hir().get(hir_id); if let Some(fn_node) = node.fn_kind() { if let rustc_hir::IsAsync::Async = fn_node.asyncness() { @@ -1131,6 +1131,39 @@ impl CheckAttrVisitor<'_> { } } + if !matches!( + target, + Target::Fn + | Target::Enum + | Target::Struct + | Target::Union + | Target::Method(_) + | Target::ForeignFn + // `impl Trait` in return position can trip + // `unused_must_use` if `Trait` is marked as + // `#[must_use]` + | Target::Trait + ) { + let article = match target { + Target::ExternCrate + | Target::OpaqueTy + | Target::Enum + | Target::Impl + | Target::Expression + | Target::Arm + | Target::AssocConst + | Target::AssocTy => "an", + _ => "a", + }; + + self.tcx.struct_span_lint_hir(UNUSED_ATTRIBUTES, hir_id, attr.span, |lint| { + lint.build(&format!( + "`#[must_use]` has no effect when applied to {article} {target}" + )) + .emit(); + }); + } + // For now, its always valid true } |
