Reports calls to `typing.cast` where no possible value of the source type can be assignable to the target type. We can refer to this as "non overlapping" types
This usually indicates a mistake. If the conversion is intentional, first convert the expression to the common parent type to make the intent explicit.
Example:
from typing import cast
# Non-overlapping types — likely a mistake
cast(int, "a") # 'str' -> 'int'
cast(list[int], ["a"]) # 'list[str]' -> 'list[int]'
# Recommended explicit escape hatch is to use a "double cast"
cast(int, cast(object, "a")) # ok
# Legitimate overlapping cases
cast(int, object()) # a valid down cast
cast(object, 1) # a valid up cast
# While the following is an invalid cast, as list is invariant. It's not currently supported by this inspection
int_list = [1, 2, 3]
cast(list[object], int_list)
The inspection relies on static type information; when a type is unknown, no warning is reported. Variance of generic types is not yet considered.