@@ -499,35 +499,38 @@ g(**m) # E: Argument 1 to "g" has incompatible type "**Mapping[str, object]"; e
499499[builtins fixtures/dict.pyi]
500500
501501[case testTupleExpressionWithUnionStarArgs]
502- from typing import Union, List, Set, Tuple
502+ from typing import Union, List, Set, Tuple, Unpack
503503
504504class A: pass
505505class B: pass
506506class C: pass
507507class D: pass
508508
509- # union of two fixed size types
510- def test_fixed_size_union () -> None:
509+
510+ def test_union_same_size_tuple () -> None:
511511 # same size tuples
512512 x1: Union[tuple[A, B], tuple[None, None]]
513- x2: Union[tuple[A, B], tuple[None, *tuple[None]]]
514- x3: Union[tuple[A, B], tuple[None, None, *tuple[()]]]
515- # different size tuples
516- y1: Union[tuple[A, B], tuple[None, None, None]]
517- y2: Union[tuple[A, B], tuple[None]]
513+ x2: Union[tuple[A, B], tuple[None, Unpack[tuple[None]]]]
514+ x3: Union[tuple[A, B], tuple[None, None, Unpack[tuple[()]]]]
518515 reveal_type( (*x1,) ) # N: Revealed type is "tuple[Union[__main__.A, None], Union[__main__.B, None]]"
519516 reveal_type( (*x2,) ) # N: Revealed type is "tuple[Union[__main__.A, None], Union[__main__.B, None]]"
520517 reveal_type( (*x3,) ) # N: Revealed type is "tuple[Union[__main__.A, None], Union[__main__.B, None]]"
518+
519+ def test_union_different_size_tuple() -> None:
520+ y1: Union[tuple[A, B], tuple[None, None, None]]
521+ y2: Union[tuple[A, B], tuple[None]]
522+ y3: Union[tuple[A, B], tuple[None, None, None, Unpack[tuple[()]]]]
521523 reveal_type( (*y1,) ) # N: Revealed type is "builtins.tuple[Union[__main__.A, __main__.B, None], ...]"
522524 reveal_type( (*y2,) ) # N: Revealed type is "builtins.tuple[Union[__main__.A, __main__.B, None], ...]"
525+ reveal_type( (*y2,) ) # N: Revealed type is "builtins.tuple[Union[__main__.A, __main__.B, None], ...]"
523526
524- # union of mixed and variable size types
525- def test_mixed_variable_size_union() -> None:
527+ def test_union_fixed_size_and_variadic_tuple() -> None:
526528 z1: Union[tuple[A, B, C], tuple[None, ...]]
529+ z2: Union[tuple[A, B, C], tuple[None, Unpack[tuple[None, ...]], None]]
527530 reveal_type( (*z1,) ) # N: Revealed type is "builtins.tuple[Union[__main__.A, __main__.B, __main__.C, None], ...]"
531+ reveal_type( (*z2,) ) # N: Revealed type is "builtins.tuple[Union[__main__.A, __main__.B, __main__.C, None], ...]"
528532
529- # union of two variable size types
530- def test_variable_size_union() -> None:
533+ def test_union_variable_size_tuples() -> None:
531534 # same + subtype
532535 tt1: Union[Tuple[Union[A, None], ...], Tuple[A, ...]]
533536 ll1: Union[List[Union[A, None]], List[A]]
@@ -561,35 +564,37 @@ def test_variable_size_union() -> None:
561564
562565
563566[case testListExpressionWithUnionStarArgs]
564- from typing import Union, List, Set, Tuple
567+ from typing import Union, List, Set, Tuple, Unpack
565568
566569class A: pass
567570class B: pass
568571class C: pass
569572class D: pass
570573
571- # union of two fixed size types
572- def test_fixed_size_union() -> None:
574+ def test_union_same_size_tuple() -> None:
573575 # same size tuples
574- x1: Union[tuple[A, B], tuple[None, None, None]]
575- x2: Union[tuple[A, B], tuple[None, *tuple[None], None]]
576- x3: Union[tuple[A, B], tuple[None, None, None, *tuple[()]]]
577- # different size tuples
576+ x1: Union[tuple[A, B], tuple[None, None]]
577+ x2: Union[tuple[A, B], tuple[None, Unpack[tuple[None]]]]
578+ x3: Union[tuple[A, B], tuple[None, None, Unpack[tuple[()]]]]
579+ reveal_type( [*x1] ) # N: Revealed type is "builtins.list[Union[__main__.A, None, __main__.B]]"
580+ reveal_type( [*x2] ) # N: Revealed type is "builtins.list[Union[__main__.A, None, __main__.B]]"
581+ reveal_type( [*x3] ) # N: Revealed type is "builtins.list[Union[__main__.A, None, __main__.B]]"
582+
583+ def test_union_different_size_tuple() -> None:
578584 y1: Union[tuple[A, B], tuple[None, None, None]]
579585 y2: Union[tuple[A, B], tuple[None]]
580- reveal_type( [*x1] ) # N: Revealed type is "builtins.list[Union[__main__.A, __main__.B, None]]"
581- reveal_type( [*x2] ) # N: Revealed type is "builtins.list[Union[__main__.A, __main__.B, None]]"
582- reveal_type( [*x3] ) # N: Revealed type is "builtins.list[Union[__main__.A, __main__.B, None]]"
586+ y3: Union[tuple[A, B], tuple[None, None, None, Unpack[tuple[()]]]]
583587 reveal_type( [*y1] ) # N: Revealed type is "builtins.list[Union[__main__.A, __main__.B, None]]"
584588 reveal_type( [*y2] ) # N: Revealed type is "builtins.list[Union[__main__.A, __main__.B, None]]"
589+ reveal_type( [*y2] ) # N: Revealed type is "builtins.list[Union[__main__.A, __main__.B, None]]"
585590
586- # union of mixed and variable size types
587- def test_mixed_variable_size_union() -> None:
591+ def test_union_fixed_size_and_variadic_tuple() -> None:
588592 z1: Union[tuple[A, B, C], tuple[None, ...]]
593+ z2: Union[tuple[A, B, C], tuple[None, Unpack[tuple[None, ...]], None]]
589594 reveal_type( [*z1] ) # N: Revealed type is "builtins.list[Union[__main__.A, __main__.B, __main__.C, None]]"
595+ reveal_type( [*z2] ) # N: Revealed type is "builtins.list[Union[__main__.A, __main__.B, __main__.C, None]]"
590596
591- # union of two variable size types
592- def test_variable_size_union() -> None:
597+ def test_union_variable_size_tuples() -> None:
593598 # same + subtype
594599 tt1: Union[Tuple[Union[A, None], ...], Tuple[A, ...]]
595600 ll1: Union[List[Union[A, None]], List[A]]
@@ -623,35 +628,37 @@ def test_variable_size_union() -> None:
623628
624629
625630[case testSetExpressionWithUnionStarArgs]
626- from typing import Union, List, Set, Tuple
631+ from typing import Union, List, Set, Tuple, Unpack
627632
628633class A: pass
629634class B: pass
630635class C: pass
631636class D: pass
632637
633- # union of two fixed size types
634- def test_fixed_size_union() -> None:
638+ def test_union_same_size_tuple() -> None:
635639 # same size tuples
636- x1: Union[tuple[A, B], tuple[None, None, None]]
637- x2: Union[tuple[A, B], tuple[None, *tuple[None], None]]
638- x3: Union[tuple[A, B], tuple[None, None, None, *tuple[()]]]
639- # different size tuples
640+ x1: Union[tuple[A, B], tuple[None, None]]
641+ x2: Union[tuple[A, B], tuple[None, Unpack[tuple[None]]]]
642+ x3: Union[tuple[A, B], tuple[None, None, Unpack[tuple[()]]]]
643+ reveal_type( {*x1} ) # N: Revealed type is "builtins.set[Union[__main__.A, None, __main__.B]]"
644+ reveal_type( {*x2} ) # N: Revealed type is "builtins.set[Union[__main__.A, None, __main__.B]]"
645+ reveal_type( {*x3} ) # N: Revealed type is "builtins.set[Union[__main__.A, None, __main__.B]]"
646+
647+ def test_union_different_size_tuple() -> None:
640648 y1: Union[tuple[A, B], tuple[None, None, None]]
641649 y2: Union[tuple[A, B], tuple[None]]
642- reveal_type( {*x1} ) # N: Revealed type is "builtins.set[Union[__main__.A, __main__.B, None]]"
643- reveal_type( {*x2} ) # N: Revealed type is "builtins.set[Union[__main__.A, __main__.B, None]]"
644- reveal_type( {*x3} ) # N: Revealed type is "builtins.set[Union[__main__.A, __main__.B, None]]"
650+ y3: Union[tuple[A, B], tuple[None, None, None, Unpack[tuple[()]]]]
645651 reveal_type( {*y1} ) # N: Revealed type is "builtins.set[Union[__main__.A, __main__.B, None]]"
646652 reveal_type( {*y2} ) # N: Revealed type is "builtins.set[Union[__main__.A, __main__.B, None]]"
653+ reveal_type( {*y2} ) # N: Revealed type is "builtins.set[Union[__main__.A, __main__.B, None]]"
647654
648- # union of mixed and variable size types
649- def test_mixed_variable_size_union() -> None:
655+ def test_union_fixed_size_and_variadic_tuple() -> None:
650656 z1: Union[tuple[A, B, C], tuple[None, ...]]
657+ z2: Union[tuple[A, B, C], tuple[None, Unpack[tuple[None, ...]], None]]
651658 reveal_type( {*z1} ) # N: Revealed type is "builtins.set[Union[__main__.A, __main__.B, __main__.C, None]]"
659+ reveal_type( {*z2} ) # N: Revealed type is "builtins.set[Union[__main__.A, __main__.B, __main__.C, None]]"
652660
653- # union of two variable size types
654- def test_variable_size_union() -> None:
661+ def test_union_variable_size_tuples() -> None:
655662 # same + subtype
656663 tt1: Union[Tuple[Union[A, None], ...], Tuple[A, ...]]
657664 ll1: Union[List[Union[A, None]], List[A]]
0 commit comments