Simplify some impl source candidates
This commit is contained in:
parent
1704481bfa
commit
9e68b6f505
6 changed files with 18 additions and 81 deletions
|
@ -172,7 +172,7 @@ impl Qualif for NeedsNonConstDrop {
|
||||||
|
|
||||||
if !matches!(
|
if !matches!(
|
||||||
impl_src,
|
impl_src,
|
||||||
ImplSource::ConstDestruct(_) | ImplSource::Param(_, ty::BoundConstness::ConstIfConst)
|
ImplSource::Builtin(_) | ImplSource::Param(_, ty::BoundConstness::ConstIfConst)
|
||||||
) {
|
) {
|
||||||
// If our const destruct candidate is not ConstDestruct or implied by the param env,
|
// If our const destruct candidate is not ConstDestruct or implied by the param env,
|
||||||
// then it's bad
|
// then it's bad
|
||||||
|
|
|
@ -646,12 +646,6 @@ pub enum ImplSource<'tcx, N> {
|
||||||
/// ImplSource identifying a particular impl.
|
/// ImplSource identifying a particular impl.
|
||||||
UserDefined(ImplSourceUserDefinedData<'tcx, N>),
|
UserDefined(ImplSourceUserDefinedData<'tcx, N>),
|
||||||
|
|
||||||
/// ImplSource for auto trait implementations.
|
|
||||||
/// This carries the information and nested obligations with regards
|
|
||||||
/// to an auto implementation for a trait `Trait`. The nested obligations
|
|
||||||
/// ensure the trait implementation holds for all the constituent types.
|
|
||||||
AutoImpl(ImplSourceAutoImplData<N>),
|
|
||||||
|
|
||||||
/// Successful resolution to an obligation provided by the caller
|
/// Successful resolution to an obligation provided by the caller
|
||||||
/// for some type parameter. The `Vec<N>` represents the
|
/// for some type parameter. The `Vec<N>` represents the
|
||||||
/// obligations incurred from normalizing the where-clause (if
|
/// obligations incurred from normalizing the where-clause (if
|
||||||
|
@ -683,9 +677,6 @@ pub enum ImplSource<'tcx, N> {
|
||||||
|
|
||||||
/// ImplSource for a trait alias.
|
/// ImplSource for a trait alias.
|
||||||
TraitAlias(ImplSourceTraitAliasData<'tcx, N>),
|
TraitAlias(ImplSourceTraitAliasData<'tcx, N>),
|
||||||
|
|
||||||
/// ImplSource for a `const Drop` implementation.
|
|
||||||
ConstDestruct(ImplSourceConstDestructData<N>),
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'tcx, N> ImplSource<'tcx, N> {
|
impl<'tcx, N> ImplSource<'tcx, N> {
|
||||||
|
@ -693,7 +684,6 @@ impl<'tcx, N> ImplSource<'tcx, N> {
|
||||||
match self {
|
match self {
|
||||||
ImplSource::UserDefined(i) => i.nested,
|
ImplSource::UserDefined(i) => i.nested,
|
||||||
ImplSource::Param(n, _) | ImplSource::Builtin(n) => n,
|
ImplSource::Param(n, _) | ImplSource::Builtin(n) => n,
|
||||||
ImplSource::AutoImpl(d) => d.nested,
|
|
||||||
ImplSource::Closure(c) => c.nested,
|
ImplSource::Closure(c) => c.nested,
|
||||||
ImplSource::Generator(c) => c.nested,
|
ImplSource::Generator(c) => c.nested,
|
||||||
ImplSource::Future(c) => c.nested,
|
ImplSource::Future(c) => c.nested,
|
||||||
|
@ -701,7 +691,6 @@ impl<'tcx, N> ImplSource<'tcx, N> {
|
||||||
ImplSource::FnPointer(d) => d.nested,
|
ImplSource::FnPointer(d) => d.nested,
|
||||||
ImplSource::TraitAlias(d) => d.nested,
|
ImplSource::TraitAlias(d) => d.nested,
|
||||||
ImplSource::TraitUpcasting(d) => d.nested,
|
ImplSource::TraitUpcasting(d) => d.nested,
|
||||||
ImplSource::ConstDestruct(i) => i.nested,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -709,7 +698,6 @@ impl<'tcx, N> ImplSource<'tcx, N> {
|
||||||
match self {
|
match self {
|
||||||
ImplSource::UserDefined(i) => &i.nested,
|
ImplSource::UserDefined(i) => &i.nested,
|
||||||
ImplSource::Param(n, _) | ImplSource::Builtin(n) => n,
|
ImplSource::Param(n, _) | ImplSource::Builtin(n) => n,
|
||||||
ImplSource::AutoImpl(d) => &d.nested,
|
|
||||||
ImplSource::Closure(c) => &c.nested,
|
ImplSource::Closure(c) => &c.nested,
|
||||||
ImplSource::Generator(c) => &c.nested,
|
ImplSource::Generator(c) => &c.nested,
|
||||||
ImplSource::Future(c) => &c.nested,
|
ImplSource::Future(c) => &c.nested,
|
||||||
|
@ -717,7 +705,6 @@ impl<'tcx, N> ImplSource<'tcx, N> {
|
||||||
ImplSource::FnPointer(d) => &d.nested,
|
ImplSource::FnPointer(d) => &d.nested,
|
||||||
ImplSource::TraitAlias(d) => &d.nested,
|
ImplSource::TraitAlias(d) => &d.nested,
|
||||||
ImplSource::TraitUpcasting(d) => &d.nested,
|
ImplSource::TraitUpcasting(d) => &d.nested,
|
||||||
ImplSource::ConstDestruct(i) => &i.nested,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -725,7 +712,6 @@ impl<'tcx, N> ImplSource<'tcx, N> {
|
||||||
match self {
|
match self {
|
||||||
ImplSource::UserDefined(i) => &mut i.nested,
|
ImplSource::UserDefined(i) => &mut i.nested,
|
||||||
ImplSource::Param(n, _) | ImplSource::Builtin(n) => n,
|
ImplSource::Param(n, _) | ImplSource::Builtin(n) => n,
|
||||||
ImplSource::AutoImpl(d) => &mut d.nested,
|
|
||||||
ImplSource::Closure(c) => &mut c.nested,
|
ImplSource::Closure(c) => &mut c.nested,
|
||||||
ImplSource::Generator(c) => &mut c.nested,
|
ImplSource::Generator(c) => &mut c.nested,
|
||||||
ImplSource::Future(c) => &mut c.nested,
|
ImplSource::Future(c) => &mut c.nested,
|
||||||
|
@ -733,7 +719,6 @@ impl<'tcx, N> ImplSource<'tcx, N> {
|
||||||
ImplSource::FnPointer(d) => &mut d.nested,
|
ImplSource::FnPointer(d) => &mut d.nested,
|
||||||
ImplSource::TraitAlias(d) => &mut d.nested,
|
ImplSource::TraitAlias(d) => &mut d.nested,
|
||||||
ImplSource::TraitUpcasting(d) => &mut d.nested,
|
ImplSource::TraitUpcasting(d) => &mut d.nested,
|
||||||
ImplSource::ConstDestruct(i) => &mut i.nested,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -754,10 +739,6 @@ impl<'tcx, N> ImplSource<'tcx, N> {
|
||||||
vtable_base: o.vtable_base,
|
vtable_base: o.vtable_base,
|
||||||
nested: o.nested.into_iter().map(f).collect(),
|
nested: o.nested.into_iter().map(f).collect(),
|
||||||
}),
|
}),
|
||||||
ImplSource::AutoImpl(d) => ImplSource::AutoImpl(ImplSourceAutoImplData {
|
|
||||||
trait_def_id: d.trait_def_id,
|
|
||||||
nested: d.nested.into_iter().map(f).collect(),
|
|
||||||
}),
|
|
||||||
ImplSource::Closure(c) => ImplSource::Closure(ImplSourceClosureData {
|
ImplSource::Closure(c) => ImplSource::Closure(ImplSourceClosureData {
|
||||||
closure_def_id: c.closure_def_id,
|
closure_def_id: c.closure_def_id,
|
||||||
substs: c.substs,
|
substs: c.substs,
|
||||||
|
@ -788,11 +769,6 @@ impl<'tcx, N> ImplSource<'tcx, N> {
|
||||||
nested: d.nested.into_iter().map(f).collect(),
|
nested: d.nested.into_iter().map(f).collect(),
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
ImplSource::ConstDestruct(i) => {
|
|
||||||
ImplSource::ConstDestruct(ImplSourceConstDestructData {
|
|
||||||
nested: i.nested.into_iter().map(f).collect(),
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -845,13 +821,6 @@ pub struct ImplSourceClosureData<'tcx, N> {
|
||||||
pub nested: Vec<N>,
|
pub nested: Vec<N>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, PartialEq, Eq, TyEncodable, TyDecodable, HashStable, Lift)]
|
|
||||||
#[derive(TypeFoldable, TypeVisitable)]
|
|
||||||
pub struct ImplSourceAutoImplData<N> {
|
|
||||||
pub trait_def_id: DefId,
|
|
||||||
pub nested: Vec<N>,
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Clone, PartialEq, Eq, TyEncodable, TyDecodable, HashStable, Lift)]
|
#[derive(Clone, PartialEq, Eq, TyEncodable, TyDecodable, HashStable, Lift)]
|
||||||
#[derive(TypeFoldable, TypeVisitable)]
|
#[derive(TypeFoldable, TypeVisitable)]
|
||||||
pub struct ImplSourceTraitUpcastingData<N> {
|
pub struct ImplSourceTraitUpcastingData<N> {
|
||||||
|
@ -886,12 +855,6 @@ pub struct ImplSourceFnPointerData<'tcx, N> {
|
||||||
pub nested: Vec<N>,
|
pub nested: Vec<N>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, PartialEq, Eq, TyEncodable, TyDecodable, HashStable, Lift)]
|
|
||||||
#[derive(TypeFoldable, TypeVisitable)]
|
|
||||||
pub struct ImplSourceConstDestructData<N> {
|
|
||||||
pub nested: Vec<N>,
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Clone, PartialEq, Eq, TyEncodable, TyDecodable, HashStable, Lift)]
|
#[derive(Clone, PartialEq, Eq, TyEncodable, TyDecodable, HashStable, Lift)]
|
||||||
#[derive(TypeFoldable, TypeVisitable)]
|
#[derive(TypeFoldable, TypeVisitable)]
|
||||||
pub struct ImplSourceTraitAliasData<'tcx, N> {
|
pub struct ImplSourceTraitAliasData<'tcx, N> {
|
||||||
|
|
|
@ -9,8 +9,6 @@ impl<'tcx, N: fmt::Debug> fmt::Debug for traits::ImplSource<'tcx, N> {
|
||||||
match *self {
|
match *self {
|
||||||
super::ImplSource::UserDefined(ref v) => write!(f, "{:?}", v),
|
super::ImplSource::UserDefined(ref v) => write!(f, "{:?}", v),
|
||||||
|
|
||||||
super::ImplSource::AutoImpl(ref t) => write!(f, "{:?}", t),
|
|
||||||
|
|
||||||
super::ImplSource::Closure(ref d) => write!(f, "{:?}", d),
|
super::ImplSource::Closure(ref d) => write!(f, "{:?}", d),
|
||||||
|
|
||||||
super::ImplSource::Generator(ref d) => write!(f, "{:?}", d),
|
super::ImplSource::Generator(ref d) => write!(f, "{:?}", d),
|
||||||
|
@ -30,8 +28,6 @@ impl<'tcx, N: fmt::Debug> fmt::Debug for traits::ImplSource<'tcx, N> {
|
||||||
super::ImplSource::TraitAlias(ref d) => write!(f, "{:?}", d),
|
super::ImplSource::TraitAlias(ref d) => write!(f, "{:?}", d),
|
||||||
|
|
||||||
super::ImplSource::TraitUpcasting(ref d) => write!(f, "{:?}", d),
|
super::ImplSource::TraitUpcasting(ref d) => write!(f, "{:?}", d),
|
||||||
|
|
||||||
super::ImplSource::ConstDestruct(ref d) => write!(f, "{:?}", d),
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -86,16 +82,6 @@ impl<N: fmt::Debug> fmt::Debug for traits::ImplSourceTraitUpcastingData<N> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<N: fmt::Debug> fmt::Debug for traits::ImplSourceAutoImplData<N> {
|
|
||||||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
|
||||||
write!(
|
|
||||||
f,
|
|
||||||
"ImplSourceAutoImplData(trait_def_id={:?}, nested={:?})",
|
|
||||||
self.trait_def_id, self.nested
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<'tcx, N: fmt::Debug> fmt::Debug for traits::ImplSourceObjectData<'tcx, N> {
|
impl<'tcx, N: fmt::Debug> fmt::Debug for traits::ImplSourceObjectData<'tcx, N> {
|
||||||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||||
write!(
|
write!(
|
||||||
|
@ -121,9 +107,3 @@ impl<'tcx, N: fmt::Debug> fmt::Debug for traits::ImplSourceTraitAliasData<'tcx,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<N: fmt::Debug> fmt::Debug for traits::ImplSourceConstDestructData<N> {
|
|
||||||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
|
||||||
write!(f, "ImplSourceConstDestructData(nested={:?})", self.nested)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -1929,9 +1929,7 @@ fn assemble_candidates_from_impls<'cx, 'tcx>(
|
||||||
// why we special case object types.
|
// why we special case object types.
|
||||||
false
|
false
|
||||||
}
|
}
|
||||||
super::ImplSource::AutoImpl(..)
|
| super::ImplSource::TraitUpcasting(_) => {
|
||||||
| super::ImplSource::TraitUpcasting(_)
|
|
||||||
| super::ImplSource::ConstDestruct(_) => {
|
|
||||||
// These traits have no associated types.
|
// These traits have no associated types.
|
||||||
selcx.tcx().sess.delay_span_bug(
|
selcx.tcx().sess.delay_span_bug(
|
||||||
obligation.cause.span,
|
obligation.cause.span,
|
||||||
|
@ -2001,11 +1999,9 @@ fn confirm_select_candidate<'cx, 'tcx>(
|
||||||
super::ImplSource::FnPointer(data) => confirm_fn_pointer_candidate(selcx, obligation, data),
|
super::ImplSource::FnPointer(data) => confirm_fn_pointer_candidate(selcx, obligation, data),
|
||||||
super::ImplSource::Builtin(data) => confirm_builtin_candidate(selcx, obligation, data),
|
super::ImplSource::Builtin(data) => confirm_builtin_candidate(selcx, obligation, data),
|
||||||
super::ImplSource::Object(_)
|
super::ImplSource::Object(_)
|
||||||
| super::ImplSource::AutoImpl(..)
|
|
||||||
| super::ImplSource::Param(..)
|
| super::ImplSource::Param(..)
|
||||||
| super::ImplSource::TraitUpcasting(_)
|
| super::ImplSource::TraitUpcasting(_)
|
||||||
| super::ImplSource::TraitAlias(..)
|
| super::ImplSource::TraitAlias(..) => {
|
||||||
| super::ImplSource::ConstDestruct(_) => {
|
|
||||||
// we don't create Select candidates with this kind of resolution
|
// we don't create Select candidates with this kind of resolution
|
||||||
span_bug!(
|
span_bug!(
|
||||||
obligation.cause.span,
|
obligation.cause.span,
|
||||||
|
|
|
@ -27,11 +27,11 @@ use crate::traits::vtable::{
|
||||||
};
|
};
|
||||||
use crate::traits::{
|
use crate::traits::{
|
||||||
BuiltinDerivedObligation, ImplDerivedObligation, ImplDerivedObligationCause, ImplSource,
|
BuiltinDerivedObligation, ImplDerivedObligation, ImplDerivedObligationCause, ImplSource,
|
||||||
ImplSourceAutoImplData, ImplSourceClosureData, ImplSourceConstDestructData,
|
ImplSourceClosureData, ImplSourceFnPointerData, ImplSourceFutureData, ImplSourceGeneratorData,
|
||||||
ImplSourceFnPointerData, ImplSourceFutureData, ImplSourceGeneratorData, ImplSourceObjectData,
|
ImplSourceObjectData, ImplSourceTraitAliasData, ImplSourceTraitUpcastingData,
|
||||||
ImplSourceTraitAliasData, ImplSourceTraitUpcastingData, ImplSourceUserDefinedData, Normalized,
|
ImplSourceUserDefinedData, Normalized, Obligation, ObligationCause,
|
||||||
Obligation, ObligationCause, OutputTypeParameterMismatch, PredicateObligation, Selection,
|
OutputTypeParameterMismatch, PredicateObligation, Selection, SelectionError,
|
||||||
SelectionError, TraitNotObjectSafe, TraitObligation, Unimplemented,
|
TraitNotObjectSafe, TraitObligation, Unimplemented,
|
||||||
};
|
};
|
||||||
|
|
||||||
use super::BuiltinImplConditions;
|
use super::BuiltinImplConditions;
|
||||||
|
@ -71,7 +71,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
|
||||||
|
|
||||||
AutoImplCandidate => {
|
AutoImplCandidate => {
|
||||||
let data = self.confirm_auto_impl_candidate(obligation);
|
let data = self.confirm_auto_impl_candidate(obligation);
|
||||||
ImplSource::AutoImpl(data)
|
ImplSource::Builtin(data)
|
||||||
}
|
}
|
||||||
|
|
||||||
ProjectionCandidate(idx, constness) => {
|
ProjectionCandidate(idx, constness) => {
|
||||||
|
@ -128,7 +128,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
|
||||||
|
|
||||||
ConstDestructCandidate(def_id) => {
|
ConstDestructCandidate(def_id) => {
|
||||||
let data = self.confirm_const_destruct_candidate(obligation, def_id)?;
|
let data = self.confirm_const_destruct_candidate(obligation, def_id)?;
|
||||||
ImplSource::ConstDestruct(data)
|
ImplSource::Builtin(data)
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -379,7 +379,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
|
||||||
fn confirm_auto_impl_candidate(
|
fn confirm_auto_impl_candidate(
|
||||||
&mut self,
|
&mut self,
|
||||||
obligation: &TraitObligation<'tcx>,
|
obligation: &TraitObligation<'tcx>,
|
||||||
) -> ImplSourceAutoImplData<PredicateObligation<'tcx>> {
|
) -> Vec<PredicateObligation<'tcx>> {
|
||||||
debug!(?obligation, "confirm_auto_impl_candidate");
|
debug!(?obligation, "confirm_auto_impl_candidate");
|
||||||
|
|
||||||
let self_ty = self.infcx.shallow_resolve(obligation.predicate.self_ty());
|
let self_ty = self.infcx.shallow_resolve(obligation.predicate.self_ty());
|
||||||
|
@ -393,7 +393,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
|
||||||
obligation: &TraitObligation<'tcx>,
|
obligation: &TraitObligation<'tcx>,
|
||||||
trait_def_id: DefId,
|
trait_def_id: DefId,
|
||||||
nested: ty::Binder<'tcx, Vec<Ty<'tcx>>>,
|
nested: ty::Binder<'tcx, Vec<Ty<'tcx>>>,
|
||||||
) -> ImplSourceAutoImplData<PredicateObligation<'tcx>> {
|
) -> Vec<PredicateObligation<'tcx>> {
|
||||||
debug!(?nested, "vtable_auto_impl");
|
debug!(?nested, "vtable_auto_impl");
|
||||||
ensure_sufficient_stack(|| {
|
ensure_sufficient_stack(|| {
|
||||||
let cause = obligation.derived_cause(BuiltinDerivedObligation);
|
let cause = obligation.derived_cause(BuiltinDerivedObligation);
|
||||||
|
@ -423,7 +423,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
|
||||||
|
|
||||||
debug!(?obligations, "vtable_auto_impl");
|
debug!(?obligations, "vtable_auto_impl");
|
||||||
|
|
||||||
ImplSourceAutoImplData { trait_def_id, nested: obligations }
|
obligations
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1222,10 +1222,10 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
|
||||||
&mut self,
|
&mut self,
|
||||||
obligation: &TraitObligation<'tcx>,
|
obligation: &TraitObligation<'tcx>,
|
||||||
impl_def_id: Option<DefId>,
|
impl_def_id: Option<DefId>,
|
||||||
) -> Result<ImplSourceConstDestructData<PredicateObligation<'tcx>>, SelectionError<'tcx>> {
|
) -> Result<Vec<PredicateObligation<'tcx>>, SelectionError<'tcx>> {
|
||||||
// `~const Destruct` in a non-const environment is always trivially true, since our type is `Drop`
|
// `~const Destruct` in a non-const environment is always trivially true, since our type is `Drop`
|
||||||
if !obligation.is_const() {
|
if !obligation.is_const() {
|
||||||
return Ok(ImplSourceConstDestructData { nested: vec![] });
|
return Ok(vec![]);
|
||||||
}
|
}
|
||||||
|
|
||||||
let drop_trait = self.tcx().require_lang_item(LangItem::Drop, None);
|
let drop_trait = self.tcx().require_lang_item(LangItem::Drop, None);
|
||||||
|
@ -1379,6 +1379,6 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(ImplSourceConstDestructData { nested })
|
Ok(nested)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -312,11 +312,9 @@ fn resolve_associated_item<'tcx>(
|
||||||
None
|
None
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
traits::ImplSource::AutoImpl(..)
|
traits::ImplSource::Param(..)
|
||||||
| traits::ImplSource::Param(..)
|
|
||||||
| traits::ImplSource::TraitAlias(..)
|
| traits::ImplSource::TraitAlias(..)
|
||||||
| traits::ImplSource::TraitUpcasting(_)
|
| traits::ImplSource::TraitUpcasting(_) => None,
|
||||||
| traits::ImplSource::ConstDestruct(_) => None,
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue