deal with opaque types without cycling
This commit is contained in:
parent
3adedc93a9
commit
b5b3f33940
7 changed files with 95 additions and 230 deletions
|
@ -532,22 +532,27 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
|
|||
}
|
||||
}
|
||||
|
||||
ty::Infer(ty::FreshTy(_) | ty::FreshIntTy(_) | ty::FreshFloatTy(_)) => {
|
||||
ty::Infer(ty::FreshTy(_) | ty::FreshIntTy(_) | ty::FreshFloatTy(_)) => {
|
||||
bug!(
|
||||
"asked to assemble auto trait candidates of unexpected type: {:?}",
|
||||
self_ty
|
||||
);
|
||||
}
|
||||
|
||||
// Only consider auto impls if there are no manual impls for the root of `self_ty`.
|
||||
//
|
||||
// For example, we only consider auto candidates for `&i32: Auto` if no explicit impl
|
||||
// for `&SomeType: Auto` exists. Due to E0321 the only crate where impls
|
||||
// for `&SomeType: Auto` can be defined is the crate where `Auto` has been defined.
|
||||
//
|
||||
// Generally, we have to guarantee that for all `SimplifiedType`s the only crate
|
||||
// which may define impls for that type is either the crate defining the type
|
||||
// or the trait. This should be guaranteed by the orphan check.
|
||||
ty::Alias(_, _)
|
||||
if candidates.vec.iter().any(|c| matches!(c, ProjectionCandidate(..))) =>
|
||||
{
|
||||
// We do not generate an auto impl candidate for `impl Trait`s which already
|
||||
// reference our auto trait.
|
||||
//
|
||||
// For example during candidate assembly for `impl Send: Send`, we don't have
|
||||
// to look at the constituent types for this opaque types to figure out that this
|
||||
// trivially holds.
|
||||
//
|
||||
// Note that this is only sound as projection candidates of opaque types
|
||||
// are always applicable for auto traits.
|
||||
}
|
||||
|
||||
ty::Bool
|
||||
| ty::Char
|
||||
| ty::Int(_)
|
||||
|
@ -568,6 +573,15 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
|
|||
| ty::Alias(_, _)
|
||||
| ty::GeneratorWitness(_)
|
||||
| ty::GeneratorWitnessMIR(..) => {
|
||||
// Only consider auto impls if there are no manual impls for the root of `self_ty`.
|
||||
//
|
||||
// For example, we only consider auto candidates for `&i32: Auto` if no explicit impl
|
||||
// for `&SomeType: Auto` exists. Due to E0321 the only crate where impls
|
||||
// for `&SomeType: Auto` can be defined is the crate where `Auto` has been defined.
|
||||
//
|
||||
// Generally, we have to guarantee that for all `SimplifiedType`s the only crate
|
||||
// which may define impls for that type is either the crate defining the type
|
||||
// or the trait. This should be guaranteed by the orphan check.
|
||||
let mut has_impl = false;
|
||||
self.tcx().for_each_relevant_impl(def_id, self_ty, |_| has_impl = true);
|
||||
if !has_impl {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue