@@ -344,19 +344,67 @@ match x:
344344 case [str()]:
345345 pass
346346
347- [case testMatchSequencePatternWithInvalidClassPattern]
347+ [case testMatchSequencePatternWithTypeObjectClassPattern]
348+ # flags: --strict-equality --warn-unreachable
348349class Example:
349350 __match_args__ = ("value",)
350351 def __init__(self, value: str) -> None:
351352 self.value = value
352353
353- SubClass: type[Example]
354+ def f1(subclass: type[Example]) -> None:
355+ match subclass("a"):
356+ case Example(value):
357+ reveal_type(value) # N: Revealed type is "builtins.str"
358+ case anything:
359+ reveal_type(anything) # E: Statement is unreachable
360+
361+ def f2(subclass: type[Example]) -> None:
362+ match Example("a"):
363+ case subclass(value):
364+ reveal_type(value) # N: Revealed type is "builtins.str"
365+ case anything:
366+ reveal_type(anything) # N: Revealed type is "__main__.Example"
367+
368+ def f3(subclass: type[Example]) -> None:
369+ match subclass("a"):
370+ case subclass(value):
371+ reveal_type(value) # N: Revealed type is "builtins.str"
372+ case anything:
373+ reveal_type(anything) # N: Revealed type is "__main__.Example"
374+
375+ def f4(subclass: type[Example]) -> None:
376+ match [subclass("a"), subclass("b")]:
377+ case [subclass(value), *rest]:
378+ reveal_type(value) # N: Revealed type is "builtins.str"
379+ reveal_type(rest) # N: Revealed type is "builtins.list[__main__.Example]"
380+ case anything:
381+ reveal_type(anything) # N: Revealed type is "builtins.list[__main__.Example]"
382+
383+ class Example2:
384+ __match_args__ = ("value",)
385+ def __init__(self, value: str) -> None:
386+ self.value = value
354387
355- match [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"
359- reveal_type(rest) # N: Revealed type is "builtins.list[__main__.Example]"
388+ def f5(T: type[Example | Example2]) -> None:
389+ match T("a"):
390+ case Example(value):
391+ reveal_type(value) # N: Revealed type is "builtins.str"
392+ case anything:
393+ reveal_type(anything) # N: Revealed type is "__main__.Example2"
394+
395+ def f6(T: type[Example | Example2]) -> None:
396+ match Example("a"):
397+ case T(value): # E: Expected type in class pattern; found "type[__main__.Example] | type[__main__.Example2]"
398+ reveal_type(value) # E: Statement is unreachable
399+ case anything:
400+ reveal_type(anything) # N: Revealed type is "__main__.Example"
401+
402+ def f7(T: type[Example | Example2]) -> None:
403+ match T("a"):
404+ case T(value): # E: Expected type in class pattern; found "type[__main__.Example] | type[__main__.Example2]"
405+ reveal_type(value) # E: Statement is unreachable
406+ case anything:
407+ reveal_type(anything) # N: Revealed type is "__main__.Example | __main__.Example2"
360408[builtins fixtures/tuple.pyi]
361409
362410# Narrowing union-based values via a literal pattern on an indexed/attribute subject
0 commit comments