Skip to content

Commit

Permalink
Rollup merge of rust-lang#52834 - matthewjasper:allow-zst-conflicts, …
Browse files Browse the repository at this point in the history
…r=pnkfelix

[NLL] Allow conflicting borrows of promoted length zero arrays

This is currently overkill as there's no way to create two conflicting borrows of any promoted.
It is possible that the following code might not fail due to const eval in the future (@oli-obk?). In which case either the array marked needs to not be promoted, or to be checked for conflicts

```rust
static mut A: () = {
    let mut y = None;
    let z;
    let mut done_y = false;
    loop {
        let x = &mut [1];  // < this array
        if done_y {
            z = x;
            break;
        }
        y = Some(x);
        done_y = true;
    }
    some_const_fn(y, z); // some_const_fn expects that y to not alias z.
};
```

r? @pnkfelix  @nikomatsakis

closes rust-lang#52671
cc rust-lang#51823
  • Loading branch information
pietroalbini committed Aug 1, 2018
2 parents 4d1ddfe + 84dc485 commit d5fcd27
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 0 deletions.
7 changes: 7 additions & 0 deletions src/librustc_mir/borrow_check/places_conflict.rs
Expand Up @@ -329,6 +329,13 @@ fn place_element_conflict<'a, 'gcx: 'tcx, 'tcx>(
}
(Place::Promoted(p1), Place::Promoted(p2)) => {
if p1.0 == p2.0 {
if let ty::TyArray(_, size) = p1.1.sty {
if size.unwrap_usize(tcx) == 0 {
// Ignore conflicts with promoted [T; 0].
debug!("place_element_conflict: IGNORE-LEN-0-PROMOTED");
return Overlap::Disjoint;
}
}
// the same promoted - base case, equal
debug!("place_element_conflict: DISJOINT-OR-EQ-PROMOTED");
Overlap::EqualOrDisjoint
Expand Down
23 changes: 23 additions & 0 deletions src/test/ui/nll/promotable-mutable-zst-doesnt-conflict.rs
@@ -0,0 +1,23 @@
// 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.

// Check that mutable promoted length zero arrays don't check for conflicting
// access

// run-pass

#![feature(nll)]

pub fn main() {
let mut x: Vec<&[i32; 0]> = Vec::new();
for i in 0..10 {
x.push(&[]);
}
}

0 comments on commit d5fcd27

Please sign in to comment.