Skip to content

Commit e7a2f52

Browse files
committed
don't inline polymorphic adt instances whose fields contain projections
in DropGlue.
1 parent 7871bec commit e7a2f52

File tree

2 files changed

+29
-9
lines changed

2 files changed

+29
-9
lines changed

compiler/rustc_mir_dataflow/src/elaborate_drops.rs

+3-8
Original file line numberDiff line numberDiff line change
@@ -272,15 +272,10 @@ where
272272
let field = FieldIdx::new(i);
273273
let subpath = self.elaborator.field_subpath(variant_path, field);
274274
let tcx = self.tcx();
275-
assert_eq!(self.elaborator.param_env().reveal(), Reveal::All);
276275

277-
let fty = f.ty(tcx, substs);
278-
let field_ty = match tcx
279-
.try_normalize_erasing_regions(self.elaborator.param_env(), f.ty(tcx, substs))
280-
{
281-
Ok(f_ty) => f_ty,
282-
Err(_) => fty,
283-
};
276+
assert_eq!(self.elaborator.param_env().reveal(), Reveal::All);
277+
let field_ty =
278+
tcx.normalize_erasing_regions(self.elaborator.param_env(), f.ty(tcx, substs));
284279

285280
(tcx.mk_place_field(base_place, field, field_ty), subpath)
286281
})

compiler/rustc_mir_transform/src/inline.rs

+26-1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ use rustc_index::Idx;
77
use rustc_middle::middle::codegen_fn_attrs::{CodegenFnAttrFlags, CodegenFnAttrs};
88
use rustc_middle::mir::visit::*;
99
use rustc_middle::mir::*;
10+
use rustc_middle::ty::TypeVisitableExt;
1011
use rustc_middle::ty::{self, Instance, InstanceDef, ParamEnv, Ty, TyCtxt};
1112
use rustc_session::config::OptLevel;
1213
use rustc_span::{hygiene::ExpnKind, ExpnData, LocalExpnId, Span};
@@ -168,7 +169,7 @@ impl<'tcx> Inliner<'tcx> {
168169
let callee_attrs = self.tcx.codegen_fn_attrs(callsite.callee.def_id());
169170
self.check_codegen_attributes(callsite, callee_attrs)?;
170171
self.check_mir_is_available(caller_body, &callsite.callee)?;
171-
let callee_body = self.tcx.instance_mir(callsite.callee.def);
172+
let callee_body = try_instance_mir(self.tcx, callsite.callee.def)?;
172173
self.check_mir_body(callsite, callee_body, callee_attrs)?;
173174

174175
if !self.tcx.consider_optimizing(|| {
@@ -1124,3 +1125,27 @@ impl<'tcx> MutVisitor<'tcx> for Integrator<'_, 'tcx> {
11241125
}
11251126
}
11261127
}
1128+
1129+
#[instrument(skip(tcx), level = "debug")]
1130+
fn try_instance_mir<'tcx>(
1131+
tcx: TyCtxt<'tcx>,
1132+
instance: InstanceDef<'tcx>,
1133+
) -> Result<&'tcx Body<'tcx>, &'static str> {
1134+
match instance {
1135+
ty::InstanceDef::DropGlue(_, Some(ty)) => match ty.kind() {
1136+
ty::Adt(def, substs) => {
1137+
let fields = def.all_fields();
1138+
for field in fields {
1139+
let field_ty = field.ty(tcx, substs);
1140+
if field_ty.has_param() && field_ty.has_projections() {
1141+
return Err("cannot build drop shim for polymorphic type");
1142+
}
1143+
}
1144+
1145+
Ok(tcx.instance_mir(instance))
1146+
}
1147+
_ => Ok(tcx.instance_mir(instance)),
1148+
},
1149+
_ => Ok(tcx.instance_mir(instance)),
1150+
}
1151+
}

0 commit comments

Comments
 (0)