Rollup merge of #139774 - compiler-errors:supertrait-alias, r=lcnr
Fix replacing supertrait aliases in `ReplaceProjectionWith` The new solver has a procedure called `predicates_for_object_candidate`, which elaborates the super-bounds and item-bounds that are required to hold for a dyn trait to implement something via a built-in object impl. In that procedure, there is a folder called `ReplaceProjectionWith` which is responsible for replacing projections that reference `Self`, so that we don't encounter cycles when we then go on to normalize those projections in the process of proving these super-bounds. That folder had a few problems: Firstly, it wasn't actually checking that this was a super bound originating from `Self`. Secondly, it only accounted for a *single* projection type def id, but trait objects can have multiple (i.e. `trait Foo<A, B>: Bar<A, Assoc = A> + Bar<B, Assoc = B>`). To fix the first, it's simple enough to just add an equality check for the self ty. To fix the second, I implemented a matching step that's very similar to the `projection_may_match` check we have for upcasting, since on top of having multiple choices, we need to deal with both non-structural matches and ambiguity. This probably lacks a bit of documentation, but I think it works pretty well. Fixes https://github.com/rust-lang/trait-system-refactor-initiative/issues/171 r? lcnr
This commit is contained in:
commit
da43826398
10 changed files with 238 additions and 74 deletions
|
@ -292,7 +292,7 @@ impl<'a, 'tcx> InspectGoal<'a, 'tcx> {
|
|||
inspect::ProbeStep::NestedProbe(ref probe) => {
|
||||
match probe.kind {
|
||||
// These never assemble candidates for the goal we're trying to solve.
|
||||
inspect::ProbeKind::UpcastProjectionCompatibility
|
||||
inspect::ProbeKind::ProjectionCompatibility
|
||||
| inspect::ProbeKind::ShadowedEnvProbing => continue,
|
||||
|
||||
inspect::ProbeKind::NormalizedSelfTyAssembly
|
||||
|
@ -314,8 +314,10 @@ impl<'a, 'tcx> InspectGoal<'a, 'tcx> {
|
|||
}
|
||||
|
||||
match probe.kind {
|
||||
inspect::ProbeKind::UpcastProjectionCompatibility
|
||||
| inspect::ProbeKind::ShadowedEnvProbing => bug!(),
|
||||
inspect::ProbeKind::ProjectionCompatibility
|
||||
| inspect::ProbeKind::ShadowedEnvProbing => {
|
||||
bug!()
|
||||
}
|
||||
|
||||
inspect::ProbeKind::NormalizedSelfTyAssembly | inspect::ProbeKind::UnsizeAssembly => {}
|
||||
|
||||
|
|
|
@ -177,7 +177,7 @@ fn to_selection<'tcx>(
|
|||
},
|
||||
ProbeKind::NormalizedSelfTyAssembly
|
||||
| ProbeKind::UnsizeAssembly
|
||||
| ProbeKind::UpcastProjectionCompatibility
|
||||
| ProbeKind::ProjectionCompatibility
|
||||
| ProbeKind::OpaqueTypeStorageLookup { result: _ }
|
||||
| ProbeKind::Root { result: _ }
|
||||
| ProbeKind::ShadowedEnvProbing
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue