File tree Expand file tree Collapse file tree 3 files changed +45
-8
lines changed
Expand file tree Collapse file tree 3 files changed +45
-8
lines changed Original file line number Diff line number Diff line change @@ -8324,9 +8324,28 @@ def conditional_types(
83248324 )
83258325 for union_item in get_proper_types (proper_type .items )
83268326 ]
8327- # separate list of tuples into two lists
8328- yes_types , no_types = zip (* result )
8329- proposed_type = make_simplified_union ([t for t in yes_types if t is not None ])
8327+ yes_items : list [Type ] | None = []
8328+ no_items : list [Type ] | None = []
8329+ for union_item in proper_type .items :
8330+ yes_type , no_type = conditional_types (
8331+ union_item ,
8332+ proposed_type_ranges ,
8333+ default = union_item ,
8334+ consider_runtime_isinstance = consider_runtime_isinstance ,
8335+ consider_promotion_overlap = consider_promotion_overlap ,
8336+ )
8337+ if yes_type is None :
8338+ yes_items = None
8339+ elif yes_items is not None :
8340+ yes_items .append (yes_type )
8341+ if no_type is None :
8342+ no_items = None
8343+ elif no_items is not None :
8344+ no_items .append (no_type )
8345+
8346+ proposed_type = make_simplified_union (yes_items ) if yes_items is not None else None
8347+ remaining_type = make_simplified_union (no_items ) if no_items is not None else None
8348+ return proposed_type , remaining_type
83308349 else :
83318350 proposed_items = [type_range .item for type_range in proposed_type_ranges ]
83328351 proposed_type = make_simplified_union (proposed_items )
Original file line number Diff line number Diff line change @@ -1407,20 +1407,30 @@ def f(x: Union[A, B]) -> None:
14071407# flags: --warn-unreachable
14081408from typing import Union
14091409
1410- class FloatLike: pass
1411- class IntLike(FloatLike): pass
1412-
14131410def f1(x: Union[float, int]) -> None:
14141411 # We ignore promotions in isinstance checks
14151412 if isinstance(x, float):
14161413 reveal_type(x) # N: Revealed type is "builtins.float"
14171414 else:
14181415 reveal_type(x) # N: Revealed type is "builtins.int"
14191416
1417+ class FloatLike: pass
1418+ class IntLike(FloatLike): pass
1419+
14201420def f2(x: Union[FloatLike, IntLike]) -> None:
1421- # ...but not regular subtyping relationships
14221421 if isinstance(x, FloatLike):
1423- reveal_type(x) # N: Revealed type is "__main__.FloatLike | __main__.IntLike"
1422+ reveal_type(x) # N: Revealed type is "__main__.FloatLike"
1423+ else:
1424+ reveal_type(x) # E: Statement is unreachable
1425+
1426+ class FloatLike2: pass
1427+ class IntLike2: pass
1428+
1429+ def f3(x: Union[FloatLike2, IntLike2]) -> None:
1430+ if isinstance(x, FloatLike2):
1431+ reveal_type(x) # N: Revealed type is "__main__.FloatLike2"
1432+ else:
1433+ reveal_type(x) # N: Revealed type is "__main__.IntLike2"
14241434[builtins fixtures/isinstance.pyi]
14251435
14261436[case testIsinstanceOfSuperclass]
Original file line number Diff line number Diff line change @@ -3523,6 +3523,14 @@ def f3(number: float | int, five: Literal[5]):
35233523 reveal_type(number) # N: Revealed type is "builtins.float | Literal[5]"
35243524 reveal_type(five) # N: Revealed type is "Literal[5]"
35253525
3526+ def f8(number: float | Literal[5], five: Literal[5]):
3527+ if number == five:
3528+ reveal_type(number) # N: Revealed type is "builtins.float | Literal[5]"
3529+ reveal_type(five) # N: Revealed type is "Literal[5]"
3530+ else:
3531+ reveal_type(number) # N: Revealed type is "builtins.float"
3532+ reveal_type(five) # N: Revealed type is "Literal[5]"
3533+
35263534def f4(number: float | None, i: int):
35273535 if number == i:
35283536 reveal_type(number) # N: Revealed type is "builtins.float"
You can’t perform that action at this time.
0 commit comments