diff options
| author | John Kåre Alsaker <john.kare.alsaker@gmail.com> | 2018-05-02 10:17:12 +0200 |
|---|---|---|
| committer | John Kåre Alsaker <john.kare.alsaker@gmail.com> | 2018-05-08 16:21:58 +0200 |
| commit | 0edc8f4270589002fe12b9de9a2bd2b1220feb4d (patch) | |
| tree | 2069b31875e8bad17b80e860354dddf1d4ac94e6 /src/librustc_mir/transform | |
| parent | 697a989ec05ad7445bacd68983fd807e159ea717 (diff) | |
| download | rust-0edc8f4270589002fe12b9de9a2bd2b1220feb4d.tar.gz rust-0edc8f4270589002fe12b9de9a2bd2b1220feb4d.zip | |
Store generator movability outside GeneratorInterior
Diffstat (limited to 'src/librustc_mir/transform')
| -rw-r--r-- | src/librustc_mir/transform/check_unsafety.rs | 2 | ||||
| -rw-r--r-- | src/librustc_mir/transform/generator.rs | 19 |
2 files changed, 15 insertions, 6 deletions
diff --git a/src/librustc_mir/transform/check_unsafety.rs b/src/librustc_mir/transform/check_unsafety.rs index 2bf5a49c97e..32d68962a0d 100644 --- a/src/librustc_mir/transform/check_unsafety.rs +++ b/src/librustc_mir/transform/check_unsafety.rs @@ -127,7 +127,7 @@ impl<'a, 'tcx> Visitor<'tcx> for UnsafetyChecker<'a, 'tcx> { &AggregateKind::Tuple | &AggregateKind::Adt(..) => {} &AggregateKind::Closure(def_id, _) | - &AggregateKind::Generator(def_id, _, _) => { + &AggregateKind::Generator(def_id, _, _, _) => { let UnsafetyCheckResult { violations, unsafe_blocks } = self.tcx.unsafety_check_result(def_id); diff --git a/src/librustc_mir/transform/generator.rs b/src/librustc_mir/transform/generator.rs index 36735586e81..168f24f2cee 100644 --- a/src/librustc_mir/transform/generator.rs +++ b/src/librustc_mir/transform/generator.rs @@ -465,6 +465,7 @@ fn compute_layout<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, source: MirSource, upvars: Vec<Ty<'tcx>>, interior: GeneratorInterior<'tcx>, + movable: bool, mir: &mut Mir<'tcx>) -> (HashMap<Local, (Ty<'tcx>, usize)>, GeneratorLayout<'tcx>, @@ -474,7 +475,7 @@ fn compute_layout<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, let (live_locals, storage_liveness) = locals_live_across_suspend_points(tcx, mir, source, - interior.movable); + movable); // Erase regions from the types passed in from typeck so we can compare them with // MIR types let allowed_upvars = tcx.erase_regions(&upvars); @@ -853,9 +854,11 @@ impl MirPass for StateTransform { let gen_ty = mir.local_decls.raw[1].ty; // Get the interior types and substs which typeck computed - let (upvars, interior) = match gen_ty.sty { - ty::TyGenerator(_, substs, interior) => { - (substs.upvar_tys(def_id, tcx).collect(), interior) + let (upvars, interior, movable) = match gen_ty.sty { + ty::TyGenerator(_, substs, interior, movability) => { + (substs.upvar_tys(def_id, tcx).collect(), + interior, + movability == hir::GeneratorMovability::Movable) } _ => bug!(), }; @@ -874,7 +877,13 @@ impl MirPass for StateTransform { // Extract locals which are live across suspension point into `layout` // `remap` gives a mapping from local indices onto generator struct indices // `storage_liveness` tells us which locals have live storage at suspension points - let (remap, layout, storage_liveness) = compute_layout(tcx, source, upvars, interior, mir); + let (remap, layout, storage_liveness) = compute_layout( + tcx, + source, + upvars, + interior, + movable, + mir); let state_field = mir.upvar_decls.len(); |
