Skip to content

Commit 31f70d7

Browse files
authored
Fix narrow for walrus expressions used in match statements (#14844)
Fixes #14843
1 parent da6e4a0 commit 31f70d7

File tree

2 files changed

+23
-0
lines changed

2 files changed

+23
-0
lines changed

mypy/checker.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6763,6 +6763,7 @@ def conditional_types(
67636763
def conditional_types_to_typemaps(
67646764
expr: Expression, yes_type: Type | None, no_type: Type | None
67656765
) -> tuple[TypeMap, TypeMap]:
6766+
expr = collapse_walrus(expr)
67666767
maps: list[TypeMap] = []
67676768
for typ in (yes_type, no_type):
67686769
proper_type = get_proper_type(typ)

test-data/unit/check-python310.test

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1841,3 +1841,25 @@ class D: pass
18411841
X = None | C
18421842
Y = None | D
18431843
[builtins fixtures/type.pyi]
1844+
1845+
[case testMatchStatementWalrus]
1846+
class A:
1847+
a = 1
1848+
1849+
def returns_a_or_none() -> A | None:
1850+
return A()
1851+
1852+
def returns_a() -> A:
1853+
return A()
1854+
1855+
def f() -> None:
1856+
match x := returns_a_or_none():
1857+
case A():
1858+
reveal_type(x.a) # N: Revealed type is "builtins.int"
1859+
match x := returns_a():
1860+
case A():
1861+
reveal_type(x.a) # N: Revealed type is "builtins.int"
1862+
y = returns_a_or_none()
1863+
match y:
1864+
case A():
1865+
reveal_type(y.a) # N: Revealed type is "builtins.int"

0 commit comments

Comments
 (0)