[ty] Fix subtyping of invariant generics specialized with Any (#20650)

This commit is contained in:
Alex Waygood 2025-10-01 11:05:54 +01:00 committed by GitHub
parent d9473a2fcf
commit 20eb5b5b35
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 51 additions and 11 deletions

View file

@ -830,6 +830,42 @@ static_assert(not is_subtype_of(object, Any))
static_assert(is_subtype_of(int, Any | int))
static_assert(is_subtype_of(Intersection[Any, int], int))
static_assert(not is_subtype_of(tuple[int, int], tuple[int, Any]))
class Covariant[T]:
def get(self) -> T:
raise NotImplementedError
static_assert(not is_subtype_of(Covariant[Any], Covariant[Any]))
static_assert(not is_subtype_of(Covariant[Any], Covariant[int]))
static_assert(not is_subtype_of(Covariant[int], Covariant[Any]))
static_assert(is_subtype_of(Covariant[Any], Covariant[object]))
static_assert(not is_subtype_of(Covariant[object], Covariant[Any]))
class Contravariant[T]:
def receive(self, input: T): ...
static_assert(not is_subtype_of(Contravariant[Any], Contravariant[Any]))
static_assert(not is_subtype_of(Contravariant[Any], Contravariant[int]))
static_assert(not is_subtype_of(Contravariant[int], Contravariant[Any]))
static_assert(not is_subtype_of(Contravariant[Any], Contravariant[object]))
static_assert(is_subtype_of(Contravariant[object], Contravariant[Any]))
class Invariant[T]:
mutable_attribute: T
static_assert(not is_subtype_of(Invariant[Any], Invariant[Any]))
static_assert(not is_subtype_of(Invariant[Any], Invariant[int]))
static_assert(not is_subtype_of(Invariant[int], Invariant[Any]))
static_assert(not is_subtype_of(Invariant[Any], Invariant[object]))
static_assert(not is_subtype_of(Invariant[object], Invariant[Any]))
class Bivariant[T]: ...
static_assert(is_subtype_of(Bivariant[Any], Bivariant[Any]))
static_assert(is_subtype_of(Bivariant[Any], Bivariant[int]))
static_assert(is_subtype_of(Bivariant[int], Bivariant[Any]))
static_assert(is_subtype_of(Bivariant[Any], Bivariant[object]))
static_assert(is_subtype_of(Bivariant[object], Bivariant[Any]))
```
The same for `Unknown`: