fn gather_terminator(&mut self, term: &Terminator<'tcx>) {
match term.kind {
TerminatorKind::Goto { target: _ }
+ | TerminatorKind::FalseEdge { .. }
+ | TerminatorKind::FalseUnwind { .. }
+ // In some sense returning moves the return place into the current
+ // call's destination, however, since there are no statements after
+ // this that could possibly access the return place, this doesn't
+ // need recording.
+ | TerminatorKind::Return
| TerminatorKind::Resume
| TerminatorKind::Abort
| TerminatorKind::GeneratorDrop
- | TerminatorKind::FalseEdge { .. }
- | TerminatorKind::FalseUnwind { .. }
| TerminatorKind::Unreachable => {}
- TerminatorKind::Return => {
- self.gather_move(Place::return_place());
- }
-
TerminatorKind::Assert { ref cond, .. } => {
self.gather_operand(cond);
}
// Check if we are assigning into a field of a union, if so, lookup the place
// of the union so it is marked as initialized again.
- if let [proj_base @ .., ProjectionElem::Field(_, _)] = place.projection {
- if let ty::Adt(def, _) =
- Place::ty_from(place.local, proj_base, self.builder.body, self.builder.tcx)
- .ty
- .kind()
- {
+ if let Some((place_base, ProjectionElem::Field(_, _))) = place.last_projection() {
+ if let ty::Adt(def, _) = place_base.ty(self.builder.body, self.builder.tcx).ty.kind() {
if def.is_union() {
- place = PlaceRef { local: place.local, projection: proj_base }
+ place = place_base;
}
}
}