From f26c0b41d2a72e715bc36b3514a6eebf5edbcf52 Mon Sep 17 00:00:00 2001 From: matthewjasper Date: Mon, 1 Jan 2018 17:53:12 +0000 Subject: [PATCH] Delay panic for aliasing violation for static items. --- src/librustc_borrowck/borrowck/mod.rs | 21 +++++++++++++-------- src/test/compile-fail/issue-46604.rs | 21 +++++++++++++++++++++ 2 files changed, 34 insertions(+), 8 deletions(-) create mode 100644 src/test/compile-fail/issue-46604.rs diff --git a/src/librustc_borrowck/borrowck/mod.rs b/src/librustc_borrowck/borrowck/mod.rs index c7a13b42028..6d2a1037c35 100644 --- a/src/librustc_borrowck/borrowck/mod.rs +++ b/src/librustc_borrowck/borrowck/mod.rs @@ -1098,15 +1098,20 @@ impl<'a, 'tcx> BorrowckCtxt<'a, 'tcx> { }; 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 index 00000000000..06aa4c343fe --- /dev/null +++ b/src/test/compile-fail/issue-46604.rs @@ -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 or the MIT license +// , 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>(buffer: T) { } + +fn main() { + write(&buf); + buf[0]=2; //[mir]~ ERROR E0594 +}