@@ -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
0 commit comments