about summary refs log tree commit diff
diff options
context:
space:
mode:
authorVadim Pashkov <vad.pashkov@gmail.com>2018-08-06 04:18:19 +0300
committerVadim Pashkov <vad.pashkov@gmail.com>2018-08-06 04:18:19 +0300
commit70cafecaba233037bd5df5259140c3167941e70c (patch)
tree61e06160110c23e7d3df26572fdc2af7de92e64c
parent73c78734bae8f2947a4bfdeabebeeb84ccf0b0e1 (diff)
downloadrust-70cafecaba233037bd5df5259140c3167941e70c.tar.gz
rust-70cafecaba233037bd5df5259140c3167941e70c.zip
improper_ctypes lint for individual foreign items
-rw-r--r--src/librustc_lint/types.rs23
-rw-r--r--src/test/ui/lint-ctypes.rs7
2 files changed, 17 insertions, 13 deletions
diff --git a/src/librustc_lint/types.rs b/src/librustc_lint/types.rs
index 4dc66fb8121..f1636c4dcb0 100644
--- a/src/librustc_lint/types.rs
+++ b/src/librustc_lint/types.rs
@@ -790,21 +790,18 @@ impl LintPass for ImproperCTypes {
 }
 
 impl<'a, 'tcx> LateLintPass<'a, 'tcx> for ImproperCTypes {
-    fn check_item(&mut self, cx: &LateContext, it: &hir::Item) {
+    fn check_foreign_item(&mut self, cx: &LateContext, it: &hir::ForeignItem) {
         let mut vis = ImproperCTypesVisitor { cx: cx };
-        if let hir::ItemKind::ForeignMod(ref nmod) = it.node {
-            if nmod.abi != Abi::RustIntrinsic && nmod.abi != Abi::PlatformIntrinsic {
-                for ni in &nmod.items {
-                    match ni.node {
-                        hir::ForeignItemKind::Fn(ref decl, _, _) => {
-                            vis.check_foreign_fn(ni.id, decl);
-                        }
-                        hir::ForeignItemKind::Static(ref ty, _) => {
-                            vis.check_foreign_static(ni.id, ty.span);
-                        }
-                        hir::ForeignItemKind::Type => ()
-                    }
+        let abi = cx.tcx.hir.get_foreign_abi(it.id);
+        if abi != Abi::RustIntrinsic && abi != Abi::PlatformIntrinsic {
+            match it.node {
+                hir::ForeignItemKind::Fn(ref decl, _, _) => {
+                    vis.check_foreign_fn(it.id, decl);
+                }
+                hir::ForeignItemKind::Static(ref ty, _) => {
+                    vis.check_foreign_static(it.id, ty.span);
                 }
+                hir::ForeignItemKind::Type => ()
             }
         }
     }
diff --git a/src/test/ui/lint-ctypes.rs b/src/test/ui/lint-ctypes.rs
index 7f22dc8739e..b8b1a675c5f 100644
--- a/src/test/ui/lint-ctypes.rs
+++ b/src/test/ui/lint-ctypes.rs
@@ -88,6 +88,13 @@ extern {
     pub fn good15(p: TransparentLifetime);
     pub fn good16(p: TransparentUnit<ZeroSize>);
     pub fn good17(p: TransparentCustomZst);
+    #[allow(improper_ctypes)]
+    pub fn good18(_: &String);
+}
+
+#[allow(improper_ctypes)]
+extern {
+    pub fn good19(_: &String);
 }
 
 #[cfg(not(target_arch = "wasm32"))]