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.