Skip to content

Commit 1548e0f

Browse files
committed
Inline evaluate_obligation instead of going through the query system
There are several reasons I changed this: - `evaluate_obligation` is only used in one place in `rustc_trait_selection`, and in fact warns you against using it anywhere else. - The implementation in `rustc_traits` was considerably more complicated than necessary, because it didn't have the context available in `rustc_trait_selection`. - It allows moving OverflowError into rustc_trait_selection, making rust-lang#81091 simpler (in particular, it allows holding an `Obligation` in OverflowError, which is only defined in `rustc_infer` and not available in rustc_middle). The only reason to keep the previous behavior is if the cache from the query system made it significantly faster.
1 parent 1f0fc02 commit 1548e0f

File tree

5 files changed

+8
-56
lines changed

5 files changed

+8
-56
lines changed

compiler/rustc_middle/src/query/mod.rs

+3-11
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@ use crate::dep_graph::SerializedDepNodeIndex;
22
use crate::mir::interpret::{GlobalId, LitToConstInput};
33
use crate::traits;
44
use crate::traits::query::{
5-
CanonicalPredicateGoal, CanonicalProjectionGoal, CanonicalTyGoal,
6-
CanonicalTypeOpAscribeUserTypeGoal, CanonicalTypeOpEqGoal, CanonicalTypeOpNormalizeGoal,
7-
CanonicalTypeOpProvePredicateGoal, CanonicalTypeOpSubtypeGoal,
5+
CanonicalProjectionGoal, CanonicalTyGoal, CanonicalTypeOpAscribeUserTypeGoal,
6+
CanonicalTypeOpEqGoal, CanonicalTypeOpNormalizeGoal, CanonicalTypeOpProvePredicateGoal,
7+
CanonicalTypeOpSubtypeGoal,
88
};
99
use crate::ty::query::queries;
1010
use crate::ty::subst::{GenericArg, SubstsRef};
@@ -1531,14 +1531,6 @@ rustc_queries! {
15311531
desc { "computing dropck types for `{:?}`", goal }
15321532
}
15331533

1534-
/// Do not call this query directly: invoke `infcx.predicate_may_hold()` or
1535-
/// `infcx.predicate_must_hold()` instead.
1536-
query evaluate_obligation(
1537-
goal: CanonicalPredicateGoal<'tcx>
1538-
) -> Result<traits::EvaluationResult, traits::OverflowError> {
1539-
desc { "evaluating trait selection obligation `{}`", goal.value.value }
1540-
}
1541-
15421534
query evaluate_goal(
15431535
goal: traits::CanonicalChalkEnvironmentAndGoal<'tcx>
15441536
) -> Result<

compiler/rustc_middle/src/ty/query/mod.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,9 @@ use crate::mir::interpret::{ConstValue, EvalToAllocationRawResult, EvalToConstVa
1818
use crate::mir::interpret::{LitToConstError, LitToConstInput};
1919
use crate::mir::mono::CodegenUnit;
2020
use crate::traits::query::{
21-
CanonicalPredicateGoal, CanonicalProjectionGoal, CanonicalTyGoal,
22-
CanonicalTypeOpAscribeUserTypeGoal, CanonicalTypeOpEqGoal, CanonicalTypeOpNormalizeGoal,
23-
CanonicalTypeOpProvePredicateGoal, CanonicalTypeOpSubtypeGoal, NoSolution,
21+
CanonicalProjectionGoal, CanonicalTyGoal, CanonicalTypeOpAscribeUserTypeGoal,
22+
CanonicalTypeOpEqGoal, CanonicalTypeOpNormalizeGoal, CanonicalTypeOpProvePredicateGoal,
23+
CanonicalTypeOpSubtypeGoal, NoSolution,
2424
};
2525
use crate::traits::query::{
2626
DropckOutlivesResult, DtorckConstraint, MethodAutoderefStepsResult, NormalizationResult,

compiler/rustc_trait_selection/src/traits/query/evaluate_obligation.rs

+2-8
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
use crate::infer::canonical::OriginalQueryValues;
21
use crate::infer::InferCtxt;
32
use crate::traits::{
43
EvaluationResult, OverflowError, PredicateObligation, SelectionContext, TraitQueryMode,
@@ -63,13 +62,8 @@ impl<'cx, 'tcx> InferCtxtExt<'tcx> for InferCtxt<'cx, 'tcx> {
6362
&self,
6463
obligation: &PredicateObligation<'tcx>,
6564
) -> Result<EvaluationResult, OverflowError> {
66-
let mut _orig_values = OriginalQueryValues::default();
67-
let c_pred = self
68-
.canonicalize_query(obligation.param_env.and(obligation.predicate), &mut _orig_values);
69-
// Run canonical query. If overflow occurs, rerun from scratch but this time
70-
// in standard trait query mode so that overflow is handled appropriately
71-
// within `SelectionContext`.
72-
self.tcx.evaluate_obligation(c_pred)
65+
let mut selcx = SelectionContext::with_query_mode(self, TraitQueryMode::Canonical);
66+
selcx.evaluate_root_obligation(&obligation)
7367
}
7468

7569
// Helper function that canonicalizes and runs the query. If an

compiler/rustc_traits/src/evaluate_obligation.rs

-32
This file was deleted.

compiler/rustc_traits/src/lib.rs

-2
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ extern crate rustc_middle;
1414

1515
mod chalk;
1616
mod dropck_outlives;
17-
mod evaluate_obligation;
1817
mod implied_outlives_bounds;
1918
mod normalize_erasing_regions;
2019
mod normalize_projection_ty;
@@ -24,7 +23,6 @@ use rustc_middle::ty::query::Providers;
2423

2524
pub fn provide(p: &mut Providers) {
2625
dropck_outlives::provide(p);
27-
evaluate_obligation::provide(p);
2826
implied_outlives_bounds::provide(p);
2927
chalk::provide(p);
3028
normalize_projection_ty::provide(p);

0 commit comments

Comments
 (0)