Rollup merge of #77155 - lcnr:ImplSource, r=ecstatic-morse
remove enum name from ImplSource variants This is quite a lot cleaner in my opinion.
This commit is contained in:
commit
e739468f97
8 changed files with 104 additions and 110 deletions
|
@ -96,7 +96,7 @@ impl<'tcx> AutoTraitFinder<'tcx> {
|
|||
));
|
||||
|
||||
match result {
|
||||
Ok(Some(ImplSource::ImplSourceUserDefined(_))) => {
|
||||
Ok(Some(ImplSource::UserDefined(_))) => {
|
||||
debug!(
|
||||
"find_auto_trait_generics({:?}): \
|
||||
manual impl found, bailing out",
|
||||
|
@ -315,9 +315,8 @@ impl AutoTraitFinder<'tcx> {
|
|||
// If we see an explicit negative impl (e.g., `impl !Send for MyStruct`),
|
||||
// we immediately bail out, since it's impossible for us to continue.
|
||||
|
||||
if let ImplSource::ImplSourceUserDefined(ImplSourceUserDefinedData {
|
||||
impl_def_id,
|
||||
..
|
||||
if let ImplSource::UserDefined(ImplSourceUserDefinedData {
|
||||
impl_def_id, ..
|
||||
}) = impl_source
|
||||
{
|
||||
// Blame 'tidy' for the weird bracket placement.
|
||||
|
|
|
@ -1000,15 +1000,15 @@ fn assemble_candidates_from_impls<'cx, 'tcx>(
|
|||
};
|
||||
|
||||
let eligible = match &impl_source {
|
||||
super::ImplSourceClosure(_)
|
||||
| super::ImplSourceGenerator(_)
|
||||
| super::ImplSourceFnPointer(_)
|
||||
| super::ImplSourceObject(_)
|
||||
| super::ImplSourceTraitAlias(_) => {
|
||||
super::ImplSource::Closure(_)
|
||||
| super::ImplSource::Generator(_)
|
||||
| super::ImplSource::FnPointer(_)
|
||||
| super::ImplSource::Object(_)
|
||||
| super::ImplSource::TraitAlias(_) => {
|
||||
debug!("assemble_candidates_from_impls: impl_source={:?}", impl_source);
|
||||
true
|
||||
}
|
||||
super::ImplSourceUserDefined(impl_data) => {
|
||||
super::ImplSource::UserDefined(impl_data) => {
|
||||
// We have to be careful when projecting out of an
|
||||
// impl because of specialization. If we are not in
|
||||
// codegen (i.e., projection mode is not "any"), and the
|
||||
|
@ -1060,7 +1060,7 @@ fn assemble_candidates_from_impls<'cx, 'tcx>(
|
|||
}
|
||||
}
|
||||
}
|
||||
super::ImplSourceDiscriminantKind(..) => {
|
||||
super::ImplSource::DiscriminantKind(..) => {
|
||||
// While `DiscriminantKind` is automatically implemented for every type,
|
||||
// the concrete discriminant may not be known yet.
|
||||
//
|
||||
|
@ -1100,7 +1100,7 @@ fn assemble_candidates_from_impls<'cx, 'tcx>(
|
|||
| ty::Error(_) => false,
|
||||
}
|
||||
}
|
||||
super::ImplSourceParam(..) => {
|
||||
super::ImplSource::Param(..) => {
|
||||
// This case tell us nothing about the value of an
|
||||
// associated type. Consider:
|
||||
//
|
||||
|
@ -1128,7 +1128,7 @@ fn assemble_candidates_from_impls<'cx, 'tcx>(
|
|||
// in `assemble_candidates_from_param_env`.
|
||||
false
|
||||
}
|
||||
super::ImplSourceAutoImpl(..) | super::ImplSourceBuiltin(..) => {
|
||||
super::ImplSource::AutoImpl(..) | super::ImplSource::Builtin(..) => {
|
||||
// These traits have no associated types.
|
||||
selcx.tcx().sess.delay_span_bug(
|
||||
obligation.cause.span,
|
||||
|
@ -1186,20 +1186,20 @@ fn confirm_select_candidate<'cx, 'tcx>(
|
|||
impl_source: Selection<'tcx>,
|
||||
) -> Progress<'tcx> {
|
||||
match impl_source {
|
||||
super::ImplSourceUserDefined(data) => confirm_impl_candidate(selcx, obligation, data),
|
||||
super::ImplSourceGenerator(data) => confirm_generator_candidate(selcx, obligation, data),
|
||||
super::ImplSourceClosure(data) => confirm_closure_candidate(selcx, obligation, data),
|
||||
super::ImplSourceFnPointer(data) => confirm_fn_pointer_candidate(selcx, obligation, data),
|
||||
super::ImplSourceDiscriminantKind(data) => {
|
||||
super::ImplSource::UserDefined(data) => confirm_impl_candidate(selcx, obligation, data),
|
||||
super::ImplSource::Generator(data) => confirm_generator_candidate(selcx, obligation, data),
|
||||
super::ImplSource::Closure(data) => confirm_closure_candidate(selcx, obligation, data),
|
||||
super::ImplSource::FnPointer(data) => confirm_fn_pointer_candidate(selcx, obligation, data),
|
||||
super::ImplSource::DiscriminantKind(data) => {
|
||||
confirm_discriminant_kind_candidate(selcx, obligation, data)
|
||||
}
|
||||
super::ImplSourceObject(_) => {
|
||||
super::ImplSource::Object(_) => {
|
||||
confirm_object_candidate(selcx, obligation, obligation_trait_ref)
|
||||
}
|
||||
super::ImplSourceAutoImpl(..)
|
||||
| super::ImplSourceParam(..)
|
||||
| super::ImplSourceBuiltin(..)
|
||||
| super::ImplSourceTraitAlias(..) =>
|
||||
super::ImplSource::AutoImpl(..)
|
||||
| super::ImplSource::Param(..)
|
||||
| super::ImplSource::Builtin(..)
|
||||
| super::ImplSource::TraitAlias(..) =>
|
||||
// we don't create Select candidates with this kind of resolution
|
||||
{
|
||||
span_bug!(
|
||||
|
|
|
@ -19,16 +19,12 @@ use crate::traits::project::{self, normalize_with_depth};
|
|||
use crate::traits::select::TraitObligationExt;
|
||||
use crate::traits::util;
|
||||
use crate::traits::util::{closure_trait_ref_and_return_type, predicate_for_trait_def};
|
||||
use crate::traits::ImplSource;
|
||||
use crate::traits::Normalized;
|
||||
use crate::traits::OutputTypeParameterMismatch;
|
||||
use crate::traits::Selection;
|
||||
use crate::traits::TraitNotObjectSafe;
|
||||
use crate::traits::{BuiltinDerivedObligation, ImplDerivedObligation};
|
||||
use crate::traits::{
|
||||
ImplSourceAutoImpl, ImplSourceBuiltin, ImplSourceClosure, ImplSourceDiscriminantKind,
|
||||
ImplSourceFnPointer, ImplSourceGenerator, ImplSourceObject, ImplSourceParam,
|
||||
ImplSourceTraitAlias, ImplSourceUserDefined,
|
||||
};
|
||||
use crate::traits::{
|
||||
ImplSourceAutoImplData, ImplSourceBuiltinData, ImplSourceClosureData,
|
||||
ImplSourceDiscriminantKindData, ImplSourceFnPointerData, ImplSourceGeneratorData,
|
||||
|
@ -55,67 +51,67 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
|
|||
match candidate {
|
||||
BuiltinCandidate { has_nested } => {
|
||||
let data = self.confirm_builtin_candidate(obligation, has_nested);
|
||||
Ok(ImplSourceBuiltin(data))
|
||||
Ok(ImplSource::Builtin(data))
|
||||
}
|
||||
|
||||
ParamCandidate(param) => {
|
||||
let obligations = self.confirm_param_candidate(obligation, param);
|
||||
Ok(ImplSourceParam(obligations))
|
||||
Ok(ImplSource::Param(obligations))
|
||||
}
|
||||
|
||||
ImplCandidate(impl_def_id) => {
|
||||
Ok(ImplSourceUserDefined(self.confirm_impl_candidate(obligation, impl_def_id)))
|
||||
Ok(ImplSource::UserDefined(self.confirm_impl_candidate(obligation, impl_def_id)))
|
||||
}
|
||||
|
||||
AutoImplCandidate(trait_def_id) => {
|
||||
let data = self.confirm_auto_impl_candidate(obligation, trait_def_id);
|
||||
Ok(ImplSourceAutoImpl(data))
|
||||
Ok(ImplSource::AutoImpl(data))
|
||||
}
|
||||
|
||||
ProjectionCandidate => {
|
||||
self.confirm_projection_candidate(obligation);
|
||||
Ok(ImplSourceParam(Vec::new()))
|
||||
Ok(ImplSource::Param(Vec::new()))
|
||||
}
|
||||
|
||||
ClosureCandidate => {
|
||||
let vtable_closure = self.confirm_closure_candidate(obligation)?;
|
||||
Ok(ImplSourceClosure(vtable_closure))
|
||||
Ok(ImplSource::Closure(vtable_closure))
|
||||
}
|
||||
|
||||
GeneratorCandidate => {
|
||||
let vtable_generator = self.confirm_generator_candidate(obligation)?;
|
||||
Ok(ImplSourceGenerator(vtable_generator))
|
||||
Ok(ImplSource::Generator(vtable_generator))
|
||||
}
|
||||
|
||||
FnPointerCandidate => {
|
||||
let data = self.confirm_fn_pointer_candidate(obligation)?;
|
||||
Ok(ImplSourceFnPointer(data))
|
||||
Ok(ImplSource::FnPointer(data))
|
||||
}
|
||||
|
||||
DiscriminantKindCandidate => {
|
||||
Ok(ImplSourceDiscriminantKind(ImplSourceDiscriminantKindData))
|
||||
Ok(ImplSource::DiscriminantKind(ImplSourceDiscriminantKindData))
|
||||
}
|
||||
|
||||
TraitAliasCandidate(alias_def_id) => {
|
||||
let data = self.confirm_trait_alias_candidate(obligation, alias_def_id);
|
||||
Ok(ImplSourceTraitAlias(data))
|
||||
Ok(ImplSource::TraitAlias(data))
|
||||
}
|
||||
|
||||
ObjectCandidate => {
|
||||
let data = self.confirm_object_candidate(obligation);
|
||||
Ok(ImplSourceObject(data))
|
||||
Ok(ImplSource::Object(data))
|
||||
}
|
||||
|
||||
BuiltinObjectCandidate => {
|
||||
// This indicates something like `Trait + Send: Send`. In this case, we know that
|
||||
// this holds because that's what the object type is telling us, and there's really
|
||||
// no additional obligations to prove and no types in particular to unify, etc.
|
||||
Ok(ImplSourceParam(Vec::new()))
|
||||
Ok(ImplSource::Param(Vec::new()))
|
||||
}
|
||||
|
||||
BuiltinUnsizeCandidate => {
|
||||
let data = self.confirm_builtin_unsize_candidate(obligation)?;
|
||||
Ok(ImplSourceBuiltin(data))
|
||||
Ok(ImplSource::Builtin(data))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue