tcx: TyCtxt<'tcx>,
def_id: DefId,
) -> GeneratorLayout<'tcx> {
+ assert!(tcx.sess.opts.unstable_opts.drop_tracking_mir);
let def_id = def_id.expect_local();
let (body, _) = tcx.mir_promoted(ty::WithOptConstParam::unknown(def_id));
let gen_ty = body.local_decls[ty::CAPTURE_STRUCT_LOCAL].ty;
// Get the interior types and substs which typeck computed
- let (upvars, interior, movable) = match *gen_ty.kind() {
- ty::Generator(_, substs, movability) => {
- let substs = substs.as_generator();
- (
- substs.upvar_tys().collect::<Vec<_>>(),
- substs.witness(),
- movability == hir::Movability::Movable,
- )
- }
+ let movable = match *gen_ty.kind() {
+ ty::Generator(_, _, movability) => movability == hir::Movability::Movable,
_ => span_bug!(body.span, "unexpected generator type {}", gen_ty),
};
// `storage_liveness` tells us which locals have live storage at suspension points
let (_, generator_layout, _) = compute_layout(tcx, liveness_info, body);
- if tcx.sess.opts.unstable_opts.drop_tracking_mir {
- check_suspend_tys(tcx, &generator_layout, &body);
- } else {
- sanitize_witness(tcx, body, interior, upvars, &generator_layout);
- }
+ check_suspend_tys(tcx, &generator_layout, &body);
generator_layout
}
let gen_ty = body.local_decls.raw[1].ty;
// Get the discriminant type and substs which typeck computed
- let (discr_ty, movable) = match *gen_ty.kind() {
+ let (discr_ty, upvars, interior, movable) = match *gen_ty.kind() {
ty::Generator(_, substs, movability) => {
let substs = substs.as_generator();
- (substs.discr_ty(tcx), movability == hir::Movability::Movable)
+ (
+ substs.discr_ty(tcx),
+ substs.upvar_tys().collect::<Vec<_>>(),
+ substs.witness(),
+ movability == hir::Movability::Movable,
+ )
}
_ => {
tcx.sess
// `storage_liveness` tells us which locals have live storage at suspension points
let (remap, layout, storage_liveness) = compute_layout(tcx, liveness_info, body);
+ if tcx.sess.opts.unstable_opts.validate_mir
+ && !tcx.sess.opts.unstable_opts.drop_tracking_mir
+ {
+ sanitize_witness(tcx, body, interior, upvars, &layout);
+ }
+
let can_return = can_return(tcx, body, tcx.param_env(body.source.def_id()));
// Run the transformation which converts Places from Local to generator struct
| StatementKind::AscribeUserType(..)
| StatementKind::Coverage(..)
| StatementKind::Intrinsic(..)
+ | StatementKind::ConstEvalCounter
| StatementKind::Nop => {}
}
}