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:
commit
6b6580ccf9
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user