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