From 66d7ef077a23138553c92ab8053416da51ab3b4f Mon Sep 17 00:00:00 2001 From: varkor Date: Fri, 11 Oct 2019 02:35:49 +0100 Subject: [PATCH] Emit warning for ignored #[inline] on foreign function prototypes --- src/librustc/hir/check_attr.rs | 18 ++++++++++++++++++ .../warn-unused-inline-on-fn-prototypes.rs | 5 +++++ .../warn-unused-inline-on-fn-prototypes.stderr | 6 ++++++ 3 files changed, 29 insertions(+) diff --git a/src/librustc/hir/check_attr.rs b/src/librustc/hir/check_attr.rs index c0fe712adc75..8777785859cd 100644 --- a/src/librustc/hir/check_attr.rs +++ b/src/librustc/hir/check_attr.rs @@ -40,6 +40,9 @@ pub(crate) enum Target { AssocConst, Method { body: bool }, AssocTy, + ForeignFn, + ForeignStatic, + ForeignTy, } impl Display for Target { @@ -67,6 +70,9 @@ impl Display for Target { Target::AssocConst => "associated const", Target::Method { .. } => "method", Target::AssocTy => "associated type", + Target::ForeignFn => "foreign function", + Target::ForeignStatic => "foreign static item", + Target::ForeignTy => "foreign type", }) } } @@ -105,6 +111,12 @@ impl Target { TraitItemKind::Type(..) => Target::AssocTy, } } + + fn from_foreign_item(foreign_item: &hir::ForeignItem) -> Target { + match foreign_item.kind { + hir::ForeignItemKind::Fn(..) => Target::ForeignFn, + hir::ForeignItemKind::Static(..) => Target::ForeignStatic, + hir::ForeignItemKind::Type => Target::ForeignTy, } } } @@ -427,6 +439,12 @@ impl Visitor<'tcx> for CheckAttrVisitor<'tcx> { intravisit::walk_trait_item(self, trait_item) } + fn visit_foreign_item(&mut self, f_item: &'tcx hir::ForeignItem) { + let target = Target::from_foreign_item(f_item); + self.check_attributes(f_item.hir_id, &f_item.attrs, &f_item.span, target, None); + intravisit::walk_foreign_item(self, f_item) + } + fn visit_stmt(&mut self, stmt: &'tcx hir::Stmt) { self.check_stmt_attributes(stmt); intravisit::walk_stmt(self, stmt) 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 index f7fc28cbc7d1..21097197499d 100644 --- a/src/test/ui/lint/warn-unused-inline-on-fn-prototypes.rs +++ b/src/test/ui/lint/warn-unused-inline-on-fn-prototypes.rs @@ -5,4 +5,9 @@ trait Trait { fn foo(); } +extern { + #[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 index a13de8e09c51..006cc6c80a64 100644 --- a/src/test/ui/lint/warn-unused-inline-on-fn-prototypes.stderr +++ b/src/test/ui/lint/warn-unused-inline-on-fn-prototypes.stderr @@ -10,5 +10,11 @@ note: lint level defined here LL | #![deny(unused_attributes)] | ^^^^^^^^^^^^^^^^^ +error: `#[inline]` is ignored on function prototypes + --> $DIR/warn-unused-inline-on-fn-prototypes.rs:4:5 + | +LL | #[inline] + | ^^^^^^^^^ + error: aborting due to 2 previous errors