Skip to main content

rustc_traits/
evaluate_obligation.rs

1use 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}