Skip to content

Commit 0b8fed5

Browse files
Fix single item enum match type exhaustion (python#16966)
Fixes python#14109 --------- Co-authored-by: Shantanu Jain <[email protected]>
1 parent 2fbfb60 commit 0b8fed5

File tree

2 files changed

+25
-1
lines changed

2 files changed

+25
-1
lines changed

mypy/checkpattern.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -202,7 +202,7 @@ def visit_value_pattern(self, o: ValuePattern) -> PatternType:
202202
typ = self.chk.expr_checker.accept(o.expr)
203203
typ = coerce_to_literal(typ)
204204
narrowed_type, rest_type = self.chk.conditional_types_with_intersection(
205-
current_type, [get_type_range(typ)], o, default=current_type
205+
current_type, [get_type_range(typ)], o, default=get_proper_type(typ)
206206
)
207207
if not isinstance(get_proper_type(narrowed_type), (LiteralType, UninhabitedType)):
208208
return PatternType(narrowed_type, UnionType.make_union([narrowed_type, rest_type]), {})

test-data/unit/check-python310.test

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1369,6 +1369,27 @@ match m3:
13691369
reveal_type(m3) # N: Revealed type is "Tuple[Union[builtins.int, builtins.str]]"
13701370
[builtins fixtures/tuple.pyi]
13711371

1372+
[case testMatchEnumSingleChoice]
1373+
from enum import Enum
1374+
from typing import NoReturn
1375+
1376+
def assert_never(x: NoReturn) -> None: ...
1377+
1378+
class Medal(Enum):
1379+
gold = 1
1380+
1381+
def f(m: Medal) -> None:
1382+
always_assigned: int | None = None
1383+
match m:
1384+
case Medal.gold:
1385+
always_assigned = 1
1386+
reveal_type(m) # N: Revealed type is "Literal[__main__.Medal.gold]"
1387+
case _:
1388+
assert_never(m)
1389+
1390+
reveal_type(always_assigned) # N: Revealed type is "builtins.int"
1391+
[builtins fixtures/bool.pyi]
1392+
13721393
[case testMatchLiteralPatternEnumNegativeNarrowing]
13731394
from enum import Enum
13741395
class Medal(Enum):
@@ -1388,10 +1409,13 @@ def f(m: Medal) -> int:
13881409
def g(m: Medal) -> int:
13891410
match m:
13901411
case Medal.gold:
1412+
reveal_type(m) # N: Revealed type is "Literal[__main__.Medal.gold]"
13911413
return 0
13921414
case Medal.silver:
1415+
reveal_type(m) # N: Revealed type is "Literal[__main__.Medal.silver]"
13931416
return 1
13941417
case Medal.bronze:
1418+
reveal_type(m) # N: Revealed type is "Literal[__main__.Medal.bronze]"
13951419
return 2
13961420

13971421
[case testMatchLiteralPatternEnumCustomEquals-skip]

0 commit comments

Comments
 (0)