@@ -264,8 +264,8 @@ else:
264264
265265if x.key is Key.D:
266266 # TODO: this should narrow to Never
267- reveal_type(x) # E: Statement is unreachable \
268- # N: Revealed type is "Union[__main__.Object1, __main__.Object2] "
267+ reveal_type(x) # E: Statement is unreachable \
268+ # N: Revealed type is "Never "
269269else:
270270 reveal_type(x) # N: Revealed type is "Union[__main__.Object1, __main__.Object2]"
271271[builtins fixtures/tuple.pyi]
@@ -291,8 +291,8 @@ else:
291291 reveal_type(x) # N: Revealed type is "Union[TypedDict('__main__.TypedDict1', {'key': Union[Literal['A'], Literal['C']]}), TypedDict('__main__.TypedDict2', {'key': Union[Literal['B'], Literal['C']]})]"
292292
293293if x['key'] == 'D':
294- reveal_type(x) # E: Statement is unreachable \
295- # N: Revealed type is "Union[TypedDict('__main__.TypedDict1', {'key': Union[Literal['A'], Literal['C']]}), TypedDict('__main__.TypedDict2', {'key': Union[Literal['B'], Literal['C']]})] "
294+ reveal_type(x) # E: Statement is unreachable \
295+ # N: Revealed type is "Never "
296296else:
297297 reveal_type(x) # N: Revealed type is "Union[TypedDict('__main__.TypedDict1', {'key': Union[Literal['A'], Literal['C']]}), TypedDict('__main__.TypedDict2', {'key': Union[Literal['B'], Literal['C']]})]"
298298[builtins fixtures/primitives.pyi]
@@ -319,8 +319,8 @@ else:
319319 reveal_type(x) # N: Revealed type is "Union[TypedDict('__main__.TypedDict1', {'key'?: Union[Literal['A'], Literal['C']]}), TypedDict('__main__.TypedDict2', {'key'?: Union[Literal['B'], Literal['C']]})]"
320320
321321if x['key'] == 'D':
322- reveal_type(x) # E: Statement is unreachable \
323- # N: Revealed type is "Union[TypedDict('__main__.TypedDict1', {'key'?: Union[Literal['A'], Literal['C']]}), TypedDict('__main__.TypedDict2', {'key'?: Union[Literal['B'], Literal['C']]})] "
322+ reveal_type(x) # E: Statement is unreachable \
323+ # N: Revealed type is "Never "
324324else:
325325 reveal_type(x) # N: Revealed type is "Union[TypedDict('__main__.TypedDict1', {'key'?: Union[Literal['A'], Literal['C']]}), TypedDict('__main__.TypedDict2', {'key'?: Union[Literal['B'], Literal['C']]})]"
326326[builtins fixtures/primitives.pyi]
@@ -611,8 +611,8 @@ else:
611611y: Union[Parent1, Parent2]
612612if y["model"]["key"] is Key.C:
613613 reveal_type(y) # E: Statement is unreachable \
614- # N: Revealed type is "Union[TypedDict('__main__.Parent1', {'model': TypedDict('__main__.Model1', {'key': Literal[__main__.Key.A]}), 'foo': builtins.int}), TypedDict('__main__.Parent2', {'model': TypedDict('__main__.Model2', {'key': Literal[__main__.Key.B]}), 'bar': builtins.str})] "
615- reveal_type(y["model"]) # N: Revealed type is "Union[TypedDict('__main__.Model1', {'key': Literal[__main__.Key.A]}), TypedDict('__main__.Model2', {'key': Literal[__main__.Key.B]})] "
614+ # N: Revealed type is "Never "
615+ reveal_type(y["model"]) # N: Revealed type is "Never "
616616else:
617617 reveal_type(y) # N: Revealed type is "Union[TypedDict('__main__.Parent1', {'model': TypedDict('__main__.Model1', {'key': Literal[__main__.Key.A]}), 'foo': builtins.int}), TypedDict('__main__.Parent2', {'model': TypedDict('__main__.Model2', {'key': Literal[__main__.Key.B]}), 'bar': builtins.str})]"
618618 reveal_type(y["model"]) # N: Revealed type is "Union[TypedDict('__main__.Model1', {'key': Literal[__main__.Key.A]}), TypedDict('__main__.Model2', {'key': Literal[__main__.Key.B]})]"
@@ -648,8 +648,8 @@ else:
648648y: Union[Parent1, Parent2]
649649if y["model"]["key"] == 'C':
650650 reveal_type(y) # E: Statement is unreachable \
651- # N: Revealed type is "Union[TypedDict('__main__.Parent1', {'model': TypedDict('__main__.Model1', {'key': Literal['A']}), 'foo': builtins.int}), TypedDict('__main__.Parent2', {'model': TypedDict('__main__.Model2', {'key': Literal['B']}), 'bar': builtins.str})] "
652- reveal_type(y["model"]) # N: Revealed type is "Union[TypedDict('__main__.Model1', {'key': Literal['A']}), TypedDict('__main__.Model2', {'key': Literal['B']})] "
651+ # N: Revealed type is "Never "
652+ reveal_type(y["model"]) # N: Revealed type is "Never "
653653else:
654654 reveal_type(y) # N: Revealed type is "Union[TypedDict('__main__.Parent1', {'model': TypedDict('__main__.Model1', {'key': Literal['A']}), 'foo': builtins.int}), TypedDict('__main__.Parent2', {'model': TypedDict('__main__.Model2', {'key': Literal['B']}), 'bar': builtins.str})]"
655655 reveal_type(y["model"]) # N: Revealed type is "Union[TypedDict('__main__.Model1', {'key': Literal['A']}), TypedDict('__main__.Model2', {'key': Literal['B']})]"
@@ -2445,3 +2445,16 @@ def foo(x: T) -> T:
24452445 reveal_type(x) # N: Revealed type is "T`-1"
24462446 return x
24472447[builtins fixtures/isinstance.pyi]
2448+
2449+ [case testNarrowingToClassWithNeverProperty]
2450+ # flags: --warn-unreachable
2451+ from typing import Never
2452+
2453+ class X:
2454+ a: Never
2455+
2456+ x: X
2457+ if x.a is 5:
2458+ reveal_type(x) # N: Revealed type is "__main__.X"
2459+ else:
2460+ reveal_type(x) # N: Revealed type is "__main__.X"
0 commit comments