Skip to content

Commit

Permalink
Rollup merge of rust-lang#45967 - matthewjasper:array-move-types, r=a…
Browse files Browse the repository at this point in the history
…rielb1

MIR-borrowck: don't ICE for cannot move from array error

Closes rust-lang#45694
compile-fail test E0508 now gives
```text
error[E0508]: cannot move out of type `[NonCopy; 1]`, a non-copy array (Ast)
  --> .\src\test\compile-fail\E0508.rs:18:18
   |
18 |     let _value = array[0];  //[ast]~ ERROR E0508
   |                  ^^^^^^^^
   |                  |
   |                  cannot move out of here
   |                  help: consider using a reference instead: `&array[0]`

error[E0508]: cannot move out of type `[NonCopy; 1]`, a non-copy array (Mir)
  --> .\src\test\compile-fail\E0508.rs:18:18
   |
18 |     let _value = array[0];  //[ast]~ ERROR E0508
   |                  ^^^^^^^^ cannot move out of here

error: aborting due to 2 previous errors
```
  • Loading branch information
GuillaumeGomez authored Nov 14, 2017
2 parents 529bb32 + a6824f1 commit 01e979f
Show file tree
Hide file tree
Showing 4 changed files with 14 additions and 12 deletions.
4 changes: 1 addition & 3 deletions src/librustc_mir/borrow_check.rs
Original file line number Diff line number Diff line change
Expand Up @@ -93,9 +93,7 @@ fn do_mir_borrowck<'a, 'gcx, 'tcx>(infcx: &InferCtxt<'a, 'gcx, 'tcx>,
tcx.cannot_move_out_of(span, "borrowed_content", origin),
IllegalMoveOriginKind::InteriorOfTypeWithDestructor { container_ty: ty } =>
tcx.cannot_move_out_of_interior_of_drop(span, ty, origin),
IllegalMoveOriginKind::InteriorOfSlice { elem_ty: ty, is_index } =>
tcx.cannot_move_out_of_interior_noncopy(span, ty, is_index, origin),
IllegalMoveOriginKind::InteriorOfArray { elem_ty: ty, is_index } =>
IllegalMoveOriginKind::InteriorOfSliceOrArray { ty, is_index } =>
tcx.cannot_move_out_of_interior_noncopy(span, ty, is_index, origin),
};
err.emit();
Expand Down
12 changes: 6 additions & 6 deletions src/librustc_mir/dataflow/move_paths/builder.rs
Original file line number Diff line number Diff line change
Expand Up @@ -137,21 +137,21 @@ impl<'b, 'a, 'gcx, 'tcx> Gatherer<'b, 'a, 'gcx, 'tcx> {
// move out of union - always move the entire union
ty::TyAdt(adt, _) if adt.is_union() =>
return Err(MoveError::UnionMove { path: base }),
ty::TySlice(elem_ty) =>
ty::TySlice(_) =>
return Err(MoveError::cannot_move_out_of(
mir.source_info(self.loc).span,
InteriorOfSlice {
elem_ty, is_index: match proj.elem {
InteriorOfSliceOrArray {
ty: lv_ty, is_index: match proj.elem {
ProjectionElem::Index(..) => true,
_ => false
},
})),
ty::TyArray(elem_ty, _num_elems) => match proj.elem {
ty::TyArray(..) => match proj.elem {
ProjectionElem::Index(..) =>
return Err(MoveError::cannot_move_out_of(
mir.source_info(self.loc).span,
InteriorOfArray {
elem_ty, is_index: true
InteriorOfSliceOrArray {
ty: lv_ty, is_index: true
})),
_ => {
// FIXME: still badly broken
Expand Down
3 changes: 1 addition & 2 deletions src/librustc_mir/dataflow/move_paths/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -239,8 +239,7 @@ pub(crate) enum IllegalMoveOriginKind<'tcx> {
Static,
BorrowedContent,
InteriorOfTypeWithDestructor { container_ty: ty::Ty<'tcx> },
InteriorOfSlice { elem_ty: ty::Ty<'tcx>, is_index: bool, },
InteriorOfArray { elem_ty: ty::Ty<'tcx>, is_index: bool, },
InteriorOfSliceOrArray { ty: ty::Ty<'tcx>, is_index: bool, },
}

#[derive(Debug)]
Expand Down
7 changes: 6 additions & 1 deletion src/test/compile-fail/E0508.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,14 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.

// revisions: ast mir
//[mir]compile-flags: -Zborrowck-mir

struct NonCopy;

fn main() {
let array = [NonCopy; 1];
let _value = array[0]; //~ ERROR E0508
let _value = array[0]; //[ast]~ ERROR E0508
//[mir]~^ ERROR (Ast) [E0508]
//[mir]~| ERROR (Mir) [E0508]
}

0 comments on commit 01e979f

Please sign in to comment.