Rollup merge of #89001 - jackh726:binder-cleanup, r=nikomatsakis
Be explicit about using Binder::dummy This is somewhat of a late followup to the binder refactor PR. It removes `ToPredicate` and `ToPolyTraitImpls` that hide the use of `Binder::dummy`. While this does make code a bit more verbose, it allows us be more careful about where we create binders. Another alternative here might be to add a new trait `ToBinder` or something with a `dummy()` fn. Which could still allow grepping but allows doing something like `trait_ref.dummy()` (but I also wonder if longer-term, it would be better to be even more explicit with a `bind_with_vars(ty::List::empty())` *but* that's not clear yet. r? ``@nikomatsakis``
This commit is contained in:
commit
ee2e97c416
34 changed files with 127 additions and 121 deletions
|
@ -89,10 +89,10 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> {
|
||||||
category: ConstraintCategory,
|
category: ConstraintCategory,
|
||||||
) {
|
) {
|
||||||
self.prove_predicates(
|
self.prove_predicates(
|
||||||
Some(ty::PredicateKind::Trait(ty::TraitPredicate {
|
Some(ty::Binder::dummy(ty::PredicateKind::Trait(ty::TraitPredicate {
|
||||||
trait_ref,
|
trait_ref,
|
||||||
constness: ty::BoundConstness::NotConst,
|
constness: ty::BoundConstness::NotConst,
|
||||||
})),
|
}))),
|
||||||
locations,
|
locations,
|
||||||
category,
|
category,
|
||||||
);
|
);
|
||||||
|
|
|
@ -1080,7 +1080,8 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> {
|
||||||
}
|
}
|
||||||
|
|
||||||
self.prove_predicate(
|
self.prove_predicate(
|
||||||
ty::PredicateKind::WellFormed(inferred_ty.into()).to_predicate(self.tcx()),
|
ty::Binder::dummy(ty::PredicateKind::WellFormed(inferred_ty.into()))
|
||||||
|
.to_predicate(self.tcx()),
|
||||||
Locations::All(span),
|
Locations::All(span),
|
||||||
ConstraintCategory::TypeAnnotation,
|
ConstraintCategory::TypeAnnotation,
|
||||||
);
|
);
|
||||||
|
@ -1316,7 +1317,8 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> {
|
||||||
obligations.obligations.push(traits::Obligation::new(
|
obligations.obligations.push(traits::Obligation::new(
|
||||||
ObligationCause::dummy(),
|
ObligationCause::dummy(),
|
||||||
param_env,
|
param_env,
|
||||||
ty::PredicateKind::WellFormed(revealed_ty.into()).to_predicate(infcx.tcx),
|
ty::Binder::dummy(ty::PredicateKind::WellFormed(revealed_ty.into()))
|
||||||
|
.to_predicate(infcx.tcx),
|
||||||
));
|
));
|
||||||
obligations.add(
|
obligations.add(
|
||||||
infcx
|
infcx
|
||||||
|
@ -1599,7 +1601,9 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> {
|
||||||
self.check_call_dest(body, term, &sig, destination, term_location);
|
self.check_call_dest(body, term, &sig, destination, term_location);
|
||||||
|
|
||||||
self.prove_predicates(
|
self.prove_predicates(
|
||||||
sig.inputs_and_output.iter().map(|ty| ty::PredicateKind::WellFormed(ty.into())),
|
sig.inputs_and_output
|
||||||
|
.iter()
|
||||||
|
.map(|ty| ty::Binder::dummy(ty::PredicateKind::WellFormed(ty.into()))),
|
||||||
term_location.to_locations(),
|
term_location.to_locations(),
|
||||||
ConstraintCategory::Boring,
|
ConstraintCategory::Boring,
|
||||||
);
|
);
|
||||||
|
|
|
@ -669,8 +669,10 @@ impl<'tcx> TypeRelatingDelegate<'tcx> for QueryTypeRelatingDelegate<'_, 'tcx> {
|
||||||
self.obligations.push(Obligation {
|
self.obligations.push(Obligation {
|
||||||
cause: self.cause.clone(),
|
cause: self.cause.clone(),
|
||||||
param_env: self.param_env,
|
param_env: self.param_env,
|
||||||
predicate: ty::PredicateKind::RegionOutlives(ty::OutlivesPredicate(sup, sub))
|
predicate: ty::Binder::dummy(ty::PredicateKind::RegionOutlives(ty::OutlivesPredicate(
|
||||||
.to_predicate(self.infcx.tcx),
|
sup, sub,
|
||||||
|
)))
|
||||||
|
.to_predicate(self.infcx.tcx),
|
||||||
recursion_depth: 0,
|
recursion_depth: 0,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
@ -360,7 +360,8 @@ impl<'infcx, 'tcx> CombineFields<'infcx, 'tcx> {
|
||||||
self.obligations.push(Obligation::new(
|
self.obligations.push(Obligation::new(
|
||||||
self.trace.cause.clone(),
|
self.trace.cause.clone(),
|
||||||
self.param_env,
|
self.param_env,
|
||||||
ty::PredicateKind::WellFormed(b_ty.into()).to_predicate(self.infcx.tcx),
|
ty::Binder::dummy(ty::PredicateKind::WellFormed(b_ty.into()))
|
||||||
|
.to_predicate(self.infcx.tcx),
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -463,7 +464,7 @@ impl<'infcx, 'tcx> CombineFields<'infcx, 'tcx> {
|
||||||
self.obligations.push(Obligation::new(
|
self.obligations.push(Obligation::new(
|
||||||
self.trace.cause.clone(),
|
self.trace.cause.clone(),
|
||||||
self.param_env,
|
self.param_env,
|
||||||
predicate.to_predicate(self.tcx()),
|
ty::Binder::dummy(predicate).to_predicate(self.tcx()),
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -97,11 +97,11 @@ impl TypeRelation<'tcx> for Sub<'combine, 'infcx, 'tcx> {
|
||||||
self.fields.obligations.push(Obligation::new(
|
self.fields.obligations.push(Obligation::new(
|
||||||
self.fields.trace.cause.clone(),
|
self.fields.trace.cause.clone(),
|
||||||
self.fields.param_env,
|
self.fields.param_env,
|
||||||
ty::PredicateKind::Subtype(ty::SubtypePredicate {
|
ty::Binder::dummy(ty::PredicateKind::Subtype(ty::SubtypePredicate {
|
||||||
a_is_expected: self.a_is_expected,
|
a_is_expected: self.a_is_expected,
|
||||||
a,
|
a,
|
||||||
b,
|
b,
|
||||||
})
|
}))
|
||||||
.to_predicate(self.tcx()),
|
.to_predicate(self.tcx()),
|
||||||
));
|
));
|
||||||
|
|
||||||
|
|
|
@ -35,7 +35,7 @@ pub trait TraitEngine<'tcx>: 'tcx {
|
||||||
cause,
|
cause,
|
||||||
recursion_depth: 0,
|
recursion_depth: 0,
|
||||||
param_env,
|
param_env,
|
||||||
predicate: trait_ref.without_const().to_predicate(infcx.tcx),
|
predicate: ty::Binder::dummy(trait_ref).without_const().to_predicate(infcx.tcx),
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
@ -231,6 +231,7 @@ impl Elaborator<'tcx> {
|
||||||
None
|
None
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
.map(ty::Binder::dummy)
|
||||||
.map(|predicate_kind| predicate_kind.to_predicate(tcx))
|
.map(|predicate_kind| predicate_kind.to_predicate(tcx))
|
||||||
.filter(|&predicate| visited.insert(predicate))
|
.filter(|&predicate| visited.insert(predicate))
|
||||||
.map(|predicate| {
|
.map(|predicate| {
|
||||||
|
|
|
@ -769,12 +769,6 @@ pub trait ToPolyTraitRef<'tcx> {
|
||||||
fn to_poly_trait_ref(&self) -> PolyTraitRef<'tcx>;
|
fn to_poly_trait_ref(&self) -> PolyTraitRef<'tcx>;
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'tcx> ToPolyTraitRef<'tcx> for TraitRef<'tcx> {
|
|
||||||
fn to_poly_trait_ref(&self) -> PolyTraitRef<'tcx> {
|
|
||||||
ty::Binder::dummy(*self)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<'tcx> ToPolyTraitRef<'tcx> for PolyTraitPredicate<'tcx> {
|
impl<'tcx> ToPolyTraitRef<'tcx> for PolyTraitPredicate<'tcx> {
|
||||||
fn to_poly_trait_ref(&self) -> PolyTraitRef<'tcx> {
|
fn to_poly_trait_ref(&self) -> PolyTraitRef<'tcx> {
|
||||||
self.map_bound_ref(|trait_pred| trait_pred.trait_ref)
|
self.map_bound_ref(|trait_pred| trait_pred.trait_ref)
|
||||||
|
@ -792,23 +786,6 @@ impl ToPredicate<'tcx> for Binder<'tcx, PredicateKind<'tcx>> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl ToPredicate<'tcx> for PredicateKind<'tcx> {
|
|
||||||
#[inline(always)]
|
|
||||||
fn to_predicate(self, tcx: TyCtxt<'tcx>) -> Predicate<'tcx> {
|
|
||||||
tcx.mk_predicate(Binder::dummy(self))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<'tcx> ToPredicate<'tcx> for ConstnessAnd<TraitRef<'tcx>> {
|
|
||||||
fn to_predicate(self, tcx: TyCtxt<'tcx>) -> Predicate<'tcx> {
|
|
||||||
PredicateKind::Trait(ty::TraitPredicate {
|
|
||||||
trait_ref: self.value,
|
|
||||||
constness: self.constness,
|
|
||||||
})
|
|
||||||
.to_predicate(tcx)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<'tcx> ToPredicate<'tcx> for ConstnessAnd<PolyTraitRef<'tcx>> {
|
impl<'tcx> ToPredicate<'tcx> for ConstnessAnd<PolyTraitRef<'tcx>> {
|
||||||
fn to_predicate(self, tcx: TyCtxt<'tcx>) -> Predicate<'tcx> {
|
fn to_predicate(self, tcx: TyCtxt<'tcx>) -> Predicate<'tcx> {
|
||||||
self.value
|
self.value
|
||||||
|
|
|
@ -844,8 +844,11 @@ impl<'tcx> TraitRef<'tcx> {
|
||||||
|
|
||||||
/// Returns a `TraitRef` of the form `P0: Foo<P1..Pn>` where `Pi`
|
/// Returns a `TraitRef` of the form `P0: Foo<P1..Pn>` where `Pi`
|
||||||
/// are the parameters defined on trait.
|
/// are the parameters defined on trait.
|
||||||
pub fn identity(tcx: TyCtxt<'tcx>, def_id: DefId) -> TraitRef<'tcx> {
|
pub fn identity(tcx: TyCtxt<'tcx>, def_id: DefId) -> Binder<'tcx, TraitRef<'tcx>> {
|
||||||
TraitRef { def_id, substs: InternalSubsts::identity_for_item(tcx, def_id) }
|
ty::Binder::dummy(TraitRef {
|
||||||
|
def_id,
|
||||||
|
substs: InternalSubsts::identity_for_item(tcx, def_id),
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
|
|
|
@ -135,7 +135,7 @@ impl<'a, 'tcx> Autoderef<'a, 'tcx> {
|
||||||
let obligation = traits::Obligation::new(
|
let obligation = traits::Obligation::new(
|
||||||
cause.clone(),
|
cause.clone(),
|
||||||
self.param_env,
|
self.param_env,
|
||||||
trait_ref.without_const().to_predicate(tcx),
|
ty::Binder::dummy(trait_ref).without_const().to_predicate(tcx),
|
||||||
);
|
);
|
||||||
if !self.infcx.predicate_may_hold(&obligation) {
|
if !self.infcx.predicate_may_hold(&obligation) {
|
||||||
debug!("overloaded_deref_ty: cannot match obligation");
|
debug!("overloaded_deref_ty: cannot match obligation");
|
||||||
|
|
|
@ -120,7 +120,7 @@ impl<'cx, 'tcx> InferCtxtExt<'tcx> for InferCtxt<'cx, 'tcx> {
|
||||||
cause: traits::ObligationCause::dummy(),
|
cause: traits::ObligationCause::dummy(),
|
||||||
param_env,
|
param_env,
|
||||||
recursion_depth: 0,
|
recursion_depth: 0,
|
||||||
predicate: trait_ref.without_const().to_predicate(self.tcx),
|
predicate: ty::Binder::dummy(trait_ref).without_const().to_predicate(self.tcx),
|
||||||
};
|
};
|
||||||
self.evaluate_obligation(&obligation).unwrap_or(traits::EvaluationResult::EvaluatedToErr)
|
self.evaluate_obligation(&obligation).unwrap_or(traits::EvaluationResult::EvaluatedToErr)
|
||||||
}
|
}
|
||||||
|
|
|
@ -726,7 +726,7 @@ impl<'a, 'tcx> InferCtxtExt<'tcx> for InferCtxt<'a, 'tcx> {
|
||||||
let new_obligation = Obligation::new(
|
let new_obligation = Obligation::new(
|
||||||
ObligationCause::dummy(),
|
ObligationCause::dummy(),
|
||||||
param_env,
|
param_env,
|
||||||
new_trait_ref.without_const().to_predicate(self.tcx),
|
ty::Binder::dummy(new_trait_ref).without_const().to_predicate(self.tcx),
|
||||||
);
|
);
|
||||||
|
|
||||||
if self.predicate_must_hold_modulo_regions(&new_obligation) {
|
if self.predicate_must_hold_modulo_regions(&new_obligation) {
|
||||||
|
|
|
@ -418,7 +418,8 @@ impl<'a, 'b, 'tcx> FulfillProcessor<'a, 'b, 'tcx> {
|
||||||
| ty::PredicateKind::Coerce(_)
|
| ty::PredicateKind::Coerce(_)
|
||||||
| ty::PredicateKind::ConstEvaluatable(..)
|
| ty::PredicateKind::ConstEvaluatable(..)
|
||||||
| ty::PredicateKind::ConstEquate(..) => {
|
| ty::PredicateKind::ConstEquate(..) => {
|
||||||
let pred = infcx.replace_bound_vars_with_placeholders(binder);
|
let pred =
|
||||||
|
ty::Binder::dummy(infcx.replace_bound_vars_with_placeholders(binder));
|
||||||
ProcessResult::Changed(mk_pending(vec![
|
ProcessResult::Changed(mk_pending(vec![
|
||||||
obligation.with(pred.to_predicate(self.selcx.tcx())),
|
obligation.with(pred.to_predicate(self.selcx.tcx())),
|
||||||
]))
|
]))
|
||||||
|
|
|
@ -140,7 +140,8 @@ pub fn type_known_to_meet_bound_modulo_regions<'a, 'tcx>(
|
||||||
infcx.tcx.def_path_str(def_id)
|
infcx.tcx.def_path_str(def_id)
|
||||||
);
|
);
|
||||||
|
|
||||||
let trait_ref = ty::TraitRef { def_id, substs: infcx.tcx.mk_substs_trait(ty, &[]) };
|
let trait_ref =
|
||||||
|
ty::Binder::dummy(ty::TraitRef { def_id, substs: infcx.tcx.mk_substs_trait(ty, &[]) });
|
||||||
let obligation = Obligation {
|
let obligation = Obligation {
|
||||||
param_env,
|
param_env,
|
||||||
cause: ObligationCause::misc(span, hir::CRATE_HIR_ID),
|
cause: ObligationCause::misc(span, hir::CRATE_HIR_ID),
|
||||||
|
|
|
@ -250,7 +250,7 @@ fn predicates_reference_self(
|
||||||
trait_def_id: DefId,
|
trait_def_id: DefId,
|
||||||
supertraits_only: bool,
|
supertraits_only: bool,
|
||||||
) -> SmallVec<[Span; 1]> {
|
) -> SmallVec<[Span; 1]> {
|
||||||
let trait_ref = ty::Binder::dummy(ty::TraitRef::identity(tcx, trait_def_id));
|
let trait_ref = ty::TraitRef::identity(tcx, trait_def_id);
|
||||||
let predicates = if supertraits_only {
|
let predicates = if supertraits_only {
|
||||||
tcx.super_predicates_of(trait_def_id)
|
tcx.super_predicates_of(trait_def_id)
|
||||||
} else {
|
} else {
|
||||||
|
@ -554,11 +554,11 @@ fn object_ty_for_trait<'tcx>(
|
||||||
|
|
||||||
let trait_ref = ty::TraitRef::identity(tcx, trait_def_id);
|
let trait_ref = ty::TraitRef::identity(tcx, trait_def_id);
|
||||||
|
|
||||||
let trait_predicate = ty::Binder::dummy(ty::ExistentialPredicate::Trait(
|
let trait_predicate = trait_ref.map_bound(|trait_ref| {
|
||||||
ty::ExistentialTraitRef::erase_self_ty(tcx, trait_ref),
|
ty::ExistentialPredicate::Trait(ty::ExistentialTraitRef::erase_self_ty(tcx, trait_ref))
|
||||||
));
|
});
|
||||||
|
|
||||||
let mut associated_types = traits::supertraits(tcx, ty::Binder::dummy(trait_ref))
|
let mut associated_types = traits::supertraits(tcx, trait_ref)
|
||||||
.flat_map(|super_trait_ref| {
|
.flat_map(|super_trait_ref| {
|
||||||
tcx.associated_items(super_trait_ref.def_id())
|
tcx.associated_items(super_trait_ref.def_id())
|
||||||
.in_definition_order()
|
.in_definition_order()
|
||||||
|
@ -671,10 +671,10 @@ fn receiver_is_dispatchable<'tcx>(
|
||||||
let param_env = tcx.param_env(method.def_id);
|
let param_env = tcx.param_env(method.def_id);
|
||||||
|
|
||||||
// Self: Unsize<U>
|
// Self: Unsize<U>
|
||||||
let unsize_predicate = ty::TraitRef {
|
let unsize_predicate = ty::Binder::dummy(ty::TraitRef {
|
||||||
def_id: unsize_did,
|
def_id: unsize_did,
|
||||||
substs: tcx.mk_substs_trait(tcx.types.self_param, &[unsized_self_ty.into()]),
|
substs: tcx.mk_substs_trait(tcx.types.self_param, &[unsized_self_ty.into()]),
|
||||||
}
|
})
|
||||||
.without_const()
|
.without_const()
|
||||||
.to_predicate(tcx);
|
.to_predicate(tcx);
|
||||||
|
|
||||||
|
@ -689,7 +689,9 @@ fn receiver_is_dispatchable<'tcx>(
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
ty::TraitRef { def_id: unsize_did, substs }.without_const().to_predicate(tcx)
|
ty::Binder::dummy(ty::TraitRef { def_id: unsize_did, substs })
|
||||||
|
.without_const()
|
||||||
|
.to_predicate(tcx)
|
||||||
};
|
};
|
||||||
|
|
||||||
let caller_bounds: Vec<Predicate<'tcx>> = param_env
|
let caller_bounds: Vec<Predicate<'tcx>> = param_env
|
||||||
|
@ -703,10 +705,10 @@ fn receiver_is_dispatchable<'tcx>(
|
||||||
|
|
||||||
// Receiver: DispatchFromDyn<Receiver[Self => U]>
|
// Receiver: DispatchFromDyn<Receiver[Self => U]>
|
||||||
let obligation = {
|
let obligation = {
|
||||||
let predicate = ty::TraitRef {
|
let predicate = ty::Binder::dummy(ty::TraitRef {
|
||||||
def_id: dispatch_from_dyn_did,
|
def_id: dispatch_from_dyn_did,
|
||||||
substs: tcx.mk_substs_trait(receiver_ty, &[unsized_receiver_ty.into()]),
|
substs: tcx.mk_substs_trait(receiver_ty, &[unsized_receiver_ty.into()]),
|
||||||
}
|
})
|
||||||
.without_const()
|
.without_const()
|
||||||
.to_predicate(tcx);
|
.to_predicate(tcx);
|
||||||
|
|
||||||
|
@ -789,8 +791,7 @@ fn contains_illegal_self_type_reference<'tcx, T: TypeFoldable<'tcx>>(
|
||||||
|
|
||||||
// Compute supertraits of current trait lazily.
|
// Compute supertraits of current trait lazily.
|
||||||
if self.supertraits.is_none() {
|
if self.supertraits.is_none() {
|
||||||
let trait_ref =
|
let trait_ref = ty::TraitRef::identity(self.tcx, self.trait_def_id);
|
||||||
ty::Binder::dummy(ty::TraitRef::identity(self.tcx, self.trait_def_id));
|
|
||||||
self.supertraits = Some(
|
self.supertraits = Some(
|
||||||
traits::supertraits(self.tcx, trait_ref).map(|t| t.def_id()).collect(),
|
traits::supertraits(self.tcx, trait_ref).map(|t| t.def_id()).collect(),
|
||||||
);
|
);
|
||||||
|
|
|
@ -27,7 +27,7 @@ use rustc_hir::lang_items::LangItem;
|
||||||
use rustc_infer::infer::resolve::OpportunisticRegionResolver;
|
use rustc_infer::infer::resolve::OpportunisticRegionResolver;
|
||||||
use rustc_middle::ty::fold::{TypeFoldable, TypeFolder};
|
use rustc_middle::ty::fold::{TypeFoldable, TypeFolder};
|
||||||
use rustc_middle::ty::subst::Subst;
|
use rustc_middle::ty::subst::Subst;
|
||||||
use rustc_middle::ty::{self, ToPolyTraitRef, ToPredicate, Ty, TyCtxt, WithConstness};
|
use rustc_middle::ty::{self, ToPredicate, Ty, TyCtxt, WithConstness};
|
||||||
use rustc_span::symbol::sym;
|
use rustc_span::symbol::sym;
|
||||||
|
|
||||||
use std::collections::BTreeMap;
|
use std::collections::BTreeMap;
|
||||||
|
@ -1028,7 +1028,7 @@ fn normalize_to_error<'a, 'tcx>(
|
||||||
cause: ObligationCause<'tcx>,
|
cause: ObligationCause<'tcx>,
|
||||||
depth: usize,
|
depth: usize,
|
||||||
) -> NormalizedTy<'tcx> {
|
) -> NormalizedTy<'tcx> {
|
||||||
let trait_ref = projection_ty.trait_ref(selcx.tcx()).to_poly_trait_ref();
|
let trait_ref = ty::Binder::dummy(projection_ty.trait_ref(selcx.tcx()));
|
||||||
let trait_obligation = Obligation {
|
let trait_obligation = Obligation {
|
||||||
cause,
|
cause,
|
||||||
recursion_depth: depth,
|
recursion_depth: depth,
|
||||||
|
@ -1290,7 +1290,7 @@ fn assemble_candidates_from_impls<'cx, 'tcx>(
|
||||||
|
|
||||||
// If we are resolving `<T as TraitRef<...>>::Item == Type`,
|
// If we are resolving `<T as TraitRef<...>>::Item == Type`,
|
||||||
// start out by selecting the predicate `T as TraitRef<...>`:
|
// start out by selecting the predicate `T as TraitRef<...>`:
|
||||||
let poly_trait_ref = obligation.predicate.trait_ref(selcx.tcx()).to_poly_trait_ref();
|
let poly_trait_ref = ty::Binder::dummy(obligation.predicate.trait_ref(selcx.tcx()));
|
||||||
let trait_obligation = obligation.with(poly_trait_ref.to_poly_trait_predicate());
|
let trait_obligation = obligation.with(poly_trait_ref.to_poly_trait_predicate());
|
||||||
let _ = selcx.infcx().commit_if_ok(|_| {
|
let _ = selcx.infcx().commit_if_ok(|_| {
|
||||||
let impl_source = match selcx.select(&trait_obligation) {
|
let impl_source = match selcx.select(&trait_obligation) {
|
||||||
|
|
|
@ -141,6 +141,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
|
||||||
let placeholder_trait_predicate =
|
let placeholder_trait_predicate =
|
||||||
self.infcx().replace_bound_vars_with_placeholders(trait_predicate);
|
self.infcx().replace_bound_vars_with_placeholders(trait_predicate);
|
||||||
let placeholder_self_ty = placeholder_trait_predicate.self_ty();
|
let placeholder_self_ty = placeholder_trait_predicate.self_ty();
|
||||||
|
let placeholder_trait_predicate = ty::Binder::dummy(placeholder_trait_predicate);
|
||||||
let (def_id, substs) = match *placeholder_self_ty.kind() {
|
let (def_id, substs) = match *placeholder_self_ty.kind() {
|
||||||
ty::Projection(proj) => (proj.item_def_id, proj.substs),
|
ty::Projection(proj) => (proj.item_def_id, proj.substs),
|
||||||
ty::Opaque(def_id, substs) => (def_id, substs),
|
ty::Opaque(def_id, substs) => (def_id, substs),
|
||||||
|
@ -164,7 +165,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
|
||||||
obligations.extend(self.infcx.commit_if_ok(|_| {
|
obligations.extend(self.infcx.commit_if_ok(|_| {
|
||||||
self.infcx
|
self.infcx
|
||||||
.at(&obligation.cause, obligation.param_env)
|
.at(&obligation.cause, obligation.param_env)
|
||||||
.sup(placeholder_trait_predicate.trait_ref.to_poly_trait_ref(), candidate.value)
|
.sup(placeholder_trait_predicate.to_poly_trait_ref(), candidate.value)
|
||||||
.map(|InferOk { obligations, .. }| obligations)
|
.map(|InferOk { obligations, .. }| obligations)
|
||||||
.map_err(|_| Unimplemented)
|
.map_err(|_| Unimplemented)
|
||||||
})?);
|
})?);
|
||||||
|
@ -646,7 +647,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
|
||||||
obligations.push(Obligation::new(
|
obligations.push(Obligation::new(
|
||||||
obligation.cause.clone(),
|
obligation.cause.clone(),
|
||||||
obligation.param_env,
|
obligation.param_env,
|
||||||
ty::PredicateKind::ClosureKind(closure_def_id, substs, kind)
|
ty::Binder::dummy(ty::PredicateKind::ClosureKind(closure_def_id, substs, kind))
|
||||||
.to_predicate(self.tcx()),
|
.to_predicate(self.tcx()),
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
@ -898,10 +899,10 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
|
||||||
);
|
);
|
||||||
|
|
||||||
// We can only make objects from sized types.
|
// We can only make objects from sized types.
|
||||||
let tr = ty::TraitRef::new(
|
let tr = ty::Binder::dummy(ty::TraitRef::new(
|
||||||
tcx.require_lang_item(LangItem::Sized, None),
|
tcx.require_lang_item(LangItem::Sized, None),
|
||||||
tcx.mk_substs_trait(source, &[]),
|
tcx.mk_substs_trait(source, &[]),
|
||||||
);
|
));
|
||||||
nested.push(predicate_to_obligation(tr.without_const().to_predicate(tcx)));
|
nested.push(predicate_to_obligation(tr.without_const().to_predicate(tcx)));
|
||||||
|
|
||||||
// If the type is `Foo + 'a`, ensure that the type
|
// If the type is `Foo + 'a`, ensure that the type
|
||||||
|
|
|
@ -248,7 +248,7 @@ pub fn predicate_for_trait_ref<'tcx>(
|
||||||
cause,
|
cause,
|
||||||
param_env,
|
param_env,
|
||||||
recursion_depth,
|
recursion_depth,
|
||||||
predicate: trait_ref.without_const().to_predicate(tcx),
|
predicate: ty::Binder::dummy(trait_ref).without_const().to_predicate(tcx),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -349,7 +349,7 @@ impl<'a, 'tcx> WfPredicates<'a, 'tcx> {
|
||||||
new_cause,
|
new_cause,
|
||||||
depth,
|
depth,
|
||||||
param_env,
|
param_env,
|
||||||
ty::PredicateKind::WellFormed(arg).to_predicate(tcx),
|
ty::Binder::dummy(ty::PredicateKind::WellFormed(arg)).to_predicate(tcx),
|
||||||
)
|
)
|
||||||
}),
|
}),
|
||||||
);
|
);
|
||||||
|
@ -399,7 +399,7 @@ impl<'a, 'tcx> WfPredicates<'a, 'tcx> {
|
||||||
cause.clone(),
|
cause.clone(),
|
||||||
depth,
|
depth,
|
||||||
param_env,
|
param_env,
|
||||||
ty::PredicateKind::WellFormed(arg).to_predicate(tcx),
|
ty::Binder::dummy(ty::PredicateKind::WellFormed(arg)).to_predicate(tcx),
|
||||||
)
|
)
|
||||||
}),
|
}),
|
||||||
);
|
);
|
||||||
|
@ -416,7 +416,7 @@ impl<'a, 'tcx> WfPredicates<'a, 'tcx> {
|
||||||
cause,
|
cause,
|
||||||
self.recursion_depth,
|
self.recursion_depth,
|
||||||
self.param_env,
|
self.param_env,
|
||||||
trait_ref.without_const().to_predicate(self.infcx.tcx),
|
ty::Binder::dummy(trait_ref).without_const().to_predicate(self.infcx.tcx),
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -443,9 +443,9 @@ impl<'a, 'tcx> WfPredicates<'a, 'tcx> {
|
||||||
let obligations = self.nominal_obligations(uv.def.did, substs);
|
let obligations = self.nominal_obligations(uv.def.did, substs);
|
||||||
self.out.extend(obligations);
|
self.out.extend(obligations);
|
||||||
|
|
||||||
let predicate = ty::PredicateKind::ConstEvaluatable(
|
let predicate = ty::Binder::dummy(ty::PredicateKind::ConstEvaluatable(
|
||||||
ty::Unevaluated::new(uv.def, substs),
|
ty::Unevaluated::new(uv.def, substs),
|
||||||
)
|
))
|
||||||
.to_predicate(self.tcx());
|
.to_predicate(self.tcx());
|
||||||
let cause = self.cause(traits::MiscObligation);
|
let cause = self.cause(traits::MiscObligation);
|
||||||
self.out.push(traits::Obligation::with_depth(
|
self.out.push(traits::Obligation::with_depth(
|
||||||
|
@ -469,8 +469,10 @@ impl<'a, 'tcx> WfPredicates<'a, 'tcx> {
|
||||||
cause,
|
cause,
|
||||||
self.recursion_depth,
|
self.recursion_depth,
|
||||||
self.param_env,
|
self.param_env,
|
||||||
ty::PredicateKind::WellFormed(resolved_constant.into())
|
ty::Binder::dummy(ty::PredicateKind::WellFormed(
|
||||||
.to_predicate(self.tcx()),
|
resolved_constant.into(),
|
||||||
|
))
|
||||||
|
.to_predicate(self.tcx()),
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -556,8 +558,10 @@ impl<'a, 'tcx> WfPredicates<'a, 'tcx> {
|
||||||
cause,
|
cause,
|
||||||
depth,
|
depth,
|
||||||
param_env,
|
param_env,
|
||||||
ty::PredicateKind::TypeOutlives(ty::OutlivesPredicate(rty, r))
|
ty::Binder::dummy(ty::PredicateKind::TypeOutlives(
|
||||||
.to_predicate(self.tcx()),
|
ty::OutlivesPredicate(rty, r),
|
||||||
|
))
|
||||||
|
.to_predicate(self.tcx()),
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -646,7 +650,8 @@ impl<'a, 'tcx> WfPredicates<'a, 'tcx> {
|
||||||
cause.clone(),
|
cause.clone(),
|
||||||
depth,
|
depth,
|
||||||
param_env,
|
param_env,
|
||||||
ty::PredicateKind::ObjectSafe(did).to_predicate(tcx),
|
ty::Binder::dummy(ty::PredicateKind::ObjectSafe(did))
|
||||||
|
.to_predicate(tcx),
|
||||||
)
|
)
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
@ -673,7 +678,8 @@ impl<'a, 'tcx> WfPredicates<'a, 'tcx> {
|
||||||
cause,
|
cause,
|
||||||
self.recursion_depth,
|
self.recursion_depth,
|
||||||
param_env,
|
param_env,
|
||||||
ty::PredicateKind::WellFormed(ty.into()).to_predicate(self.tcx()),
|
ty::Binder::dummy(ty::PredicateKind::WellFormed(ty.into()))
|
||||||
|
.to_predicate(self.tcx()),
|
||||||
));
|
));
|
||||||
} else {
|
} else {
|
||||||
// Yes, resolved, proceed with the result.
|
// Yes, resolved, proceed with the result.
|
||||||
|
|
|
@ -156,7 +156,8 @@ impl AscribeUserTypeCx<'me, 'tcx> {
|
||||||
self.relate(self_ty, Variance::Invariant, impl_self_ty)?;
|
self.relate(self_ty, Variance::Invariant, impl_self_ty)?;
|
||||||
|
|
||||||
self.prove_predicate(
|
self.prove_predicate(
|
||||||
ty::PredicateKind::WellFormed(impl_self_ty.into()).to_predicate(self.tcx()),
|
ty::Binder::dummy(ty::PredicateKind::WellFormed(impl_self_ty.into()))
|
||||||
|
.to_predicate(self.tcx()),
|
||||||
span,
|
span,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -173,7 +174,7 @@ impl AscribeUserTypeCx<'me, 'tcx> {
|
||||||
// type were ill-formed but did not appear in `ty`,
|
// type were ill-formed but did not appear in `ty`,
|
||||||
// which...could happen with normalization...
|
// which...could happen with normalization...
|
||||||
self.prove_predicate(
|
self.prove_predicate(
|
||||||
ty::PredicateKind::WellFormed(ty.into()).to_predicate(self.tcx()),
|
ty::Binder::dummy(ty::PredicateKind::WellFormed(ty.into())).to_predicate(self.tcx()),
|
||||||
span,
|
span,
|
||||||
);
|
);
|
||||||
Ok(())
|
Ok(())
|
||||||
|
|
|
@ -524,13 +524,14 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||||
for o in obligations {
|
for o in obligations {
|
||||||
match o.predicate.kind().skip_binder() {
|
match o.predicate.kind().skip_binder() {
|
||||||
ty::PredicateKind::Trait(t) => {
|
ty::PredicateKind::Trait(t) => {
|
||||||
let pred = ty::PredicateKind::Trait(ty::TraitPredicate {
|
let pred =
|
||||||
trait_ref: ty::TraitRef {
|
ty::Binder::dummy(ty::PredicateKind::Trait(ty::TraitPredicate {
|
||||||
def_id: t.def_id(),
|
trait_ref: ty::TraitRef {
|
||||||
substs: self.infcx.tcx.mk_substs_trait(outer_ty, &[]),
|
def_id: t.def_id(),
|
||||||
},
|
substs: self.infcx.tcx.mk_substs_trait(outer_ty, &[]),
|
||||||
constness: t.constness,
|
},
|
||||||
});
|
constness: t.constness,
|
||||||
|
}));
|
||||||
let obl = Obligation::new(
|
let obl = Obligation::new(
|
||||||
o.cause.clone(),
|
o.cause.clone(),
|
||||||
self.param_env,
|
self.param_env,
|
||||||
|
|
|
@ -256,10 +256,10 @@ impl<'f, 'tcx> Coerce<'f, 'tcx> {
|
||||||
obligations.push(Obligation::new(
|
obligations.push(Obligation::new(
|
||||||
self.cause.clone(),
|
self.cause.clone(),
|
||||||
self.param_env,
|
self.param_env,
|
||||||
ty::PredicateKind::Coerce(ty::CoercePredicate {
|
ty::Binder::dummy(ty::PredicateKind::Coerce(ty::CoercePredicate {
|
||||||
a: source_ty,
|
a: source_ty,
|
||||||
b: target_ty,
|
b: target_ty,
|
||||||
})
|
}))
|
||||||
.to_predicate(self.tcx()),
|
.to_predicate(self.tcx()),
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
|
@ -585,7 +585,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||||
self.register_predicate(traits::Obligation::new(
|
self.register_predicate(traits::Obligation::new(
|
||||||
cause,
|
cause,
|
||||||
self.param_env,
|
self.param_env,
|
||||||
ty::PredicateKind::WellFormed(arg).to_predicate(self.tcx),
|
ty::Binder::dummy(ty::PredicateKind::WellFormed(arg)).to_predicate(self.tcx),
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -21,7 +21,7 @@ use rustc_infer::infer::{self, InferOk};
|
||||||
use rustc_middle::ty::subst::Subst;
|
use rustc_middle::ty::subst::Subst;
|
||||||
use rustc_middle::ty::subst::{InternalSubsts, SubstsRef};
|
use rustc_middle::ty::subst::{InternalSubsts, SubstsRef};
|
||||||
use rustc_middle::ty::GenericParamDefKind;
|
use rustc_middle::ty::GenericParamDefKind;
|
||||||
use rustc_middle::ty::{self, ToPolyTraitRef, ToPredicate, Ty, TypeFoldable, WithConstness};
|
use rustc_middle::ty::{self, ToPredicate, Ty, TypeFoldable, WithConstness};
|
||||||
use rustc_span::symbol::Ident;
|
use rustc_span::symbol::Ident;
|
||||||
use rustc_span::Span;
|
use rustc_span::Span;
|
||||||
use rustc_trait_selection::traits;
|
use rustc_trait_selection::traits;
|
||||||
|
@ -331,7 +331,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||||
let trait_ref = ty::TraitRef::new(trait_def_id, substs);
|
let trait_ref = ty::TraitRef::new(trait_def_id, substs);
|
||||||
|
|
||||||
// Construct an obligation
|
// Construct an obligation
|
||||||
let poly_trait_ref = trait_ref.to_poly_trait_ref();
|
let poly_trait_ref = ty::Binder::dummy(trait_ref);
|
||||||
let obligation = traits::Obligation::misc(
|
let obligation = traits::Obligation::misc(
|
||||||
span,
|
span,
|
||||||
self.body_id,
|
self.body_id,
|
||||||
|
@ -413,7 +413,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||||
obligations.push(traits::Obligation::new(
|
obligations.push(traits::Obligation::new(
|
||||||
cause,
|
cause,
|
||||||
self.param_env,
|
self.param_env,
|
||||||
ty::PredicateKind::WellFormed(method_ty.into()).to_predicate(tcx),
|
ty::Binder::dummy(ty::PredicateKind::WellFormed(method_ty.into())).to_predicate(tcx),
|
||||||
));
|
));
|
||||||
|
|
||||||
let callee = MethodCallee { def_id, substs: trait_ref.substs, sig: fn_sig };
|
let callee = MethodCallee { def_id, substs: trait_ref.substs, sig: fn_sig };
|
||||||
|
|
|
@ -21,9 +21,7 @@ use rustc_infer::infer::{self, InferOk, TyCtxtInferExt};
|
||||||
use rustc_middle::middle::stability;
|
use rustc_middle::middle::stability;
|
||||||
use rustc_middle::ty::subst::{InternalSubsts, Subst, SubstsRef};
|
use rustc_middle::ty::subst::{InternalSubsts, Subst, SubstsRef};
|
||||||
use rustc_middle::ty::GenericParamDefKind;
|
use rustc_middle::ty::GenericParamDefKind;
|
||||||
use rustc_middle::ty::{
|
use rustc_middle::ty::{self, ParamEnvAnd, ToPredicate, Ty, TyCtxt, TypeFoldable, WithConstness};
|
||||||
self, ParamEnvAnd, ToPolyTraitRef, ToPredicate, Ty, TyCtxt, TypeFoldable, WithConstness,
|
|
||||||
};
|
|
||||||
use rustc_session::lint;
|
use rustc_session::lint;
|
||||||
use rustc_span::def_id::LocalDefId;
|
use rustc_span::def_id::LocalDefId;
|
||||||
use rustc_span::lev_distance::{find_best_match_for_name, lev_distance};
|
use rustc_span::lev_distance::{find_best_match_for_name, lev_distance};
|
||||||
|
@ -967,7 +965,7 @@ impl<'a, 'tcx> ProbeContext<'a, 'tcx> {
|
||||||
|
|
||||||
if self.tcx.is_trait_alias(trait_def_id) {
|
if self.tcx.is_trait_alias(trait_def_id) {
|
||||||
// For trait aliases, assume all super-traits are relevant.
|
// For trait aliases, assume all super-traits are relevant.
|
||||||
let bounds = iter::once(trait_ref.to_poly_trait_ref());
|
let bounds = iter::once(ty::Binder::dummy(trait_ref));
|
||||||
self.elaborate_bounds(bounds, |this, new_trait_ref, item| {
|
self.elaborate_bounds(bounds, |this, new_trait_ref, item| {
|
||||||
let new_trait_ref = this.erase_late_bound_regions(new_trait_ref);
|
let new_trait_ref = this.erase_late_bound_regions(new_trait_ref);
|
||||||
|
|
||||||
|
@ -1372,7 +1370,7 @@ impl<'a, 'tcx> ProbeContext<'a, 'tcx> {
|
||||||
trait_ref: ty::TraitRef<'tcx>,
|
trait_ref: ty::TraitRef<'tcx>,
|
||||||
) -> traits::SelectionResult<'tcx, traits::Selection<'tcx>> {
|
) -> traits::SelectionResult<'tcx, traits::Selection<'tcx>> {
|
||||||
let cause = traits::ObligationCause::misc(self.span, self.body_id);
|
let cause = traits::ObligationCause::misc(self.span, self.body_id);
|
||||||
let predicate = trait_ref.to_poly_trait_ref().to_poly_trait_predicate();
|
let predicate = ty::Binder::dummy(trait_ref).to_poly_trait_predicate();
|
||||||
let obligation = traits::Obligation::new(cause, self.param_env, predicate);
|
let obligation = traits::Obligation::new(cause, self.param_env, predicate);
|
||||||
traits::SelectionContext::new(self).select(&obligation)
|
traits::SelectionContext::new(self).select(&obligation)
|
||||||
}
|
}
|
||||||
|
@ -1470,7 +1468,8 @@ impl<'a, 'tcx> ProbeContext<'a, 'tcx> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
let predicate = trait_ref.without_const().to_predicate(self.tcx);
|
let predicate =
|
||||||
|
ty::Binder::dummy(trait_ref).without_const().to_predicate(self.tcx);
|
||||||
let obligation = traits::Obligation::new(cause, self.param_env, predicate);
|
let obligation = traits::Obligation::new(cause, self.param_env, predicate);
|
||||||
if !self.predicate_may_hold(&obligation) {
|
if !self.predicate_may_hold(&obligation) {
|
||||||
result = ProbeResult::NoMatch;
|
result = ProbeResult::NoMatch;
|
||||||
|
|
|
@ -12,9 +12,7 @@ use rustc_hir::{ExprKind, Node, QPath};
|
||||||
use rustc_infer::infer::type_variable::{TypeVariableOrigin, TypeVariableOriginKind};
|
use rustc_infer::infer::type_variable::{TypeVariableOrigin, TypeVariableOriginKind};
|
||||||
use rustc_middle::ty::fast_reject::simplify_type;
|
use rustc_middle::ty::fast_reject::simplify_type;
|
||||||
use rustc_middle::ty::print::with_crate_prefix;
|
use rustc_middle::ty::print::with_crate_prefix;
|
||||||
use rustc_middle::ty::{
|
use rustc_middle::ty::{self, ToPredicate, Ty, TyCtxt, TypeFoldable, WithConstness};
|
||||||
self, ToPolyTraitRef, ToPredicate, Ty, TyCtxt, TypeFoldable, WithConstness,
|
|
||||||
};
|
|
||||||
use rustc_span::lev_distance;
|
use rustc_span::lev_distance;
|
||||||
use rustc_span::symbol::{kw, sym, Ident};
|
use rustc_span::symbol::{kw, sym, Ident};
|
||||||
use rustc_span::{source_map, FileName, Span};
|
use rustc_span::{source_map, FileName, Span};
|
||||||
|
@ -53,7 +51,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||||
.into()],
|
.into()],
|
||||||
);
|
);
|
||||||
let trait_ref = ty::TraitRef::new(fn_once, fn_once_substs);
|
let trait_ref = ty::TraitRef::new(fn_once, fn_once_substs);
|
||||||
let poly_trait_ref = trait_ref.to_poly_trait_ref();
|
let poly_trait_ref = ty::Binder::dummy(trait_ref);
|
||||||
let obligation = Obligation::misc(
|
let obligation = Obligation::misc(
|
||||||
span,
|
span,
|
||||||
self.body_id,
|
self.body_id,
|
||||||
|
|
|
@ -540,10 +540,10 @@ fn check_type_defn<'tcx, F>(
|
||||||
fcx.register_predicate(traits::Obligation::new(
|
fcx.register_predicate(traits::Obligation::new(
|
||||||
cause,
|
cause,
|
||||||
fcx.param_env,
|
fcx.param_env,
|
||||||
ty::PredicateKind::ConstEvaluatable(ty::Unevaluated::new(
|
ty::Binder::dummy(ty::PredicateKind::ConstEvaluatable(ty::Unevaluated::new(
|
||||||
ty::WithOptConstParam::unknown(discr_def_id.to_def_id()),
|
ty::WithOptConstParam::unknown(discr_def_id.to_def_id()),
|
||||||
discr_substs,
|
discr_substs,
|
||||||
))
|
)))
|
||||||
.to_predicate(tcx),
|
.to_predicate(tcx),
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
@ -1151,10 +1151,10 @@ fn receiver_is_implemented(
|
||||||
cause: ObligationCause<'tcx>,
|
cause: ObligationCause<'tcx>,
|
||||||
receiver_ty: Ty<'tcx>,
|
receiver_ty: Ty<'tcx>,
|
||||||
) -> bool {
|
) -> bool {
|
||||||
let trait_ref = ty::TraitRef {
|
let trait_ref = ty::Binder::dummy(ty::TraitRef {
|
||||||
def_id: receiver_trait_def_id,
|
def_id: receiver_trait_def_id,
|
||||||
substs: fcx.tcx.mk_substs_trait(receiver_ty, &[]),
|
substs: fcx.tcx.mk_substs_trait(receiver_ty, &[]),
|
||||||
};
|
});
|
||||||
|
|
||||||
let obligation = traits::Obligation::new(
|
let obligation = traits::Obligation::new(
|
||||||
cause,
|
cause,
|
||||||
|
|
|
@ -40,7 +40,7 @@ use rustc_middle::ty::query::Providers;
|
||||||
use rustc_middle::ty::subst::InternalSubsts;
|
use rustc_middle::ty::subst::InternalSubsts;
|
||||||
use rustc_middle::ty::util::Discr;
|
use rustc_middle::ty::util::Discr;
|
||||||
use rustc_middle::ty::util::IntTypeExt;
|
use rustc_middle::ty::util::IntTypeExt;
|
||||||
use rustc_middle::ty::{self, AdtKind, Const, DefIdTree, ToPolyTraitRef, Ty, TyCtxt};
|
use rustc_middle::ty::{self, AdtKind, Const, DefIdTree, Ty, TyCtxt};
|
||||||
use rustc_middle::ty::{ReprOptions, ToPredicate, WithConstness};
|
use rustc_middle::ty::{ReprOptions, ToPredicate, WithConstness};
|
||||||
use rustc_session::lint;
|
use rustc_session::lint;
|
||||||
use rustc_session::parse::feature_err;
|
use rustc_session::parse::feature_err;
|
||||||
|
@ -2042,7 +2042,9 @@ fn gather_explicit_predicates_of(tcx: TyCtxt<'_>, def_id: DefId) -> ty::GenericP
|
||||||
match item.kind {
|
match item.kind {
|
||||||
ItemKind::Impl(ref impl_) => {
|
ItemKind::Impl(ref impl_) => {
|
||||||
if impl_.defaultness.is_default() {
|
if impl_.defaultness.is_default() {
|
||||||
is_default_impl_trait = tcx.impl_trait_ref(def_id);
|
is_default_impl_trait = tcx
|
||||||
|
.impl_trait_ref(def_id)
|
||||||
|
.map(|trait_ref| ty::Binder::dummy(trait_ref));
|
||||||
}
|
}
|
||||||
&impl_.generics
|
&impl_.generics
|
||||||
}
|
}
|
||||||
|
@ -2122,10 +2124,7 @@ fn gather_explicit_predicates_of(tcx: TyCtxt<'_>, def_id: DefId) -> ty::GenericP
|
||||||
// (see below). Recall that a default impl is not itself an impl, but rather a
|
// (see below). Recall that a default impl is not itself an impl, but rather a
|
||||||
// set of defaults that can be incorporated into another impl.
|
// set of defaults that can be incorporated into another impl.
|
||||||
if let Some(trait_ref) = is_default_impl_trait {
|
if let Some(trait_ref) = is_default_impl_trait {
|
||||||
predicates.insert((
|
predicates.insert((trait_ref.without_const().to_predicate(tcx), tcx.def_span(def_id)));
|
||||||
trait_ref.to_poly_trait_ref().without_const().to_predicate(tcx),
|
|
||||||
tcx.def_span(def_id),
|
|
||||||
));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Collect the region predicates that were declared inline as
|
// Collect the region predicates that were declared inline as
|
||||||
|
@ -2238,8 +2237,10 @@ fn gather_explicit_predicates_of(tcx: TyCtxt<'_>, def_id: DefId) -> ty::GenericP
|
||||||
}
|
}
|
||||||
_ => bug!(),
|
_ => bug!(),
|
||||||
};
|
};
|
||||||
let pred = ty::PredicateKind::RegionOutlives(ty::OutlivesPredicate(r1, r2))
|
let pred = ty::Binder::dummy(ty::PredicateKind::RegionOutlives(
|
||||||
.to_predicate(icx.tcx);
|
ty::OutlivesPredicate(r1, r2),
|
||||||
|
))
|
||||||
|
.to_predicate(icx.tcx);
|
||||||
|
|
||||||
(pred, span)
|
(pred, span)
|
||||||
}))
|
}))
|
||||||
|
@ -2304,7 +2305,8 @@ fn const_evaluatable_predicates_of<'tcx>(
|
||||||
assert_eq!(uv.promoted, None);
|
assert_eq!(uv.promoted, None);
|
||||||
let span = self.tcx.hir().span(c.hir_id);
|
let span = self.tcx.hir().span(c.hir_id);
|
||||||
self.preds.insert((
|
self.preds.insert((
|
||||||
ty::PredicateKind::ConstEvaluatable(uv.shrink()).to_predicate(self.tcx),
|
ty::Binder::dummy(ty::PredicateKind::ConstEvaluatable(uv.shrink()))
|
||||||
|
.to_predicate(self.tcx),
|
||||||
span,
|
span,
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
|
@ -83,7 +83,8 @@ fn diagnostic_hir_wf_check<'tcx>(
|
||||||
traits::Obligation::new(
|
traits::Obligation::new(
|
||||||
cause,
|
cause,
|
||||||
self.param_env,
|
self.param_env,
|
||||||
ty::PredicateKind::WellFormed(tcx_ty.into()).to_predicate(self.tcx),
|
ty::Binder::dummy(ty::PredicateKind::WellFormed(tcx_ty.into()))
|
||||||
|
.to_predicate(self.tcx),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
|
@ -104,13 +104,15 @@ fn inferred_outlives_crate(tcx: TyCtxt<'_>, (): ()) -> CratePredicatesMap<'_> {
|
||||||
|(ty::OutlivesPredicate(kind1, region2), &span)| {
|
|(ty::OutlivesPredicate(kind1, region2), &span)| {
|
||||||
match kind1.unpack() {
|
match kind1.unpack() {
|
||||||
GenericArgKind::Type(ty1) => Some((
|
GenericArgKind::Type(ty1) => Some((
|
||||||
ty::PredicateKind::TypeOutlives(ty::OutlivesPredicate(ty1, region2))
|
ty::Binder::dummy(ty::PredicateKind::TypeOutlives(
|
||||||
.to_predicate(tcx),
|
ty::OutlivesPredicate(ty1, region2),
|
||||||
|
))
|
||||||
|
.to_predicate(tcx),
|
||||||
span,
|
span,
|
||||||
)),
|
)),
|
||||||
GenericArgKind::Lifetime(region1) => Some((
|
GenericArgKind::Lifetime(region1) => Some((
|
||||||
ty::PredicateKind::RegionOutlives(ty::OutlivesPredicate(
|
ty::Binder::dummy(ty::PredicateKind::RegionOutlives(
|
||||||
region1, region2,
|
ty::OutlivesPredicate(region1, region2),
|
||||||
))
|
))
|
||||||
.to_predicate(tcx),
|
.to_predicate(tcx),
|
||||||
span,
|
span,
|
||||||
|
|
|
@ -64,7 +64,11 @@ impl<'a, 'tcx> BlanketImplFinder<'a, 'tcx> {
|
||||||
.instantiate(self.cx.tcx, impl_substs)
|
.instantiate(self.cx.tcx, impl_substs)
|
||||||
.predicates
|
.predicates
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.chain(Some(trait_ref.without_const().to_predicate(infcx.tcx)));
|
.chain(Some(
|
||||||
|
ty::Binder::dummy(trait_ref)
|
||||||
|
.without_const()
|
||||||
|
.to_predicate(infcx.tcx),
|
||||||
|
));
|
||||||
for predicate in predicates {
|
for predicate in predicates {
|
||||||
debug!("testing predicate {:?}", predicate);
|
debug!("testing predicate {:?}", predicate);
|
||||||
let obligation = traits::Obligation::new(
|
let obligation = traits::Obligation::new(
|
||||||
|
|
|
@ -132,7 +132,7 @@ impl Clean<GenericBound> for hir::GenericBound<'_> {
|
||||||
hir::GenericBound::LangItemTrait(lang_item, span, _, generic_args) => {
|
hir::GenericBound::LangItemTrait(lang_item, span, _, generic_args) => {
|
||||||
let def_id = cx.tcx.require_lang_item(lang_item, Some(span));
|
let def_id = cx.tcx.require_lang_item(lang_item, Some(span));
|
||||||
|
|
||||||
let trait_ref = ty::TraitRef::identity(cx.tcx, def_id);
|
let trait_ref = ty::TraitRef::identity(cx.tcx, def_id).skip_binder();
|
||||||
|
|
||||||
let generic_args = generic_args.clean(cx);
|
let generic_args = generic_args.clean(cx);
|
||||||
let bindings = match generic_args {
|
let bindings = match generic_args {
|
||||||
|
|
|
@ -92,7 +92,7 @@ impl<'tcx> LateLintPass<'tcx> for BoxedLocal {
|
||||||
// be sure we have `self` parameter in this function
|
// be sure we have `self` parameter in this function
|
||||||
if let AssocItemKind::Fn { has_self: true } = trait_item.kind {
|
if let AssocItemKind::Fn { has_self: true } = trait_item.kind {
|
||||||
trait_self_ty =
|
trait_self_ty =
|
||||||
Some(TraitRef::identity(cx.tcx, trait_item.id.def_id.to_def_id()).self_ty());
|
Some(TraitRef::identity(cx.tcx, trait_item.id.def_id.to_def_id()).self_ty().skip_binder());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -2061,7 +2061,7 @@ impl<'tcx> LateLintPass<'tcx> for Methods {
|
||||||
then {
|
then {
|
||||||
let first_arg_span = first_arg_ty.span;
|
let first_arg_span = first_arg_ty.span;
|
||||||
let first_arg_ty = hir_ty_to_ty(cx.tcx, first_arg_ty);
|
let first_arg_ty = hir_ty_to_ty(cx.tcx, first_arg_ty);
|
||||||
let self_ty = TraitRef::identity(cx.tcx, item.def_id.to_def_id()).self_ty();
|
let self_ty = TraitRef::identity(cx.tcx, item.def_id.to_def_id()).self_ty().skip_binder();
|
||||||
wrong_self_convention::check(
|
wrong_self_convention::check(
|
||||||
cx,
|
cx,
|
||||||
&item.ident.name.as_str(),
|
&item.ident.name.as_str(),
|
||||||
|
@ -2078,7 +2078,7 @@ impl<'tcx> LateLintPass<'tcx> for Methods {
|
||||||
if item.ident.name == sym::new;
|
if item.ident.name == sym::new;
|
||||||
if let TraitItemKind::Fn(_, _) = item.kind;
|
if let TraitItemKind::Fn(_, _) = item.kind;
|
||||||
let ret_ty = return_ty(cx, item.hir_id());
|
let ret_ty = return_ty(cx, item.hir_id());
|
||||||
let self_ty = TraitRef::identity(cx.tcx, item.def_id.to_def_id()).self_ty();
|
let self_ty = TraitRef::identity(cx.tcx, item.def_id.to_def_id()).self_ty().skip_binder();
|
||||||
if !contains_ty(cx.tcx, ret_ty, self_ty);
|
if !contains_ty(cx.tcx, ret_ty, self_ty);
|
||||||
|
|
||||||
then {
|
then {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue