Skip to content

Commit 84dc485

Browse files
committed
Allow borrow conflicts for promoted length 0 arrays
1 parent 75af9df commit 84dc485

File tree

2 files changed

+30
-0
lines changed

2 files changed

+30
-0
lines changed

src/librustc_mir/borrow_check/places_conflict.rs

+7
Original file line numberDiff line numberDiff line change
@@ -329,6 +329,13 @@ fn place_element_conflict<'a, 'gcx: 'tcx, 'tcx>(
329329
}
330330
(Place::Promoted(p1), Place::Promoted(p2)) => {
331331
if p1.0 == p2.0 {
332+
if let ty::TyArray(_, size) = p1.1.sty {
333+
if size.unwrap_usize(tcx) == 0 {
334+
// Ignore conflicts with promoted [T; 0].
335+
debug!("place_element_conflict: IGNORE-LEN-0-PROMOTED");
336+
return Overlap::Disjoint;
337+
}
338+
}
332339
// the same promoted - base case, equal
333340
debug!("place_element_conflict: DISJOINT-OR-EQ-PROMOTED");
334341
Overlap::EqualOrDisjoint
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
// Copyright 2018 The Rust Project Developers. See the COPYRIGHT
2+
// file at the top-level directory of this distribution and at
3+
// http://rust-lang.org/COPYRIGHT.
4+
//
5+
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6+
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7+
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8+
// option. This file may not be copied, modified, or distributed
9+
// except according to those terms.
10+
11+
// Check that mutable promoted length zero arrays don't check for conflicting
12+
// access
13+
14+
// run-pass
15+
16+
#![feature(nll)]
17+
18+
pub fn main() {
19+
let mut x: Vec<&[i32; 0]> = Vec::new();
20+
for i in 0..10 {
21+
x.push(&[]);
22+
}
23+
}

0 commit comments

Comments
 (0)