stabilize feature(trait_upcasting)
This commit is contained in:
parent
942db6782f
commit
da9a85a1a6
6 changed files with 6 additions and 90 deletions
|
@ -12,9 +12,7 @@ use hir::LangItem;
|
|||
use hir::def_id::DefId;
|
||||
use rustc_data_structures::fx::{FxHashSet, FxIndexSet};
|
||||
use rustc_hir as hir;
|
||||
use rustc_infer::traits::{
|
||||
Obligation, ObligationCause, PolyTraitObligation, PredicateObligations, SelectionError,
|
||||
};
|
||||
use rustc_infer::traits::{Obligation, PolyTraitObligation, SelectionError};
|
||||
use rustc_middle::ty::fast_reject::DeepRejectCtxt;
|
||||
use rustc_middle::ty::{self, Ty, TypeVisitableExt, TypingMode};
|
||||
use rustc_middle::{bug, span_bug};
|
||||
|
@ -23,8 +21,6 @@ use tracing::{debug, instrument, trace};
|
|||
|
||||
use super::SelectionCandidate::*;
|
||||
use super::{BuiltinImplConditions, SelectionCandidateSet, SelectionContext, TraitObligationStack};
|
||||
use crate::traits;
|
||||
use crate::traits::query::evaluate_obligation::InferCtxtExt;
|
||||
use crate::traits::util;
|
||||
|
||||
impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
|
||||
|
@ -904,54 +900,6 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
|
|||
})
|
||||
}
|
||||
|
||||
/// Temporary migration for #89190
|
||||
fn need_migrate_deref_output_trait_object(
|
||||
&mut self,
|
||||
ty: Ty<'tcx>,
|
||||
param_env: ty::ParamEnv<'tcx>,
|
||||
cause: &ObligationCause<'tcx>,
|
||||
) -> Option<ty::PolyExistentialTraitRef<'tcx>> {
|
||||
// Don't drop any candidates in intercrate mode, as it's incomplete.
|
||||
// (Not that it matters, since `Unsize` is not a stable trait.)
|
||||
//
|
||||
// FIXME(@lcnr): This should probably only trigger during analysis,
|
||||
// disabling candidates during codegen is also questionable.
|
||||
if let TypingMode::Coherence = self.infcx.typing_mode() {
|
||||
return None;
|
||||
}
|
||||
|
||||
let tcx = self.tcx();
|
||||
if tcx.features().trait_upcasting() {
|
||||
return None;
|
||||
}
|
||||
|
||||
// <ty as Deref>
|
||||
let trait_ref = ty::TraitRef::new(tcx, tcx.lang_items().deref_trait()?, [ty]);
|
||||
|
||||
let obligation =
|
||||
traits::Obligation::new(tcx, cause.clone(), param_env, ty::Binder::dummy(trait_ref));
|
||||
if !self.infcx.predicate_may_hold(&obligation) {
|
||||
return None;
|
||||
}
|
||||
|
||||
self.infcx.probe(|_| {
|
||||
let ty = traits::normalize_projection_ty(
|
||||
self,
|
||||
param_env,
|
||||
ty::AliasTy::new_from_args(tcx, tcx.lang_items().deref_target()?, trait_ref.args),
|
||||
cause.clone(),
|
||||
0,
|
||||
// We're *intentionally* throwing these away,
|
||||
// since we don't actually use them.
|
||||
&mut PredicateObligations::new(),
|
||||
)
|
||||
.as_type()
|
||||
.unwrap();
|
||||
|
||||
if let ty::Dynamic(data, ..) = ty.kind() { data.principal() } else { None }
|
||||
})
|
||||
}
|
||||
|
||||
/// Searches for unsizing that might apply to `obligation`.
|
||||
fn assemble_candidates_for_unsizing(
|
||||
&mut self,
|
||||
|
@ -1019,15 +967,6 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
|
|||
let principal_a = a_data.principal().unwrap();
|
||||
let target_trait_did = principal_def_id_b.unwrap();
|
||||
let source_trait_ref = principal_a.with_self_ty(self.tcx(), source);
|
||||
if let Some(deref_trait_ref) = self.need_migrate_deref_output_trait_object(
|
||||
source,
|
||||
obligation.param_env,
|
||||
&obligation.cause,
|
||||
) {
|
||||
if deref_trait_ref.def_id() == target_trait_did {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
for (idx, upcast_trait_ref) in
|
||||
util::supertraits(self.tcx(), source_trait_ref).enumerate()
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue