diff --git a/compiler/rustc_lint/messages.ftl b/compiler/rustc_lint/messages.ftl
index 3e952558d29d..9d429d5131ec 100644
--- a/compiler/rustc_lint/messages.ftl
+++ b/compiler/rustc_lint/messages.ftl
@@ -163,6 +163,8 @@ lint_builtin_unreachable_pub = unreachable `pub` {$what}
 
 lint_builtin_unsafe_block = usage of an `unsafe` block
 
+lint_builtin_unsafe_extern_block = usage of an `unsafe extern` block
+
 lint_builtin_unsafe_impl = implementation of an `unsafe` trait
 
 lint_builtin_unsafe_trait = declaration of an `unsafe` trait
diff --git a/compiler/rustc_lint/src/builtin.rs b/compiler/rustc_lint/src/builtin.rs
index 79c8046f9b74..2d596564d52c 100644
--- a/compiler/rustc_lint/src/builtin.rs
+++ b/compiler/rustc_lint/src/builtin.rs
@@ -326,6 +326,12 @@ impl EarlyLintPass for UnsafeCode {
                 self.report_unsafe(cx, it.span, BuiltinUnsafe::GlobalAsm);
             }
 
+            ast::ItemKind::ForeignMod(ForeignMod { safety, .. }) => {
+                if let Safety::Unsafe(_) = safety {
+                    self.report_unsafe(cx, it.span, BuiltinUnsafe::UnsafeExternBlock);
+                }
+            }
+
             _ => {}
         }
     }
diff --git a/compiler/rustc_lint/src/lints.rs b/compiler/rustc_lint/src/lints.rs
index 7c5640f5959a..eacc66b197aa 100644
--- a/compiler/rustc_lint/src/lints.rs
+++ b/compiler/rustc_lint/src/lints.rs
@@ -81,6 +81,8 @@ pub enum BuiltinUnsafe {
     AllowInternalUnsafe,
     #[diag(lint_builtin_unsafe_block)]
     UnsafeBlock,
+    #[diag(lint_builtin_unsafe_extern_block)]
+    UnsafeExternBlock,
     #[diag(lint_builtin_unsafe_trait)]
     UnsafeTrait,
     #[diag(lint_builtin_unsafe_impl)]
diff --git a/tests/ui/lint/unsafe_code/unsafe-extern-blocks.rs b/tests/ui/lint/unsafe_code/unsafe-extern-blocks.rs
new file mode 100644
index 000000000000..6f2ead70db80
--- /dev/null
+++ b/tests/ui/lint/unsafe_code/unsafe-extern-blocks.rs
@@ -0,0 +1,14 @@
+#![feature(unsafe_extern_blocks)]
+#![deny(unsafe_code)]
+
+#[allow(unsafe_code)]
+unsafe extern "C" {
+    fn foo();
+}
+
+unsafe extern "C" {
+    //~^ ERROR usage of an `unsafe extern` block [unsafe_code]
+    fn bar();
+}
+
+fn main() {}
diff --git a/tests/ui/lint/unsafe_code/unsafe-extern-blocks.stderr b/tests/ui/lint/unsafe_code/unsafe-extern-blocks.stderr
new file mode 100644
index 000000000000..5439a3112560
--- /dev/null
+++ b/tests/ui/lint/unsafe_code/unsafe-extern-blocks.stderr
@@ -0,0 +1,17 @@
+error: usage of an `unsafe extern` block
+  --> $DIR/unsafe-extern-blocks.rs:9:1
+   |
+LL | / unsafe extern "C" {
+LL | |
+LL | |     fn bar();
+LL | | }
+   | |_^
+   |
+note: the lint level is defined here
+  --> $DIR/unsafe-extern-blocks.rs:2:9
+   |
+LL | #![deny(unsafe_code)]
+   |         ^^^^^^^^^^^
+
+error: aborting due to 1 previous error
+