1
Fork 0
rust/compiler/rustc_trait_selection/src
Michael Goulet 6388c0ef04
Rollup merge of #118000 - compiler-errors:placeholder-ty-outlives, r=aliemjay
Make regionck care about placeholders in outlives components

Currently, we don't consider a placeholder type `!T` to be a type component when it comes to processing type-outlives obligations. This means that they are essentially treated like unit values with no sub-components, and always outlive any region. This is problematic for `non_lifetime_binders`, and even more problematic for `with_negative_coherence`, since negative coherence uses placeholders as universals.

This PR adds `Component::Placeholder` which acts much like `Component::Param`. This currently causes a regression in some non-lifetime-binders tests because `for<T> T: 'static` doesn't imply itself when processing outlives obligations, so code like this will fail:

```
fn foo() where for<T> T: 'static {
  foo() //~ fails
}
```

Since the where clause doesn't imply itself. This requires making the `MatchAgainstHigherRankedOutlives` relation smarter when it comes to binders.

r? types
2023-11-19 19:14:35 -08:00
..
solve Auto merge of #117278 - lcnr:try-normalize-ty, r=compiler-errors 2023-11-17 10:16:41 +00:00
traits Rollup merge of #118000 - compiler-errors:placeholder-ty-outlives, r=aliemjay 2023-11-19 19:14:35 -08:00
errors.rs Migrate a trait selection error to use diagnostic translation 2023-08-07 05:26:38 +00:00
infer.rs Remove constness from TraitPredicate 2023-08-02 15:38:00 +00:00
lib.rs Bump cfg(bootstrap)s 2023-11-15 19:41:28 -05:00