Substitute types before checking compatibility.
This commit is contained in:
parent
b657dc555b
commit
45ffe41d14
@ -440,6 +440,10 @@ impl<'tcx> Inliner<'tcx> {
|
||||
validation: Ok(()),
|
||||
};
|
||||
|
||||
for var_debug_info in callee_body.var_debug_info.iter() {
|
||||
checker.visit_var_debug_info(var_debug_info);
|
||||
}
|
||||
|
||||
// Traverse the MIR manually so we can account for the effects of inlining on the CFG.
|
||||
let mut work_list = vec![START_BLOCK];
|
||||
let mut visited = BitSet::new_empty(callee_body.basic_blocks.len());
|
||||
@ -847,7 +851,16 @@ impl<'tcx> Visitor<'tcx> for CostChecker<'_, 'tcx> {
|
||||
if let ProjectionElem::Field(f, ty) = elem {
|
||||
let parent_ty = place_ref.ty(&self.callee_body.local_decls, self.tcx);
|
||||
let check_equal = |this: &mut Self, f_ty| {
|
||||
if !util::is_equal_up_to_subtyping(this.tcx, this.param_env, ty, f_ty) {
|
||||
// Fast path if there is nothing to substitute.
|
||||
if ty == f_ty {
|
||||
return;
|
||||
}
|
||||
let ty = this.instance.subst_mir(this.tcx, ty::EarlyBinder::bind(&ty));
|
||||
let f_ty = this.instance.subst_mir(this.tcx, ty::EarlyBinder::bind(&f_ty));
|
||||
if ty == f_ty {
|
||||
return;
|
||||
}
|
||||
if !util::is_subtype(this.tcx, this.param_env, ty, f_ty) {
|
||||
trace!(?ty, ?f_ty);
|
||||
this.validation = Err("failed to normalize projection type");
|
||||
return;
|
||||
|
Loading…
x
Reference in New Issue
Block a user