about summary refs log tree commit diff
diff options
context:
space:
mode:
authorkennytm <kennytm@gmail.com>2018-02-06 02:13:46 +0800
committerGitHub <noreply@github.com>2018-02-06 02:13:46 +0800
commit9dab73773a017d7a560dc677bc55526593145835 (patch)
treeee3bd0d8a0f8249dd38e1c820ff61e4e35cd4d9a
parentcde119db8e27da1b8e8be376449e71e62cc80e11 (diff)
parent3d114c7f61c5994633196a378e5eed4ee3e58841 (diff)
downloadrust-9dab73773a017d7a560dc677bc55526593145835.tar.gz
rust-9dab73773a017d7a560dc677bc55526593145835.zip
Rollup merge of #47543 - topecongiro:issue-42344, r=nikomatsakis
Disallow mutable borrow to non-mut statics

Closes #42344.
-rw-r--r--src/librustc_borrowck/borrowck/mod.rs12
-rw-r--r--src/test/compile-fail/issue-42344.rs17
-rw-r--r--src/test/compile-fail/issue-46604.rs3
3 files changed, 20 insertions, 12 deletions
diff --git a/src/librustc_borrowck/borrowck/mod.rs b/src/librustc_borrowck/borrowck/mod.rs
index 84ca2a9318a..738c0d82ee1 100644
--- a/src/librustc_borrowck/borrowck/mod.rs
+++ b/src/librustc_borrowck/borrowck/mod.rs
@@ -1068,22 +1068,12 @@ impl<'a, 'tcx> BorrowckCtxt<'a, 'tcx> {
         };
 
         match cause {
-            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. `static mut X` is not checked
                 // for aliasability violations.
                 span_bug!(span, "aliasability violation for static mut `{}`", prefix)
             }
-            mc::AliasableBorrowed => {}
+            mc::AliasableStatic | mc::AliasableBorrowed => {}
         };
         let blame = cmt.immutability_blame();
         let mut err = match blame {
diff --git a/src/test/compile-fail/issue-42344.rs b/src/test/compile-fail/issue-42344.rs
new file mode 100644
index 00000000000..2f11ff402be
--- /dev/null
+++ b/src/test/compile-fail/issue-42344.rs
@@ -0,0 +1,17 @@
+// Copyright 2018 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.
+
+static TAB: [&mut [u8]; 0] = [];
+
+pub unsafe fn test() {
+    TAB[0].iter_mut(); //~ ERROR cannot borrow data mutably in a `&` reference [E0389]
+}
+
+pub fn main() {}
diff --git a/src/test/compile-fail/issue-46604.rs b/src/test/compile-fail/issue-46604.rs
index 06aa4c343fe..dc14eca1e67 100644
--- a/src/test/compile-fail/issue-46604.rs
+++ b/src/test/compile-fail/issue-46604.rs
@@ -17,5 +17,6 @@ fn write<T: AsRef<[u8]>>(buffer: T) { }
 
 fn main() {
     write(&buf);
-    buf[0]=2;                                   //[mir]~ ERROR E0594
+    buf[0]=2;                                   //[ast]~ ERROR E0389
+                                                //[mir]~^ ERROR E0594
 }