Skip to content

Commit dec104c

Browse files
authored
Rollup merge of #113536 - lcnr:proof-tree-select, r=BoxyUwU
avoid building proof trees in select otherwise we ICE because select isn't currently set up to print proof trees. r? `````@BoxyUwU`````
2 parents a161ab0 + 4965caf commit dec104c

File tree

5 files changed

+22
-28
lines changed

5 files changed

+22
-28
lines changed

compiler/rustc_trait_selection/src/solve/eval_ctxt.rs

+3-2
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,8 @@ impl NestedGoals<'_> {
116116
#[derive(PartialEq, Eq, Debug, Hash, HashStable, Clone, Copy)]
117117
pub enum GenerateProofTree {
118118
Yes(UseGlobalCache),
119-
No,
119+
IfEnabled,
120+
Never,
120121
}
121122

122123
#[derive(PartialEq, Eq, Debug, Hash, HashStable, Clone, Copy)]
@@ -202,7 +203,7 @@ impl<'a, 'tcx> EvalCtxt<'a, 'tcx> {
202203
(&tree, infcx.tcx.sess.opts.unstable_opts.dump_solver_proof_tree)
203204
{
204205
let mut lock = std::io::stdout().lock();
205-
let _ = lock.write_fmt(format_args!("{tree:?}"));
206+
let _ = lock.write_fmt(format_args!("{tree:?}\n"));
206207
let _ = lock.flush();
207208
}
208209

compiler/rustc_trait_selection/src/solve/eval_ctxt/select.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ impl<'tcx> InferCtxtSelectExt<'tcx> for InferCtxt<'tcx> {
4141
self.instantiate_binder_with_placeholders(obligation.predicate),
4242
);
4343

44-
let (result, _) = EvalCtxt::enter_root(self, GenerateProofTree::No, |ecx| {
44+
let (result, _) = EvalCtxt::enter_root(self, GenerateProofTree::Never, |ecx| {
4545
let goal = Goal::new(ecx.tcx(), trait_goal.param_env, trait_goal.predicate);
4646
let (orig_values, canonical_goal) = ecx.canonicalize_goal(goal);
4747
let mut candidates = ecx.compute_canonical_trait_candidates(canonical_goal);

compiler/rustc_trait_selection/src/solve/fulfill.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ impl<'tcx> TraitEngine<'tcx> for FulfillmentCtxt<'tcx> {
5757
.map(|obligation| {
5858
let code = infcx.probe(|_| {
5959
match infcx
60-
.evaluate_root_goal(obligation.clone().into(), GenerateProofTree::No)
60+
.evaluate_root_goal(obligation.clone().into(), GenerateProofTree::IfEnabled)
6161
.0
6262
{
6363
Ok((_, Certainty::Maybe(MaybeCause::Ambiguity), _)) => {
@@ -96,7 +96,7 @@ impl<'tcx> TraitEngine<'tcx> for FulfillmentCtxt<'tcx> {
9696
for obligation in mem::take(&mut self.obligations) {
9797
let goal = obligation.clone().into();
9898
let (changed, certainty, nested_goals) =
99-
match infcx.evaluate_root_goal(goal, GenerateProofTree::No).0 {
99+
match infcx.evaluate_root_goal(goal, GenerateProofTree::IfEnabled).0 {
100100
Ok(result) => result,
101101
Err(NoSolution) => {
102102
errors.push(FulfillmentError {

compiler/rustc_trait_selection/src/solve/inspect.rs

+15-22
Original file line numberDiff line numberDiff line change
@@ -200,30 +200,23 @@ impl<'tcx> ProofTreeBuilder<'tcx> {
200200
tcx: TyCtxt<'tcx>,
201201
generate_proof_tree: GenerateProofTree,
202202
) -> ProofTreeBuilder<'tcx> {
203-
let generate_proof_tree = match (
204-
tcx.sess.opts.unstable_opts.dump_solver_proof_tree,
205-
tcx.sess.opts.unstable_opts.dump_solver_proof_tree_use_cache,
206-
generate_proof_tree,
207-
) {
208-
(_, Some(use_cache), GenerateProofTree::Yes(_)) => {
209-
GenerateProofTree::Yes(UseGlobalCache::from_bool(use_cache))
210-
}
211-
212-
(DumpSolverProofTree::Always, use_cache, GenerateProofTree::No) => {
213-
let use_cache = use_cache.unwrap_or(true);
214-
GenerateProofTree::Yes(UseGlobalCache::from_bool(use_cache))
215-
}
216-
217-
(_, None, GenerateProofTree::Yes(_)) => generate_proof_tree,
218-
(DumpSolverProofTree::Never, _, _) => generate_proof_tree,
219-
(DumpSolverProofTree::OnError, _, _) => generate_proof_tree,
220-
};
221-
222203
match generate_proof_tree {
223-
GenerateProofTree::No => ProofTreeBuilder::new_noop(),
224-
GenerateProofTree::Yes(global_cache_disabled) => {
225-
ProofTreeBuilder::new_root(global_cache_disabled)
204+
GenerateProofTree::Never => ProofTreeBuilder::new_noop(),
205+
GenerateProofTree::IfEnabled => {
206+
let opts = &tcx.sess.opts.unstable_opts;
207+
match opts.dump_solver_proof_tree {
208+
DumpSolverProofTree::Always => {
209+
let use_cache = opts.dump_solver_proof_tree_use_cache.unwrap_or(true);
210+
ProofTreeBuilder::new_root(UseGlobalCache::from_bool(use_cache))
211+
}
212+
// `OnError` is handled by reevaluating goals in error
213+
// reporting with `GenerateProofTree::Yes`.
214+
DumpSolverProofTree::OnError | DumpSolverProofTree::Never => {
215+
ProofTreeBuilder::new_noop()
216+
}
217+
}
226218
}
219+
GenerateProofTree::Yes(use_cache) => ProofTreeBuilder::new_root(use_cache),
227220
}
228221
}
229222

compiler/rustc_trait_selection/src/traits/error_reporting/mod.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -3569,7 +3569,7 @@ pub fn dump_proof_tree<'tcx>(o: &Obligation<'tcx, ty::Predicate<'tcx>>, infcx: &
35693569
.1
35703570
.expect("proof tree should have been generated");
35713571
let mut lock = std::io::stdout().lock();
3572-
let _ = lock.write_fmt(format_args!("{tree:?}"));
3572+
let _ = lock.write_fmt(format_args!("{tree:?}\n"));
35733573
let _ = lock.flush();
35743574
});
35753575
}

0 commit comments

Comments
 (0)