Remove associated type based effects logic
This commit is contained in:
parent
8aca4bab08
commit
a16d491054
73 changed files with 85 additions and 1519 deletions
|
@ -431,7 +431,6 @@ impl<D: SolverDelegate<Interner = I>, I: Interner> TypeFolder<I> for Canonicaliz
|
|||
);
|
||||
CanonicalVarKind::Const(self.delegate.universe_of_ct(vid).unwrap())
|
||||
}
|
||||
ty::InferConst::EffectVar(_) => CanonicalVarKind::Effect,
|
||||
ty::InferConst::Fresh(_) => todo!(),
|
||||
},
|
||||
ty::ConstKind::Placeholder(placeholder) => match self.canonicalize_mode {
|
||||
|
|
|
@ -76,9 +76,6 @@ impl<D: SolverDelegate<Interner = I>, I: Interner> TypeFolder<I> for EagerResolv
|
|||
resolved
|
||||
}
|
||||
}
|
||||
ty::ConstKind::Infer(ty::InferConst::EffectVar(vid)) => {
|
||||
self.delegate.opportunistic_resolve_effect_var(vid)
|
||||
}
|
||||
_ => {
|
||||
if c.has_infer() {
|
||||
c.super_fold_with(self)
|
||||
|
|
|
@ -270,11 +270,6 @@ where
|
|||
ecx: &mut EvalCtxt<'_, D>,
|
||||
goal: Goal<I, Self>,
|
||||
) -> Vec<Candidate<I>>;
|
||||
|
||||
fn consider_builtin_effects_intersection_candidate(
|
||||
ecx: &mut EvalCtxt<'_, D>,
|
||||
goal: Goal<I, Self>,
|
||||
) -> Result<Candidate<I>, NoSolution>;
|
||||
}
|
||||
|
||||
impl<D, I> EvalCtxt<'_, D>
|
||||
|
@ -481,9 +476,6 @@ where
|
|||
Some(TraitSolverLangItem::TransmuteTrait) => {
|
||||
G::consider_builtin_transmute_candidate(self, goal)
|
||||
}
|
||||
Some(TraitSolverLangItem::EffectsIntersection) => {
|
||||
G::consider_builtin_effects_intersection_candidate(self, goal)
|
||||
}
|
||||
_ => Err(NoSolution),
|
||||
}
|
||||
};
|
||||
|
|
|
@ -182,12 +182,6 @@ where
|
|||
let (ct, ty) = goal.predicate;
|
||||
|
||||
let ct_ty = match ct.kind() {
|
||||
// FIXME: Ignore effect vars because canonicalization doesn't handle them correctly
|
||||
// and if we stall on the var then we wind up creating ambiguity errors in a probe
|
||||
// for this goal which contains an effect var. Which then ends up ICEing.
|
||||
ty::ConstKind::Infer(ty::InferConst::EffectVar(_)) => {
|
||||
return self.evaluate_added_goals_and_make_canonical_response(Certainty::Yes);
|
||||
}
|
||||
ty::ConstKind::Infer(_) => {
|
||||
return self.evaluate_added_goals_and_make_canonical_response(Certainty::AMBIGUOUS);
|
||||
}
|
||||
|
|
|
@ -911,68 +911,6 @@ where
|
|||
) -> Result<Candidate<I>, NoSolution> {
|
||||
panic!("`TransmuteFrom` does not have an associated type: {:?}", goal)
|
||||
}
|
||||
|
||||
fn consider_builtin_effects_intersection_candidate(
|
||||
ecx: &mut EvalCtxt<'_, D>,
|
||||
goal: Goal<I, Self>,
|
||||
) -> Result<Candidate<I>, NoSolution> {
|
||||
let ty::Tuple(types) = goal.predicate.self_ty().kind() else {
|
||||
return Err(NoSolution);
|
||||
};
|
||||
|
||||
let cx = ecx.cx();
|
||||
|
||||
let mut first_non_maybe = None;
|
||||
let mut non_maybe_count = 0;
|
||||
for ty in types.iter() {
|
||||
if !matches!(ty::EffectKind::try_from_ty(cx, ty), Some(ty::EffectKind::Maybe)) {
|
||||
first_non_maybe.get_or_insert(ty);
|
||||
non_maybe_count += 1;
|
||||
}
|
||||
}
|
||||
|
||||
match non_maybe_count {
|
||||
0 => {
|
||||
let ty = ty::EffectKind::Maybe.to_ty(cx);
|
||||
ecx.probe_builtin_trait_candidate(BuiltinImplSource::Misc).enter(|ecx| {
|
||||
ecx.instantiate_normalizes_to_term(goal, ty.into());
|
||||
ecx.evaluate_added_goals_and_make_canonical_response(Certainty::Yes)
|
||||
})
|
||||
}
|
||||
1 => {
|
||||
let ty = first_non_maybe.unwrap();
|
||||
ecx.probe_builtin_trait_candidate(BuiltinImplSource::Misc).enter(|ecx| {
|
||||
ecx.instantiate_normalizes_to_term(goal, ty.into());
|
||||
ecx.evaluate_added_goals_and_make_canonical_response(Certainty::Yes)
|
||||
})
|
||||
}
|
||||
_ => {
|
||||
let mut min = ty::EffectKind::Maybe;
|
||||
|
||||
for ty in types.iter() {
|
||||
// We can't find the intersection if the types used are generic.
|
||||
//
|
||||
// FIXME(effects): do we want to look at where clauses to get some
|
||||
// clue for the case where generic types are being used?
|
||||
let Some(kind) = ty::EffectKind::try_from_ty(cx, ty) else {
|
||||
return Err(NoSolution);
|
||||
};
|
||||
|
||||
let Some(result) = ty::EffectKind::intersection(min, kind) else {
|
||||
return Err(NoSolution);
|
||||
};
|
||||
|
||||
min = result;
|
||||
}
|
||||
|
||||
let ty = min.to_ty(cx);
|
||||
ecx.probe_builtin_trait_candidate(BuiltinImplSource::Misc).enter(|ecx| {
|
||||
ecx.instantiate_normalizes_to_term(goal, ty.into());
|
||||
ecx.evaluate_added_goals_and_make_canonical_response(Certainty::Yes)
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl<D, I> EvalCtxt<'_, D>
|
||||
|
|
|
@ -719,47 +719,6 @@ where
|
|||
}
|
||||
})
|
||||
}
|
||||
|
||||
fn consider_builtin_effects_intersection_candidate(
|
||||
ecx: &mut EvalCtxt<'_, D>,
|
||||
goal: Goal<I, Self>,
|
||||
) -> Result<Candidate<I>, NoSolution> {
|
||||
if goal.predicate.polarity != ty::PredicatePolarity::Positive {
|
||||
return Err(NoSolution);
|
||||
}
|
||||
|
||||
let ty::Tuple(types) = goal.predicate.self_ty().kind() else {
|
||||
return Err(NoSolution);
|
||||
};
|
||||
|
||||
let cx = ecx.cx();
|
||||
let maybe_count = types
|
||||
.iter()
|
||||
.filter_map(|ty| ty::EffectKind::try_from_ty(cx, ty))
|
||||
.filter(|&ty| ty == ty::EffectKind::Maybe)
|
||||
.count();
|
||||
|
||||
// Don't do concrete type check unless there are more than one type that will influence the result.
|
||||
// This would allow `(Maybe, T): Min` pass even if we know nothing about `T`.
|
||||
if types.len() - maybe_count > 1 {
|
||||
let mut min = ty::EffectKind::Maybe;
|
||||
|
||||
for ty in types.iter() {
|
||||
let Some(kind) = ty::EffectKind::try_from_ty(ecx.cx(), ty) else {
|
||||
return Err(NoSolution);
|
||||
};
|
||||
|
||||
let Some(result) = ty::EffectKind::intersection(min, kind) else {
|
||||
return Err(NoSolution);
|
||||
};
|
||||
|
||||
min = result;
|
||||
}
|
||||
}
|
||||
|
||||
ecx.probe_builtin_trait_candidate(BuiltinImplSource::Misc)
|
||||
.enter(|ecx| ecx.evaluate_added_goals_and_make_canonical_response(Certainty::Yes))
|
||||
}
|
||||
}
|
||||
|
||||
impl<D, I> EvalCtxt<'_, D>
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue