rustc_traits/
evaluate_obligation.rs1use rustc_infer::infer::TyCtxtInferExt;
2use rustc_middle::query::Providers;
3use rustc_middle::ty::{ParamEnvAnd, TyCtxt};
4use rustc_span::DUMMY_SP;
5use rustc_trait_selection::traits::query::CanonicalPredicateGoal;
6use rustc_trait_selection::traits::{
7 EvaluationResult, Obligation, ObligationCause, OverflowError, SelectionContext, TraitQueryMode,
8 sizedness_fast_path,
9};
10use tracing::debug;
11
12pub(crate) fn provide(p: &mut Providers) {
13 *p = Providers { evaluate_obligation, ..*p };
14}
15
16fn evaluate_obligation<'tcx>(
17 tcx: TyCtxt<'tcx>,
18 canonical_goal: CanonicalPredicateGoal<'tcx>,
19) -> Result<EvaluationResult, OverflowError> {
20 if !!tcx.next_trait_solver_globally() {
::core::panicking::panic("assertion failed: !tcx.next_trait_solver_globally()")
};assert!(!tcx.next_trait_solver_globally());
21 {
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event compiler/rustc_traits/src/evaluate_obligation.rs:21",
"rustc_traits::evaluate_obligation",
::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("compiler/rustc_traits/src/evaluate_obligation.rs"),
::tracing_core::__macro_support::Option::Some(21u32),
::tracing_core::__macro_support::Option::Some("rustc_traits::evaluate_obligation"),
::tracing_core::field::FieldSet::new(&["message"],
::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::EVENT)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let enabled =
::tracing::Level::DEBUG <= ::tracing::level_filters::STATIC_MAX_LEVEL
&&
::tracing::Level::DEBUG <=
::tracing::level_filters::LevelFilter::current() &&
{
let interest = __CALLSITE.interest();
!interest.is_never() &&
::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
interest)
};
if enabled {
(|value_set: ::tracing::field::ValueSet|
{
let meta = __CALLSITE.metadata();
::tracing::Event::dispatch(meta, &value_set);
;
})({
#[allow(unused_imports)]
use ::tracing::field::{debug, display, Value};
let mut iter = __CALLSITE.metadata().fields().iter();
__CALLSITE.metadata().fields().value_set(&[(&::tracing::__macro_support::Iterator::next(&mut iter).expect("FieldSet corrupted (this is a bug)"),
::tracing::__macro_support::Option::Some(&format_args!("evaluate_obligation(canonical_goal={0:#?})",
canonical_goal) as &dyn Value))])
});
} else { ; }
};debug!("evaluate_obligation(canonical_goal={:#?})", canonical_goal);
22 let (ref infcx, goal, _var_values) =
23 tcx.infer_ctxt().build_with_canonical(DUMMY_SP, &canonical_goal);
24 {
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event compiler/rustc_traits/src/evaluate_obligation.rs:24",
"rustc_traits::evaluate_obligation",
::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("compiler/rustc_traits/src/evaluate_obligation.rs"),
::tracing_core::__macro_support::Option::Some(24u32),
::tracing_core::__macro_support::Option::Some("rustc_traits::evaluate_obligation"),
::tracing_core::field::FieldSet::new(&["message"],
::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::EVENT)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let enabled =
::tracing::Level::DEBUG <= ::tracing::level_filters::STATIC_MAX_LEVEL
&&
::tracing::Level::DEBUG <=
::tracing::level_filters::LevelFilter::current() &&
{
let interest = __CALLSITE.interest();
!interest.is_never() &&
::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
interest)
};
if enabled {
(|value_set: ::tracing::field::ValueSet|
{
let meta = __CALLSITE.metadata();
::tracing::Event::dispatch(meta, &value_set);
;
})({
#[allow(unused_imports)]
use ::tracing::field::{debug, display, Value};
let mut iter = __CALLSITE.metadata().fields().iter();
__CALLSITE.metadata().fields().value_set(&[(&::tracing::__macro_support::Iterator::next(&mut iter).expect("FieldSet corrupted (this is a bug)"),
::tracing::__macro_support::Option::Some(&format_args!("evaluate_obligation: goal={0:#?}",
goal) as &dyn Value))])
});
} else { ; }
};debug!("evaluate_obligation: goal={:#?}", goal);
25 let ParamEnvAnd { param_env, value: predicate } = goal;
26
27 if sizedness_fast_path(tcx, predicate, param_env) {
28 return Ok(EvaluationResult::EvaluatedToOk);
29 }
30
31 let mut selcx = SelectionContext::with_query_mode(infcx, TraitQueryMode::Canonical);
32 let obligation = Obligation::new(tcx, ObligationCause::dummy(), param_env, predicate);
33
34 selcx.evaluate_root_obligation(&obligation)
35}