Opt-in diagnostics reporting to avoid doing extra work in the new solver
This commit is contained in:
@@ -1,14 +1,16 @@
|
||||
use crate::solve::NextSolverError;
|
||||
use crate::traits::query::evaluate_obligation::InferCtxtExt as _;
|
||||
use crate::traits::{self, ObligationCtxt, SelectionContext};
|
||||
use crate::traits::{
|
||||
self, FromSolverError, Obligation, ObligationCause, ObligationCtxt, OldSolverError,
|
||||
SelectionContext,
|
||||
};
|
||||
|
||||
use rustc_hir::def_id::DefId;
|
||||
use rustc_hir::lang_items::LangItem;
|
||||
use rustc_infer::traits::Obligation;
|
||||
use rustc_macros::extension;
|
||||
use rustc_middle::arena::ArenaAllocatable;
|
||||
use rustc_middle::infer::canonical::{Canonical, CanonicalQueryResponse, QueryResponse};
|
||||
use rustc_middle::traits::query::NoSolution;
|
||||
use rustc_middle::traits::ObligationCause;
|
||||
use rustc_middle::ty::{self, Ty, TyCtxt, TypeFoldable, TypeVisitableExt};
|
||||
use rustc_middle::ty::{GenericArg, Upcast};
|
||||
use rustc_span::DUMMY_SP;
|
||||
@@ -94,7 +96,7 @@ impl<'tcx> InferCtxt<'tcx> {
|
||||
ty::TraitRef::new(self.tcx, trait_def_id, [ty]),
|
||||
)) {
|
||||
Ok(Some(selection)) => {
|
||||
let ocx = ObligationCtxt::new(self);
|
||||
let ocx = ObligationCtxt::new_with_diagnostics(self);
|
||||
ocx.register_obligations(selection.nested_obligations());
|
||||
Some(ocx.select_all_or_error())
|
||||
}
|
||||
@@ -122,19 +124,21 @@ impl<'tcx> InferCtxtBuilder<'tcx> {
|
||||
/// bound for the closure and in part because it is convenient to
|
||||
/// have `'tcx` be free on this function so that we can talk about
|
||||
/// `K: TypeFoldable<TyCtxt<'tcx>>`.)
|
||||
fn enter_canonical_trait_query<K, R>(
|
||||
fn enter_canonical_trait_query<K, R, E>(
|
||||
self,
|
||||
canonical_key: &Canonical<'tcx, K>,
|
||||
operation: impl FnOnce(&ObligationCtxt<'_, 'tcx>, K) -> Result<R, NoSolution>,
|
||||
operation: impl FnOnce(&ObligationCtxt<'_, 'tcx, E>, K) -> Result<R, NoSolution>,
|
||||
) -> Result<CanonicalQueryResponse<'tcx, R>, NoSolution>
|
||||
where
|
||||
K: TypeFoldable<TyCtxt<'tcx>>,
|
||||
R: Debug + TypeFoldable<TyCtxt<'tcx>>,
|
||||
Canonical<'tcx, QueryResponse<'tcx, R>>: ArenaAllocatable<'tcx>,
|
||||
E: FromSolverError<'tcx, NextSolverError<'tcx>>
|
||||
+ FromSolverError<'tcx, OldSolverError<'tcx>>,
|
||||
{
|
||||
let (infcx, key, canonical_inference_vars) =
|
||||
self.build_with_canonical(DUMMY_SP, canonical_key);
|
||||
let ocx = ObligationCtxt::new(&infcx);
|
||||
let ocx = ObligationCtxt::new_generic(&infcx);
|
||||
let value = operation(&ocx, key)?;
|
||||
ocx.make_canonicalized_query_response(canonical_inference_vars, value)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user