@@ -2939,10 +2939,13 @@ def switch(choice: type[T_Choice]) -> None:
29392939 match choice:
29402940 case b.One:
29412941 reveal_type(choice) # N: Revealed type is "def () -> b.One"
2942+ reveal_type(choice()) # N: Revealed type is "b.One"
29422943 case b.Two:
29432944 reveal_type(choice) # N: Revealed type is "def () -> b.Two"
2945+ reveal_type(choice()) # N: Revealed type is "b.Two"
29442946 case _:
29452947 reveal_type(choice) # N: Revealed type is "type[T_Choice`-1]"
2948+ reveal_type(choice()) # N: Revealed type is "b.One | b.Two"
29462949
29472950[file b.py]
29482951class One: ...
@@ -3235,3 +3238,76 @@ match config:
32353238 case {"a": 1, **rest}: # E: Incompatible types in capture pattern (pattern captures type "dict[str, object]", variable has type "list[int]")
32363239 ...
32373240[builtins fixtures/dict.pyi]
3241+
3242+ [case testMatchTypeNarrowing]
3243+ # flags: --warn-unreachable
3244+ import builtins
3245+ import typing
3246+ import types
3247+
3248+ def type_bare(field_type: type) -> str:
3249+ match field_type:
3250+ case builtins.int:
3251+ reveal_type(field_type) # N: Revealed type is "def () -> builtins.int"
3252+ ret = "foo"
3253+ case builtins.str:
3254+ reveal_type(field_type) # N: Revealed type is "def () -> builtins.str"
3255+ ret = "foo"
3256+ case builtins.bytes:
3257+ reveal_type(field_type) # N: Revealed type is "def () -> builtins.bytes"
3258+ ret = "foo"
3259+ case builtins.bool:
3260+ reveal_type(field_type) # N: Revealed type is "def () -> builtins.bool"
3261+ ret = "foo"
3262+ case types.NoneType:
3263+ reveal_type(field_type) # N: Revealed type is "type[None]"
3264+ ret = "foo"
3265+ case _:
3266+ reveal_type(field_type) # N: Revealed type is "builtins.type"
3267+ return "bar"
3268+ return ret
3269+
3270+ def type_any(field_type: type[typing.Any]) -> str:
3271+ match field_type:
3272+ case builtins.int:
3273+ reveal_type(field_type) # N: Revealed type is "type[Any]"
3274+ ret = "foo"
3275+ case builtins.str:
3276+ reveal_type(field_type) # N: Revealed type is "type[Any]"
3277+ ret = "foo"
3278+ case builtins.bytes:
3279+ reveal_type(field_type) # N: Revealed type is "type[Any]"
3280+ ret = "foo"
3281+ case builtins.bool:
3282+ reveal_type(field_type) # N: Revealed type is "type[Any]"
3283+ ret = "foo"
3284+ case types.NoneType:
3285+ reveal_type(field_type) # N: Revealed type is "type[None]"
3286+ ret = "foo"
3287+ case _:
3288+ reveal_type(field_type) # N: Revealed type is "type[Any]"
3289+ return "bar"
3290+ return ret
3291+
3292+ def type_object(field_type: type[object]) -> str:
3293+ match field_type:
3294+ case builtins.int:
3295+ reveal_type(field_type) # N: Revealed type is "def () -> builtins.int"
3296+ ret = "foo"
3297+ case builtins.str:
3298+ reveal_type(field_type) # N: Revealed type is "def () -> builtins.str"
3299+ ret = "foo"
3300+ case builtins.bytes:
3301+ reveal_type(field_type) # N: Revealed type is "def () -> builtins.bytes"
3302+ ret = "foo"
3303+ case builtins.bool:
3304+ reveal_type(field_type) # N: Revealed type is "def () -> builtins.bool"
3305+ ret = "foo"
3306+ case types.NoneType:
3307+ reveal_type(field_type) # N: Revealed type is "type[None]"
3308+ ret = "foo"
3309+ case _:
3310+ reveal_type(field_type) # N: Revealed type is "type[builtins.object]"
3311+ return "bar"
3312+ return ret
3313+ [builtins fixtures/dict.pyi]
0 commit comments