@@ -735,6 +735,37 @@ def test_bad_case() -> None:
735735[builtins fixtures/tuple.pyi]
736736
737737
738+ [case testStarArgsWithUnionSameTupleLengthsOverload]
739+ from typing import Union, overload
740+
741+ class A: pass
742+ class B: pass
743+ class C: pass
744+ class D: pass
745+
746+ @overload
747+ def f(a: A, b: B, c: C) -> None: ...
748+ @overload
749+ def f(a: None, b: None, c: None) -> None: ...
750+ def f(a: Union[A, None], b: Union[B, None], c: Union[C, None]) -> None: pass
751+
752+ def test_case(
753+ good: Union[tuple[A, B, C], tuple[None, None, None]],
754+ bad1: Union[tuple[None, B, C], tuple[A, None, None]],
755+ bad2: tuple[Union[A, None], Union[B, None], Union[C, None]],
756+ ) -> None:
757+ f(*good)
758+ f(*bad1) # E: Argument 1 to "f" has incompatible type "*Union[tuple[None, B, C], tuple[A, None, None]]"; expected "A" \
759+ # E: Argument 1 to "f" has incompatible type "*Union[tuple[None, B, C], tuple[A, None, None]]"; expected "B" \
760+ # E: Argument 1 to "f" has incompatible type "*Union[tuple[None, B, C], tuple[A, None, None]]"; expected "C"
761+ f(*bad2) # E: Argument 1 to "f" has incompatible type "*tuple[Optional[A], Optional[B], Optional[C]]"; expected "A" \
762+ # E: Argument 1 to "f" has incompatible type "*tuple[Optional[A], Optional[B], Optional[C]]"; expected "B" \
763+ # E: Argument 1 to "f" has incompatible type "*tuple[Optional[A], Optional[B], Optional[C]]"; expected "C"
764+
765+ [builtins fixtures/tuple.pyi]
766+
767+
768+
738769[case testStarArgsWithUnionDifferentTupleLengths]
739770from typing import Union
740771
0 commit comments