EvalCtxt::commit_if_ok don't inherit nested goals
This commit is contained in:
parent
7bd385dc37
commit
42a9b0d7ab
@ -1,4 +1,4 @@
|
|||||||
use super::EvalCtxt;
|
use super::{EvalCtxt, NestedGoals};
|
||||||
use crate::solve::inspect;
|
use crate::solve::inspect;
|
||||||
use rustc_middle::traits::query::NoSolution;
|
use rustc_middle::traits::query::NoSolution;
|
||||||
|
|
||||||
@ -14,7 +14,7 @@ impl<'a, 'tcx> EvalCtxt<'a, 'tcx> {
|
|||||||
predefined_opaques_in_body: self.predefined_opaques_in_body,
|
predefined_opaques_in_body: self.predefined_opaques_in_body,
|
||||||
max_input_universe: self.max_input_universe,
|
max_input_universe: self.max_input_universe,
|
||||||
search_graph: self.search_graph,
|
search_graph: self.search_graph,
|
||||||
nested_goals: self.nested_goals.clone(),
|
nested_goals: NestedGoals::new(),
|
||||||
tainted: self.tainted,
|
tainted: self.tainted,
|
||||||
inspect: self.inspect.new_probe(),
|
inspect: self.inspect.new_probe(),
|
||||||
};
|
};
|
||||||
@ -32,7 +32,7 @@ impl<'a, 'tcx> EvalCtxt<'a, 'tcx> {
|
|||||||
tainted,
|
tainted,
|
||||||
inspect,
|
inspect,
|
||||||
} = nested_ecx;
|
} = nested_ecx;
|
||||||
self.nested_goals = nested_goals;
|
self.nested_goals.extend(nested_goals);
|
||||||
self.tainted = tainted;
|
self.tainted = tainted;
|
||||||
self.inspect.integrate_snapshot(inspect);
|
self.inspect.integrate_snapshot(inspect);
|
||||||
} else {
|
} else {
|
||||||
|
@ -108,7 +108,7 @@ pub(super) struct NestedGoals<'tcx> {
|
|||||||
pub(super) goals: Vec<Goal<'tcx, ty::Predicate<'tcx>>>,
|
pub(super) goals: Vec<Goal<'tcx, ty::Predicate<'tcx>>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl NestedGoals<'_> {
|
impl<'tcx> NestedGoals<'tcx> {
|
||||||
pub(super) fn new() -> Self {
|
pub(super) fn new() -> Self {
|
||||||
Self { normalizes_to_hack_goal: None, goals: Vec::new() }
|
Self { normalizes_to_hack_goal: None, goals: Vec::new() }
|
||||||
}
|
}
|
||||||
@ -116,6 +116,11 @@ impl NestedGoals<'_> {
|
|||||||
pub(super) fn is_empty(&self) -> bool {
|
pub(super) fn is_empty(&self) -> bool {
|
||||||
self.normalizes_to_hack_goal.is_none() && self.goals.is_empty()
|
self.normalizes_to_hack_goal.is_none() && self.goals.is_empty()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub(super) fn extend(&mut self, other: NestedGoals<'tcx>) {
|
||||||
|
assert_eq!(other.normalizes_to_hack_goal, None);
|
||||||
|
self.goals.extend(other.goals)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(PartialEq, Eq, Debug, Hash, HashStable, Clone, Copy)]
|
#[derive(PartialEq, Eq, Debug, Hash, HashStable, Clone, Copy)]
|
||||||
|
@ -334,11 +334,6 @@ impl<'tcx> EvalCtxt<'_, 'tcx> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// FIXME(@lcnr): If the normalization of the alias adds an inference constraint which
|
|
||||||
// causes a previously added goal to fail, then we treat the alias as rigid.
|
|
||||||
//
|
|
||||||
// These feels like a potential issue, I should look into writing some tests here
|
|
||||||
// and then probably changing `commit_if_ok` to not inherit the parent goals.
|
|
||||||
match self.commit_if_ok(|this| {
|
match self.commit_if_ok(|this| {
|
||||||
let normalized_ty = this.next_ty_infer();
|
let normalized_ty = this.next_ty_infer();
|
||||||
let normalizes_to_goal = Goal::new(
|
let normalizes_to_goal = Goal::new(
|
||||||
|
Loading…
x
Reference in New Issue
Block a user