]> git.lizzy.rs Git - rust.git/commitdiff
Delay panic for aliasing violation for static items.
authormatthewjasper <mjjasper1@gmail.com>
Mon, 1 Jan 2018 17:53:12 +0000 (17:53 +0000)
committermatthewjasper <mjjasper1@gmail.com>
Mon, 1 Jan 2018 17:53:12 +0000 (17:53 +0000)
src/librustc_borrowck/borrowck/mod.rs
src/test/compile-fail/issue-46604.rs [new file with mode: 0644]

index c7a13b42028d78c8b9eef2d5e66bc408acfddbb2..6d2a1037c358cecc0d34a5573426c1b2e4baa739 100644 (file)
@@ -1098,15 +1098,20 @@ pub fn report_aliasability_violation(&self,
         };
 
         match cause {
-            mc::AliasableStatic |
+            mc::AliasableStatic => {
+                // This happens when we have an `&mut` or assignment to a
+                // static. We should have already reported a mutability
+                // violation first, but may have continued compiling.
+                self.tcx.sess.delay_span_bug(
+                    span,
+                    &format!("aliasability violation for static `{}`", prefix)
+                );
+                return;
+            }
             mc::AliasableStaticMut => {
-                // This path cannot occur. It happens when we have an
-                // `&mut` or assignment to a static. But in the case
-                // of `static X`, we get a mutability violation first,
-                // and never get here. In the case of `static mut X`,
-                // that is unsafe and hence the aliasability error is
-                // ignored.
-                span_bug!(span, "aliasability violation for static `{}`", prefix)
+                // This path cannot occur. `static mut X` is not checked
+                // for aliasability violations.
+                span_bug!(span, "aliasability violation for static mut `{}`", prefix)
             }
             mc::AliasableBorrowed => {}
         };
diff --git a/src/test/compile-fail/issue-46604.rs b/src/test/compile-fail/issue-46604.rs
new file mode 100644 (file)
index 0000000..06aa4c3
--- /dev/null
@@ -0,0 +1,21 @@
+// Copyright 2017 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+// revisions: ast mir
+//[mir]compile-flags: -Z borrowck=mir
+
+static buf: &mut [u8] = &mut [1u8,2,3,4,5,7];   //[ast]~ ERROR E0017
+                                                //[mir]~^ ERROR E0017
+fn write<T: AsRef<[u8]>>(buffer: T) { }
+
+fn main() {
+    write(&buf);
+    buf[0]=2;                                   //[mir]~ ERROR E0594
+}