From 94c4dd990296df030f0decffc9a4751105f3e603 Mon Sep 17 00:00:00 2001 From: varkor Date: Fri, 11 Oct 2019 02:35:22 +0100 Subject: [PATCH] Emit warning for ignored #[inline] on trait method prototypes --- src/librustc/hir/check_attr.rs | 34 +++++++++++++++++++ src/librustc/lint/builtin.rs | 6 ++++ src/librustc_lint/unused.rs | 7 +--- src/test/ui/issues/issue-52057.stderr | 8 +++++ .../warn-unused-inline-on-fn-prototypes.rs | 8 +++++ ...warn-unused-inline-on-fn-prototypes.stderr | 14 ++++++++ 6 files changed, 71 insertions(+), 6 deletions(-) create mode 100644 src/test/ui/issues/issue-52057.stderr create mode 100644 src/test/ui/lint/warn-unused-inline-on-fn-prototypes.rs create mode 100644 src/test/ui/lint/warn-unused-inline-on-fn-prototypes.stderr diff --git a/src/librustc/hir/check_attr.rs b/src/librustc/hir/check_attr.rs index ee5318153dad..c0fe712adc75 100644 --- a/src/librustc/hir/check_attr.rs +++ b/src/librustc/hir/check_attr.rs @@ -8,6 +8,7 @@ use crate::hir::{self, HirId, HirVec, Attribute, Item, ItemKind, TraitItem, Trai use crate::hir::DUMMY_HIR_ID; use crate::hir::def_id::DefId; use crate::hir::intravisit::{self, Visitor, NestedVisitorMap}; +use crate::lint::builtin::UNUSED_ATTRIBUTES; use crate::ty::TyCtxt; use crate::ty::query::Providers; @@ -36,6 +37,9 @@ pub(crate) enum Target { Impl, Expression, Statement, + AssocConst, + Method { body: bool }, + AssocTy, } impl Display for Target { @@ -60,6 +64,9 @@ impl Display for Target { Target::Impl => "item", Target::Expression => "expression", Target::Statement => "statement", + Target::AssocConst => "associated const", + Target::Method { .. } => "method", + Target::AssocTy => "associated type", }) } } @@ -85,6 +92,19 @@ impl Target { ItemKind::Impl(..) => Target::Impl, } } + + fn from_trait_item(trait_item: &TraitItem) -> Target { + match trait_item.kind { + TraitItemKind::Const(..) => Target::AssocConst, + TraitItemKind::Method(_, hir::TraitMethod::Required(_)) => { + Target::Method { body: false } + } + TraitItemKind::Method(_, hir::TraitMethod::Provided(_)) => { + Target::Method { body: true } + } + TraitItemKind::Type(..) => Target::AssocTy, + } + } } } } @@ -136,6 +156,15 @@ impl CheckAttrVisitor<'tcx> { fn check_inline(&self, hir_id: HirId, attr: &Attribute, span: &Span, target: Target) -> bool { match target { Target::Fn | Target::Closure | Target::Method { body: true } => true, + Target::Method { body: false } | Target::ForeignFn => { + self.tcx.struct_span_lint_hir( + UNUSED_ATTRIBUTES, + hir_id, + attr.span, + "`#[inline]` is ignored on function prototypes", + ).emit(); + true + } _ => { struct_span_err!(self.tcx.sess, attr.span, @@ -392,6 +421,11 @@ impl Visitor<'tcx> for CheckAttrVisitor<'tcx> { intravisit::walk_item(self, item) } + fn visit_trait_item(&mut self, trait_item: &'tcx TraitItem) { + let target = Target::from_trait_item(trait_item); + self.check_attributes(trait_item.hir_id, &trait_item.attrs, &trait_item.span, target, None); + intravisit::walk_trait_item(self, trait_item) + } fn visit_stmt(&mut self, stmt: &'tcx hir::Stmt) { self.check_stmt_attributes(stmt); diff --git a/src/librustc/lint/builtin.rs b/src/librustc/lint/builtin.rs index 15598b60f5c0..5c871bb6b698 100644 --- a/src/librustc/lint/builtin.rs +++ b/src/librustc/lint/builtin.rs @@ -68,6 +68,12 @@ declare_lint! { "detect unused, unexported items" } +declare_lint! { + pub UNUSED_ATTRIBUTES, + Warn, + "detects attributes that were not used by the compiler" +} + declare_lint! { pub UNREACHABLE_CODE, Warn, diff --git a/src/librustc_lint/unused.rs b/src/librustc_lint/unused.rs index 61b8cbe369aa..9a826de4b6ea 100644 --- a/src/librustc_lint/unused.rs +++ b/src/librustc_lint/unused.rs @@ -1,6 +1,7 @@ use rustc::hir::def::{Res, DefKind}; use rustc::hir::def_id::DefId; use rustc::lint; +use rustc::lint::builtin::UNUSED_ATTRIBUTES; use rustc::ty::{self, Ty}; use rustc::ty::adjustment; use rustc_data_structures::fx::FxHashMap; @@ -277,12 +278,6 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for PathStatements { } } -declare_lint! { - pub UNUSED_ATTRIBUTES, - Warn, - "detects attributes that were not used by the compiler" -} - #[derive(Copy, Clone)] pub struct UnusedAttributes { builtin_attributes: &'static FxHashMap, diff --git a/src/test/ui/issues/issue-52057.stderr b/src/test/ui/issues/issue-52057.stderr new file mode 100644 index 000000000000..33b79dba73e0 --- /dev/null +++ b/src/test/ui/issues/issue-52057.stderr @@ -0,0 +1,8 @@ +warning: `#[inline]` is ignored on function prototypes + --> $DIR/issue-52057.rs:10:5 + | +LL | #[inline(always)] + | ^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(unused_attributes)]` on by default + diff --git a/src/test/ui/lint/warn-unused-inline-on-fn-prototypes.rs b/src/test/ui/lint/warn-unused-inline-on-fn-prototypes.rs new file mode 100644 index 000000000000..f7fc28cbc7d1 --- /dev/null +++ b/src/test/ui/lint/warn-unused-inline-on-fn-prototypes.rs @@ -0,0 +1,8 @@ +#![deny(unused_attributes)] + +trait Trait { + #[inline] //~ ERROR `#[inline]` is ignored on function prototypes + fn foo(); +} + +fn main() {} diff --git a/src/test/ui/lint/warn-unused-inline-on-fn-prototypes.stderr b/src/test/ui/lint/warn-unused-inline-on-fn-prototypes.stderr new file mode 100644 index 000000000000..a13de8e09c51 --- /dev/null +++ b/src/test/ui/lint/warn-unused-inline-on-fn-prototypes.stderr @@ -0,0 +1,14 @@ +error: `#[inline]` is ignored on function prototypes + --> $DIR/warn-unused-inline-on-fn-prototypes.rs:9:5 + | +LL | #[inline] + | ^^^^^^^^^ + | +note: lint level defined here + --> $DIR/warn-unused-inline-on-fn-prototypes.rs:1:9 + | +LL | #![deny(unused_attributes)] + | ^^^^^^^^^^^^^^^^^ + +error: aborting due to 2 previous errors +