split opaque type handling in new solver
be more explicit in where we only add new hidden types and where we also have to deal with item bounds.
This commit is contained in:
parent
669d609dfd
commit
b62e20d2fd
5 changed files with 121 additions and 85 deletions
|
@ -27,6 +27,7 @@ use rustc_middle::mir::visit::{NonMutatingUseContext, PlaceContext, Visitor};
|
|||
use rustc_middle::mir::AssertKind;
|
||||
use rustc_middle::mir::*;
|
||||
use rustc_middle::traits::query::NoSolution;
|
||||
use rustc_middle::traits::ObligationCause;
|
||||
use rustc_middle::ty::adjustment::PointerCast;
|
||||
use rustc_middle::ty::cast::CastTy;
|
||||
use rustc_middle::ty::subst::{SubstsRef, UserSubsts};
|
||||
|
@ -1051,15 +1052,28 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> {
|
|||
ConstraintCategory::OpaqueType,
|
||||
CustomTypeOp::new(
|
||||
|ocx| {
|
||||
for (key, hidden_ty) in renumbered_opaques {
|
||||
ocx.register_infer_ok_obligations(
|
||||
ocx.infcx.register_hidden_type_in_new_solver(
|
||||
key,
|
||||
param_env,
|
||||
hidden_ty.ty,
|
||||
)?,
|
||||
let mut obligations = Vec::new();
|
||||
for (opaque_type_key, hidden_ty) in renumbered_opaques {
|
||||
let cause = ObligationCause::dummy();
|
||||
ocx.infcx.insert_hidden_type(
|
||||
opaque_type_key,
|
||||
&cause,
|
||||
param_env,
|
||||
hidden_ty.ty,
|
||||
true,
|
||||
&mut obligations,
|
||||
)?;
|
||||
|
||||
ocx.infcx.add_item_bounds_for_hidden_type(
|
||||
opaque_type_key,
|
||||
cause,
|
||||
param_env,
|
||||
hidden_ty.ty,
|
||||
&mut obligations,
|
||||
);
|
||||
}
|
||||
|
||||
ocx.register_obligations(obligations);
|
||||
Ok(())
|
||||
},
|
||||
"register pre-defined opaques",
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue