@@ -344,7 +344,8 @@ match x:
344344 case [str()]:
345345 pass
346346
347- [case testMatchSequencePatternWithInvalidClassPattern]
347+ [case testMatchSequencePatternWithTypeObject]
348+ # flags: --strict-equality --warn-unreachable
348349class Example:
349350 __match_args__ = ("value",)
350351 def __init__(self, value: str) -> None:
@@ -353,10 +354,10 @@ class Example:
353354SubClass: type[Example]
354355
355356match [SubClass("a"), SubClass("b")]:
356- case [SubClass(value), *rest]: # E: Expected type in class pattern; found "type[__main__.Example]"
357- reveal_type(value) # E: Cannot determine type of "value" \
358- # N: Revealed type is "Any"
357+ case [SubClass(value), *rest]:
358+ reveal_type(value) # N: Revealed type is "builtins.str"
359359 reveal_type(rest) # N: Revealed type is "builtins.list[__main__.Example]"
360+
360361[builtins fixtures/tuple.pyi]
361362
362363# Narrowing union-based values via a literal pattern on an indexed/attribute subject
@@ -1257,6 +1258,84 @@ reveal_type(y) # N: Revealed type is "builtins.int"
12571258reveal_type(z) # N: Revealed type is "builtins.int"
12581259[builtins fixtures/dict-full.pyi]
12591260
1261+ [case testMatchClassPatternTypeObject]
1262+ # flags: --strict-equality --warn-unreachable
1263+ class Example:
1264+ __match_args__ = ("value",)
1265+ def __init__(self, value: str) -> None:
1266+ self.value = value
1267+
1268+ def f1(subclass: type[Example]) -> None:
1269+ match subclass("a"):
1270+ case Example(value):
1271+ reveal_type(value) # N: Revealed type is "builtins.str"
1272+ case anything:
1273+ reveal_type(anything) # E: Statement is unreachable
1274+
1275+ def f2(subclass: type[Example]) -> None:
1276+ match Example("a"):
1277+ case subclass(value):
1278+ reveal_type(value) # N: Revealed type is "builtins.str"
1279+ case anything:
1280+ reveal_type(anything) # N: Revealed type is "__main__.Example"
1281+
1282+ def f3(subclass: type[Example]) -> None:
1283+ match subclass("a"):
1284+ case subclass(value):
1285+ reveal_type(value) # N: Revealed type is "builtins.str"
1286+ case anything:
1287+ reveal_type(anything) # N: Revealed type is "__main__.Example"
1288+
1289+ class Example2:
1290+ __match_args__ = ("value",)
1291+ def __init__(self, value: str) -> None:
1292+ self.value = value
1293+
1294+ def f4(T: type[Example | Example2]) -> None:
1295+ match T("a"):
1296+ case Example(value):
1297+ reveal_type(value) # N: Revealed type is "builtins.str"
1298+ case anything:
1299+ reveal_type(anything) # N: Revealed type is "__main__.Example2"
1300+
1301+ def f5(T: type[Example | Example2]) -> None:
1302+ match Example("a"):
1303+ case T(value): # E: Expected type in class pattern; found "type[__main__.Example] | type[__main__.Example2]"
1304+ reveal_type(value) # E: Statement is unreachable
1305+ case anything:
1306+ reveal_type(anything) # N: Revealed type is "__main__.Example"
1307+
1308+ def f6(T: type[Example | Example2]) -> None:
1309+ match T("a"):
1310+ case T(value): # E: Expected type in class pattern; found "type[__main__.Example] | type[__main__.Example2]"
1311+ reveal_type(value) # E: Statement is unreachable
1312+ case anything:
1313+ reveal_type(anything) # N: Revealed type is "__main__.Example | __main__.Example2"
1314+
1315+ def f7(m: object, t: type[object]) -> None:
1316+ match m:
1317+ case t():
1318+ reveal_type(m) # N: Revealed type is "builtins.object"
1319+ case _:
1320+ reveal_type(m) # N: Revealed type is "builtins.object"
1321+ [builtins fixtures/tuple.pyi]
1322+
1323+ [case testMatchClassPatternTypeObjectGeneric]
1324+ # flags: --strict-equality --warn-unreachable
1325+ from typing import TypeVar
1326+ T = TypeVar("T")
1327+
1328+ def print_test(m: object, typ: type[T]) -> T:
1329+ match m:
1330+ case typ():
1331+ reveal_type(m) # N: Revealed type is "T`-1"
1332+ return m
1333+ case str():
1334+ reveal_type(m) # N: Revealed type is "builtins.str"
1335+ case _:
1336+ reveal_type(m) # N: Revealed type is "builtins.object"
1337+ raise
1338+
12601339[case testMatchNonFinalMatchArgs]
12611340class A:
12621341 __match_args__ = ("a", "b")
0 commit comments