Remove associated type based effects logic
This commit is contained in:
parent
8aca4bab08
commit
a16d491054
73 changed files with 85 additions and 1519 deletions
|
@ -2374,50 +2374,14 @@ impl<'a, 'tcx> TypeErrCtxt<'a, 'tcx> {
|
|||
})
|
||||
}
|
||||
|
||||
/// For effects predicates such as `<u32 as Add>::Effects: Compat<host>`, pretend that the
|
||||
/// predicate that failed was `u32: Add`. Return the constness of such predicate to later
|
||||
/// print as `u32: ~const Add`.
|
||||
// FIXME(effects): Remove this.
|
||||
fn get_effects_trait_pred_override(
|
||||
&self,
|
||||
p: ty::PolyTraitPredicate<'tcx>,
|
||||
leaf: ty::PolyTraitPredicate<'tcx>,
|
||||
span: Span,
|
||||
) -> (ty::PolyTraitPredicate<'tcx>, ty::PolyTraitPredicate<'tcx>, Option<ty::BoundConstness>)
|
||||
{
|
||||
let trait_ref = p.to_poly_trait_ref();
|
||||
if !self.tcx.is_lang_item(trait_ref.def_id(), LangItem::EffectsCompat) {
|
||||
return (p, leaf, None);
|
||||
}
|
||||
|
||||
let Some(ty::Alias(ty::AliasTyKind::Projection, projection)) =
|
||||
trait_ref.self_ty().no_bound_vars().map(Ty::kind)
|
||||
else {
|
||||
return (p, leaf, None);
|
||||
};
|
||||
|
||||
let constness = trait_ref.skip_binder().args.const_at(1);
|
||||
|
||||
let constness = if constness == self.tcx.consts.true_ || constness.is_ct_infer() {
|
||||
None
|
||||
} else if constness == self.tcx.consts.false_ {
|
||||
Some(ty::BoundConstness::Const)
|
||||
} else if matches!(constness.kind(), ty::ConstKind::Param(_)) {
|
||||
Some(ty::BoundConstness::ConstIfConst)
|
||||
} else {
|
||||
self.dcx().span_bug(span, format!("Unknown constness argument: {constness:?}"));
|
||||
};
|
||||
|
||||
let new_pred = p.map_bound(|mut trait_pred| {
|
||||
trait_pred.trait_ref = projection.trait_ref(self.tcx);
|
||||
trait_pred
|
||||
});
|
||||
|
||||
let new_leaf = leaf.map_bound(|mut trait_pred| {
|
||||
trait_pred.trait_ref = projection.trait_ref(self.tcx);
|
||||
trait_pred
|
||||
});
|
||||
|
||||
(new_pred, new_leaf, constness)
|
||||
_span: Span,
|
||||
) -> (ty::PolyTraitPredicate<'tcx>, ty::PolyTraitPredicate<'tcx>, ty::BoundConstness) {
|
||||
(p, leaf, ty::BoundConstness::NotConst)
|
||||
}
|
||||
|
||||
fn add_tuple_trait_message(
|
||||
|
|
|
@ -450,7 +450,6 @@ impl<'a, 'tcx> ObligationProcessor for FulfillProcessor<'a, 'tcx> {
|
|||
ty::ConstKind::Infer(var) => {
|
||||
let var = match var {
|
||||
ty::InferConst::Var(vid) => TyOrConstInferVar::Const(vid),
|
||||
ty::InferConst::EffectVar(vid) => TyOrConstInferVar::Effect(vid),
|
||||
ty::InferConst::Fresh(_) => {
|
||||
bug!("encountered fresh const in fulfill")
|
||||
}
|
||||
|
|
|
@ -547,7 +547,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
|
|||
}
|
||||
}
|
||||
// Provide an impl for suitable functions, rejecting `#[target_feature]` functions (RFC 2396).
|
||||
ty::FnDef(def_id, _args) => {
|
||||
ty::FnDef(def_id, _) => {
|
||||
let tcx = self.tcx();
|
||||
if tcx.fn_sig(def_id).skip_binder().is_fn_trait_compatible()
|
||||
&& tcx.codegen_fn_attrs(def_id).target_features.is_empty()
|
||||
|
|
|
@ -1821,8 +1821,7 @@ impl<'tcx> SelectionContext<'_, 'tcx> {
|
|||
|cand: ty::PolyTraitPredicate<'tcx>| cand.is_global() && !cand.has_bound_vars();
|
||||
|
||||
// (*) Prefer `BuiltinCandidate { has_nested: false }`, `PointeeCandidate`,
|
||||
// `DiscriminantKindCandidate`, `ConstDestructCandidate`
|
||||
// to anything else.
|
||||
// or `DiscriminantKindCandidate` to anything else.
|
||||
//
|
||||
// This is a fix for #53123 and prevents winnowing from accidentally extending the
|
||||
// lifetime of a variable.
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue