]> git.lizzy.rs Git - rust.git/commitdiff
Document unsafe rules with comments and `bug!` calls
authorOliver Scherer <github35764891676564198441@oli-obk.de>
Sat, 3 Nov 2018 10:09:52 +0000 (11:09 +0100)
committerOliver Scherer <github35764891676564198441@oli-obk.de>
Tue, 4 Dec 2018 09:17:36 +0000 (10:17 +0100)
src/librustc_mir/transform/check_unsafety.rs

index d096bb32d9586ffadbfa7b9eb96cfc26dfa6761b..0547e4476cbe448369e2c89aab8c0e8088362cbe 100644 (file)
@@ -284,10 +284,10 @@ fn register_violations(&mut self,
                            unsafe_blocks: &[(ast::NodeId, bool)]) {
         let safety = self.source_scope_local_data[self.source_info.scope].safety;
         let within_unsafe = match (safety, self.min_const_fn) {
-            // FIXME: erring on the safe side here and disallowing builtin unsafety in const fn
+            // Erring on the safe side, pun intended
             (Safety::BuiltinUnsafe, true) |
-            // `unsafe` blocks are required even in `const unsafe fn`
-            (Safety::FnUnsafe, true) |
+            // mir building encodes const fn bodies as safe, even for `const unsafe fn`
+            (Safety::FnUnsafe, true) => bug!("const unsafe fn body treated as inherently unsafe"),
             // `unsafe` blocks are required in safe code
             (Safety::Safe, _) => {
                 for violation in violations {
@@ -305,8 +305,10 @@ fn register_violations(&mut self,
                 }
                 false
             }
+            // regular `unsafe` function bodies allow unsafe without additional unsafe blocks
             (Safety::BuiltinUnsafe, false) | (Safety::FnUnsafe, false) => true,
             (Safety::ExplicitUnsafe(node_id), _) => {
+                // mark unsafe block as used if there are any unsafe operations inside
                 if !violations.is_empty() {
                     self.used_unsafe.insert(node_id);
                 }
@@ -316,6 +318,7 @@ fn register_violations(&mut self,
                         match violation.kind {
                             // these are allowed
                             UnsafetyViolationKind::MinConstFn
+                                // if `#![feature(min_const_unsafe_fn)]` is active
                                 if self.tcx.sess.features_untracked().min_const_unsafe_fn => {},
                             _ => {
                                 let mut violation = violation.clone();