From 3d114c7f61c5994633196a378e5eed4ee3e58841 Mon Sep 17 00:00:00 2001 From: Seiichi Uchida Date: Sun, 4 Feb 2018 17:31:00 +0900 Subject: [PATCH] Remove delay_span_bug() in check_aliasability This path was considered to be unreachable. However, `&mut` could potentially live inside `static`. For example, `static TAB: [&mut [u8]; 0] = [];`. --- src/librustc_borrowck/borrowck/mod.rs | 12 +----------- src/test/compile-fail/issue-42344.rs | 17 +++++++++++++++++ src/test/compile-fail/issue-46604.rs | 3 ++- 3 files changed, 20 insertions(+), 12 deletions(-) create mode 100644 src/test/compile-fail/issue-42344.rs diff --git a/src/librustc_borrowck/borrowck/mod.rs b/src/librustc_borrowck/borrowck/mod.rs index 4529e4bab752c..04c16b1d69496 100644 --- a/src/librustc_borrowck/borrowck/mod.rs +++ b/src/librustc_borrowck/borrowck/mod.rs @@ -1113,22 +1113,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 0000000000000..2f11ff402beed --- /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 or the MIT license +// , 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 06aa4c343fea3..dc14eca1e6734 100644 --- a/src/test/compile-fail/issue-46604.rs +++ b/src/test/compile-fail/issue-46604.rs @@ -17,5 +17,6 @@ fn write>(buffer: T) { } fn main() { write(&buf); - buf[0]=2; //[mir]~ ERROR E0594 + buf[0]=2; //[ast]~ ERROR E0389 + //[mir]~^ ERROR E0594 }