diff --git a/mypy/meet.py b/mypy/meet.py index 3446783c9f0a..2e01116e6d73 100644 --- a/mypy/meet.py +++ b/mypy/meet.py @@ -339,9 +339,9 @@ def _type_object_overlap(left: Type, right: Type) -> bool: # Or, to use a more concrete example, List[Union[A, B]] and List[Union[B, C]] # would be considered partially overlapping since it's possible for both lists # to contain only instances of B at runtime. - for left_arg, right_arg in zip(left.args, right.args): - if _is_overlapping_types(left_arg, right_arg): - return True + if all(_is_overlapping_types(left_arg, right_arg) + for left_arg, right_arg in zip(left.args, right.args)): + return True return False diff --git a/test-data/unit/check-overloading.test b/test-data/unit/check-overloading.test index 959983db4495..05db459d78b1 100644 --- a/test-data/unit/check-overloading.test +++ b/test-data/unit/check-overloading.test @@ -5151,3 +5151,25 @@ compose(ID, fakeint)("test") reveal_type(compose(ID, fakeint)) # N: Revealed type is 'def (Union[builtins.str, builtins.bytes]) -> __main__.ID*' [builtins fixtures/tuple.pyi] + +[case testOverloadTwoTypeArgs] +from typing import Generic, overload, TypeVar, Any + +T1 = TypeVar("T1") +T2 = TypeVar("T2") + +class A: ... +class B: ... +class G(Generic[T1, T2]): ... + +@overload +def f1(g: G[A, A]) -> A: ... +@overload +def f1(g: G[A, B]) -> B: ... +def f1(g: Any) -> Any: ... + +@overload +def f2(g: G[A, Any]) -> A: ... # E: Overloaded function signatures 1 and 2 overlap with incompatible return types +@overload +def f2(g: G[A, B], x: int = ...) -> B: ... +def f2(g: Any, x: int = ...) -> Any: ...