]> git.lizzy.rs Git - rust.git/commitdiff
Emit warning for ignored #[inline] on foreign function prototypes
authorvarkor <github@varkor.com>
Fri, 11 Oct 2019 01:35:49 +0000 (02:35 +0100)
committervarkor <github@varkor.com>
Fri, 25 Oct 2019 22:26:27 +0000 (23:26 +0100)
src/librustc/hir/check_attr.rs
src/test/ui/lint/warn-unused-inline-on-fn-prototypes.rs
src/test/ui/lint/warn-unused-inline-on-fn-prototypes.stderr

index c0fe712adc7581ea7010fc460251e908c31a93c3..8777785859cd57b2befe6206e0d39a2b895e6034 100644 (file)
@@ -40,6 +40,9 @@ pub(crate) enum Target {
     AssocConst,
     Method { body: bool },
     AssocTy,
+    ForeignFn,
+    ForeignStatic,
+    ForeignTy,
 }
 
 impl Display for Target {
@@ -67,6 +70,9 @@ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
             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 @@ fn from_trait_item(trait_item: &TraitItem) -> 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 @@ fn visit_trait_item(&mut self, trait_item: &'tcx TraitItem) {
         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)
index f7fc28cbc7d1c1b459676cc190c8f54a58c2571e..21097197499ddb369a0c8579329e3e7a68e58264 100644 (file)
@@ -5,4 +5,9 @@ trait Trait {
     fn foo();
 }
 
+extern {
+    #[inline] //~ ERROR `#[inline]` is ignored on function prototypes
+    fn foo();
+}
+
 fn main() {}
index a13de8e09c51af428973fc8b7ea7cc06de185ca4..006cc6c80a64e9722d411c92337135155164bdd0 100644 (file)
@@ -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