Make regionck care about placeholders in outlives components by compiler-errors · Pull Request #118000 · rust-lang/rust (original) (raw)

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