diff --git a/src/eval_context.rs b/src/eval_context.rs index 3ddecc4337..d8002b604c 100644 --- a/src/eval_context.rs +++ b/src/eval_context.rs @@ -1944,13 +1944,13 @@ pub fn needs_drop_glue<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, t: Ty<'tcx>) -> bo // code quality is unknown at this time.) let env = tcx.empty_parameter_environment(); - if !tcx.type_needs_drop_given_env(t, &env) { + if !t.needs_drop(tcx, &env) { return false; } match t.sty { ty::TyAdt(def, _) if def.is_box() => { let typ = t.boxed_ty(); - if !tcx.type_needs_drop_given_env(typ, &env) && type_is_sized(tcx, typ) { + if !typ.needs_drop(tcx, &env) && type_is_sized(tcx, typ) { tcx.infer_ctxt((), traits::Reveal::All).enter(|infcx| { let layout = t.layout(&infcx).unwrap(); if layout.size(&tcx.data_layout).bytes() == 0 { diff --git a/src/step.rs b/src/step.rs index 79e940bee5..4a830d76b3 100644 --- a/src/step.rs +++ b/src/step.rs @@ -163,7 +163,11 @@ impl<'a, 'b, 'tcx> ConstantExtractor<'a, 'b, 'tcx> { self.try(|this| { let mir = this.ecx.load_mir(instance.def)?; this.ecx.globals.insert(cid, Global::uninitialized(mir.return_ty)); - let mutable = !shared || mir.return_ty.type_contents(this.ecx.tcx).interior_unsafe(); + let mutable = !shared || + !mir.return_ty.is_freeze( + this.ecx.tcx, + &this.ecx.tcx.empty_parameter_environment(), + span); let cleanup = StackPopCleanup::MarkStatic(mutable); let name = ty::tls::with(|tcx| tcx.item_path_str(def_id)); trace!("pushing stack frame for global: {}", name); diff --git a/src/terminator/intrinsic.rs b/src/terminator/intrinsic.rs index bf5623e485..ba51283af4 100644 --- a/src/terminator/intrinsic.rs +++ b/src/terminator/intrinsic.rs @@ -292,7 +292,7 @@ impl<'a, 'tcx> EvalContext<'a, 'tcx> { "needs_drop" => { let ty = substs.type_at(0); let env = self.tcx.empty_parameter_environment(); - let needs_drop = self.tcx.type_needs_drop_given_env(ty, &env); + let needs_drop = ty.needs_drop(self.tcx, &env); self.write_primval(dest, PrimVal::from_bool(needs_drop), dest_ty)?; }