about summary refs log tree commit diff
path: root/compiler
diff options
context:
space:
mode:
authorLeSeulArtichaut <leseulartichaut@gmail.com>2021-05-17 00:29:54 +0200
committerLeSeulArtichaut <leseulartichaut@gmail.com>2021-05-21 19:51:53 +0200
commit0e1afc4501eae89862a50ab24961a8d12ece0a37 (patch)
tree280a9ef31e7231cdbbf38a25a073b88ea2dc7615 /compiler
parent6b327aaa08aea817e51640585b4d63cf4017965f (diff)
downloadrust-0e1afc4501eae89862a50ab24961a8d12ece0a37.tar.gz
rust-0e1afc4501eae89862a50ab24961a8d12ece0a37.zip
Check for use of mutable/extern statics in THIR unsafeck
Diffstat (limited to 'compiler')
-rw-r--r--compiler/rustc_mir_build/src/check_unsafety.rs16
1 files changed, 10 insertions, 6 deletions
diff --git a/compiler/rustc_mir_build/src/check_unsafety.rs b/compiler/rustc_mir_build/src/check_unsafety.rs
index 66b30679ccb..aa8193dab5d 100644
--- a/compiler/rustc_mir_build/src/check_unsafety.rs
+++ b/compiler/rustc_mir_build/src/check_unsafety.rs
@@ -169,14 +169,20 @@ impl<'a, 'tcx> Visitor<'a, 'tcx> for UnsafetyVisitor<'a, 'tcx> {
                     }
                 }
             }
-            ExprKind::InlineAsm { .. } | ExprKind::LlvmInlineAsm { .. } => {
-                self.requires_unsafe(expr.span, UseOfInlineAssembly);
-            }
             ExprKind::Deref { arg } => {
-                if self.thir[arg].ty.is_unsafe_ptr() {
+                if let ExprKind::StaticRef { def_id, .. } = self.thir[arg].kind {
+                    if self.tcx.is_mutable_static(def_id) {
+                        self.requires_unsafe(expr.span, UseOfMutableStatic);
+                    } else if self.tcx.is_foreign_item(def_id) {
+                        self.requires_unsafe(expr.span, UseOfExternStatic);
+                    }
+                } else if self.thir[arg].ty.is_unsafe_ptr() {
                     self.requires_unsafe(expr.span, DerefOfRawPointer);
                 }
             }
+            ExprKind::InlineAsm { .. } | ExprKind::LlvmInlineAsm { .. } => {
+                self.requires_unsafe(expr.span, UseOfInlineAssembly);
+            }
             ExprKind::Adt {
                 adt_def,
                 variant_index: _,
@@ -242,9 +248,7 @@ enum UnsafeOpKind {
     UseOfInlineAssembly,
     InitializingTypeWith,
     CastOfPointerToInt,
-    #[allow(dead_code)] // FIXME
     UseOfMutableStatic,
-    #[allow(dead_code)] // FIXME
     UseOfExternStatic,
     DerefOfRawPointer,
     #[allow(dead_code)] // FIXME