@@ -524,6 +524,46 @@ class A: pass
524524class B: pass
525525[builtins fixtures/tuple.pyi]
526526
527+ # ----------------------------------------------------------------------------
528+ # Union-in-Tuple distribution
529+ # ----------------------------------------------------------------------------
530+
531+ [case testTupleUnionDistributionSuccess]
532+ from typing import Tuple, Optional, Union
533+
534+ def f1(x: Tuple[float, Optional[float]]) -> Union[Tuple[float, float], Tuple[float, None]]:
535+ return x
536+
537+ def f2(x: Tuple[Union[int, str], float]) -> Union[Tuple[int, float], Tuple[str, float]]:
538+ return x
539+
540+ def f3(x: Tuple[int, Union[str, None]]) -> Union[Tuple[int, str], Tuple[int, None]]:
541+ return x
542+
543+ def f4(x: Tuple[Union[int, float]]) -> Union[Tuple[int], Tuple[float]]:
544+ return x
545+
546+ def f5(x: Tuple[Union[int, str], Union[bool, None]]) -> Union[
547+ Tuple[int, bool],
548+ Tuple[int, None],
549+ Tuple[str, bool],
550+ Tuple[str, None],
551+ ]:
552+ return x
553+
554+ [builtins fixtures/tuple.pyi]
555+
556+ [case testTupleUnionDistributionFail]
557+ from typing import Tuple, Optional, Union
558+
559+ def g1(x: Tuple[float, Optional[float]]) -> Union[Tuple[float, float], Tuple[str, float]]:
560+ return x # E: Incompatible return value type (got "Tuple[float, Optional[float]]", expected "Union[Tuple[float, float], Tuple[str, float]]")
561+
562+ def g2(x: Tuple[float, Optional[float]]) -> Union[Tuple[float, str], Tuple[float, None]]:
563+ return x # E: Incompatible return value type (got "Tuple[float, Optional[float]]", expected "Union[Tuple[float, str], Tuple[float, None]]")
564+
565+ [builtins fixtures/tuple.pyi]
566+
527567[case testMultipleAssignmentWithNonTupleRvalue]
528568a: A
529569b: B
@@ -1814,44 +1854,4 @@ class A: ...
18141854class tuple_aa_subclass(Tuple[A, A]): ...
18151855
18161856inst_tuple_aa_subclass: tuple_aa_subclass = tuple_aa_subclass((A(), A()))[:] # E: Incompatible types in assignment (expression has type "Tuple[A, A]", variable has type "tuple_aa_subclass")
1817- [builtins fixtures/tuple.pyi]
1818-
1819- # ----------------------------------------------------------------------------
1820- # Union-in-Tuple distribution
1821- # ----------------------------------------------------------------------------
1822-
1823- [case testTupleUnionDistributionSuccess]
1824- from typing import Tuple, Optional, Union
1825-
1826- def f1(x: Tuple[float, Optional[float]]) -> Union[Tuple[float, float], Tuple[float, None]]:
1827- return x
1828-
1829- def f2(x: Tuple[Union[int, str], float]) -> Union[Tuple[int, float], Tuple[str, float]]:
1830- return x
1831-
1832- def f3(x: Tuple[int, Union[str, None]]) -> Union[Tuple[int, str], Tuple[int, None]]:
1833- return x
1834-
1835- def f4(x: Tuple[Union[int, float]]) -> Union[Tuple[int], Tuple[float]]:
1836- return x
1837-
1838- def f5(x: Tuple[Union[int, str], Union[bool, None]]) -> Union[
1839- Tuple[int, bool],
1840- Tuple[int, None],
1841- Tuple[str, bool],
1842- Tuple[str, None],
1843- ]:
1844- return x
1845-
1846- [builtins fixtures/tuple.pyi]
1847-
1848- [case testTupleUnionDistributionFail]
1849- from typing import Tuple, Optional, Union
1850-
1851- def g1(x: Tuple[float, Optional[float]]) -> Union[Tuple[float, float], Tuple[str, float]]:
1852- return x # E: Incompatible return value type (got "Tuple[float, Optional[float]]", expected "Union[Tuple[float, float], Tuple[str, float]]")
1853-
1854- def g2(x: Tuple[float, Optional[float]]) -> Union[Tuple[float, str], Tuple[float, None]]:
1855- return x # E: Incompatible return value type (got "Tuple[float, Optional[float]]", expected "Union[Tuple[float, str], Tuple[float, None]]")
1856-
18571857[builtins fixtures/tuple.pyi]
0 commit comments