Skip to content

Commit e2fadec

Browse files
committed
Reorder branches in narrowing logic
1 parent fd8d1cd commit e2fadec

File tree

2 files changed

+22
-4
lines changed

2 files changed

+22
-4
lines changed

mypy/meet.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,10 @@ def narrow_declared_type(declared: Type, narrowed: Type) -> Type:
150150
return make_simplified_union(
151151
[narrow_declared_type(declared, x) for x in narrowed.relevant_items()]
152152
)
153+
elif isinstance(narrowed, UnionType):
154+
return make_simplified_union(
155+
[narrow_declared_type(declared, x) for x in narrowed.relevant_items()]
156+
)
153157
elif (
154158
isinstance(declared, TypeVarType)
155159
and not has_type_vars(original_narrowed)
@@ -161,10 +165,6 @@ def narrow_declared_type(declared: Type, narrowed: Type) -> Type:
161165
return UninhabitedType()
162166
else:
163167
return NoneType()
164-
elif isinstance(narrowed, UnionType):
165-
return make_simplified_union(
166-
[narrow_declared_type(declared, x) for x in narrowed.relevant_items()]
167-
)
168168
elif isinstance(narrowed, AnyType):
169169
return original_narrowed
170170
elif isinstance(narrowed, TypeVarType) and is_subtype(narrowed.upper_bound, declared):

test-data/unit/check-typeguard.test

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -777,3 +777,21 @@ def handle(model: Model) -> int:
777777
return process_model(model)
778778
return 0
779779
[builtins fixtures/tuple.pyi]
780+
781+
[case testTypeGuardRestrictTypeVarUnion]
782+
from typing import Union, TypeVar
783+
from typing_extensions import TypeGuard
784+
785+
class A:
786+
x: int
787+
class B:
788+
x: str
789+
790+
def is_b(x: object) -> TypeGuard[B]: ...
791+
792+
T = TypeVar("T")
793+
def test(x: T) -> T:
794+
if isinstance(x, A) or is_b(x):
795+
reveal_type(x.x) # N: Revealed type is "Union[builtins.int, builtins.str]"
796+
return x
797+
[builtins fixtures/isinstance.pyi]

0 commit comments

Comments
 (0)