1 use rustc_infer::infer::canonical::CanonicalVarValues;
2 use rustc_infer::infer::type_variable::{TypeVariableOrigin, TypeVariableOriginKind};
3 use rustc_infer::infer::InferCtxt;
4 use rustc_infer::traits::query::NoSolution;
5 use rustc_middle::ty::Ty;
6 use rustc_span::DUMMY_SP;
8 use crate::solve::ExternalConstraints;
10 use super::{Certainty, QueryResult, Response};
12 /// Methods used inside of the canonical queries of the solver.
13 pub(super) trait InferCtxtExt<'tcx> {
14 fn next_ty_infer(&self) -> Ty<'tcx>;
16 fn make_canonical_response(
18 var_values: CanonicalVarValues<'tcx>,
20 ) -> QueryResult<'tcx>;
23 impl<'tcx> InferCtxtExt<'tcx> for InferCtxt<'tcx> {
24 fn next_ty_infer(&self) -> Ty<'tcx> {
25 self.next_ty_var(TypeVariableOrigin {
26 kind: TypeVariableOriginKind::MiscVariable,
31 fn make_canonical_response(
33 var_values: CanonicalVarValues<'tcx>,
35 ) -> QueryResult<'tcx> {
36 let external_constraints = take_external_constraints(self)?;
38 Ok(self.canonicalize_response(Response { var_values, external_constraints, certainty }))
42 #[instrument(level = "debug", skip(infcx), ret)]
43 fn take_external_constraints<'tcx>(
44 infcx: &InferCtxt<'tcx>,
45 ) -> Result<ExternalConstraints<'tcx>, NoSolution> {
46 let region_obligations = infcx.take_registered_region_obligations();
47 let opaque_types = infcx.take_opaque_types_for_query_response();
48 Ok(ExternalConstraints {
49 // FIXME: Now that's definitely wrong :)
51 // Should also do the leak check here I think
52 regions: drop(region_obligations),