@@ -3264,15 +3264,15 @@ def bad_but_should_pass(has_key: bool, key: bool, s: tuple[bool, ...]) -> None:
32643264 reveal_type(key) # N: Revealed type is "builtins.bool"
32653265[builtins fixtures/primitives.pyi]
32663266
3267- [case testNarrowChainedComparisonMeet ]
3267+ [case testNarrowChainedComparisonMeetAndForwardPropagation ]
32683268# flags: --strict-equality --warn-unreachable
32693269from __future__ import annotations
32703270from typing import Any
32713271
32723272def f1(a: str | None, b: str | None) -> None:
32733273 if None is not a == b:
32743274 reveal_type(a) # N: Revealed type is "builtins.str"
3275- reveal_type(b) # N: Revealed type is "builtins.str | None "
3275+ reveal_type(b) # N: Revealed type is "builtins.str"
32763276
32773277 if (None is not a) and (a == b):
32783278 reveal_type(a) # N: Revealed type is "builtins.str"
@@ -3290,11 +3290,33 @@ def f2(a: Any | None, b: str | None) -> None:
32903290def f3(a: str | None, b: Any | None) -> None:
32913291 if None is not a == b:
32923292 reveal_type(a) # N: Revealed type is "builtins.str"
3293- reveal_type(b) # N: Revealed type is "Any | builtins.str | None "
3293+ reveal_type(b) # N: Revealed type is "Any | builtins.str"
32943294
32953295 if (None is not a) and (a == b):
32963296 reveal_type(a) # N: Revealed type is "builtins.str"
32973297 reveal_type(b) # N: Revealed type is "Any | builtins.str"
3298+
3299+ def f4(a: str | None, b: str | None, c: str | None) -> None:
3300+ if None is not a == b == c:
3301+ reveal_type(a) # N: Revealed type is "builtins.str"
3302+ reveal_type(b) # N: Revealed type is "builtins.str"
3303+ reveal_type(c) # N: Revealed type is "builtins.str"
3304+
3305+ if (None is not a) and (a == b) and (b == c):
3306+ reveal_type(a) # N: Revealed type is "builtins.str"
3307+ reveal_type(b) # N: Revealed type is "builtins.str"
3308+ reveal_type(c) # N: Revealed type is "builtins.str"
3309+
3310+ def f5(pair: tuple[None, int] | tuple[str, str], other: str | None) -> None:
3311+ if None is not pair[0] == other:
3312+ reveal_type(pair[0]) # N: Revealed type is "builtins.str"
3313+ reveal_type(pair) # N: Revealed type is "tuple[builtins.str, builtins.str]"
3314+ reveal_type(other) # N: Revealed type is "builtins.str"
3315+
3316+ if (None is not pair[0]) and (pair[0] == other):
3317+ reveal_type(pair[0]) # N: Revealed type is "builtins.str"
3318+ reveal_type(pair) # N: Revealed type is "tuple[builtins.str, builtins.str]"
3319+ reveal_type(other) # N: Revealed type is "builtins.str"
32983320[builtins fixtures/primitives.pyi]
32993321
33003322[case testNarrowTypeObject]
0 commit comments