Auto merge of #4540 - jolson88:fix-place-projection, r=phansch

Fix rustc breaking change: convert to Place's new boxed slice projection

Addressed breaking changes from rust-lang PR https://github.com/rust-lang/rust/pull/63420/

I'm not entirely sure the semantics are preserved as I don't have much knowledge about MIR yet. So this code was largely reverse-engineered from the PR above. I wouldn't be surprised if I did something wrong :).

I followed the instructions to pull latest rustc from master and verified the build break I was seeing in my PR for cast-lossless in Travis CI. With these changes, it compiles again and all tests pass.

Fixes https://github.com/rust-lang/rust/issues/64440

changelog: none
This commit is contained in:
bors 2019-09-14 06:12:52 +00:00
commit 6b6580ccf9

View File

@ -252,13 +252,13 @@ fn find_stmt_assigns_to<'a, 'tcx: 'a>(
stmts stmts
.rev() .rev()
.find_map(|stmt| { .find_map(|stmt| {
if let mir::StatementKind::Assign( if let mir::StatementKind::Assign(box (
mir::Place { mir::Place {
base: mir::PlaceBase::Local(local), base: mir::PlaceBase::Local(local),
.. ..
}, },
v, v,
) = &stmt.kind )) = &stmt.kind
{ {
if *local == to { if *local == to {
return Some(v); return Some(v);
@ -269,10 +269,10 @@ fn find_stmt_assigns_to<'a, 'tcx: 'a>(
}) })
.and_then(|v| { .and_then(|v| {
if by_ref { if by_ref {
if let mir::Rvalue::Ref(_, _, ref place) = **v { if let mir::Rvalue::Ref(_, _, ref place) = v {
return base_local_and_movability(cx, mir, place); return base_local_and_movability(cx, mir, place);
} }
} else if let mir::Rvalue::Use(mir::Operand::Copy(ref place)) = **v { } else if let mir::Rvalue::Use(mir::Operand::Copy(ref place)) = v {
return base_local_and_movability(cx, mir, place); return base_local_and_movability(cx, mir, place);
} }
None None
@ -291,7 +291,6 @@ fn base_local_and_movability<'tcx>(
use rustc::mir::Place; use rustc::mir::Place;
use rustc::mir::PlaceBase; use rustc::mir::PlaceBase;
use rustc::mir::PlaceRef; use rustc::mir::PlaceRef;
use rustc::mir::Projection;
// Dereference. You cannot move things out from a borrowed value. // Dereference. You cannot move things out from a borrowed value.
let mut deref = false; let mut deref = false;
@ -303,7 +302,7 @@ fn base_local_and_movability<'tcx>(
mut projection, mut projection,
} = place.as_ref(); } = place.as_ref();
if let PlaceBase::Local(local) = place_base { if let PlaceBase::Local(local) = place_base {
while let Some(box Projection { base, elem }) = projection { while let [base @ .., elem] = projection {
projection = base; projection = base;
deref = matches!(elem, mir::ProjectionElem::Deref); deref = matches!(elem, mir::ProjectionElem::Deref);
field = !field field = !field