rust/compiler/rustc_trait_selection/src
Matthias Krüger da43826398
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
2025-04-17 17:40:27 +02:00
..
error_reporting Rename LifetimeName as LifetimeKind. 2025-04-16 07:16:40 +10:00
errors Move eager translation to a method on Diag 2025-04-16 21:38:59 -04:00
solve Fix replacing supertrait aliases in ReplaceProjectionWith 2025-04-16 20:05:55 +00:00
traits Auto merge of #139845 - Zalathar:rollup-u5u5y1v, r=Zalathar 2025-04-15 08:02:23 +00:00
errors.rs Move eager translation to a method on Diag 2025-04-16 21:38:59 -04:00
infer.rs Fix next solver handling of shallow trait impl check 2025-03-19 14:40:14 +00:00
lib.rs move check_opaque_type_parameter_valid 2025-04-03 11:13:10 +02:00
opaque_types.rs NonGenericOpaqueTypeParam::ty to arg 2025-04-11 15:18:30 +02:00
regions.rs Only use implied bounds hack if bevy, and use deeply normalize in implied bounds hack 2025-03-04 18:18:48 +00:00
solve.rs impossible obligations check fast path 2024-10-10 06:09:50 -04:00