From aaa0f5f82201f2f4944f73d05961731f99856420 Mon Sep 17 00:00:00 2001 From: hauntsaninja Date: Fri, 30 Jan 2026 15:19:09 -0800 Subject: [PATCH] Add tests for bytes narrowing --- mypy/checker.py | 1 - test-data/unit/check-narrowing.test | 77 +++++++++++++++++++++++++++++ 2 files changed, 77 insertions(+), 1 deletion(-) diff --git a/mypy/checker.py b/mypy/checker.py index d371f40ccaae..09f69d5a2c3b 100644 --- a/mypy/checker.py +++ b/mypy/checker.py @@ -8630,7 +8630,6 @@ def reduce_and_conditional_type_maps(ms: list[TypeMap], *, use_meet: bool) -> Ty BUILTINS_CUSTOM_EQ_CHECKS: Final = { - "builtins.bytes", "builtins.bytearray", "builtins.memoryview", "builtins.list", diff --git a/test-data/unit/check-narrowing.test b/test-data/unit/check-narrowing.test index b9bb0c1efa6a..74ddfdf9fff5 100644 --- a/test-data/unit/check-narrowing.test +++ b/test-data/unit/check-narrowing.test @@ -3389,3 +3389,80 @@ def foo(x: str | array) -> str: return result raise [builtins fixtures/tuple.pyi] + +[case testNarrowingOptionalBytes] +from __future__ import annotations +def f(x: bytes | None): + if x == b"asdf": + reveal_type(x) # N: Revealed type is "builtins.bytes" + else: + reveal_type(x) # N: Revealed type is "builtins.bytes | None" +[builtins fixtures/primitives.pyi] + +[case testNarrowingBytesLikeWithPromotion] +# flags: --strict-equality --warn-unreachable --strict-bytes +from __future__ import annotations + +def check_test(x: bytes) -> None: ... +check_test(bytearray(b"asdf")) # E: Argument 1 to "check_test" has incompatible type "bytearray"; expected "bytes" + +def main( + v_bytes: bytes, + v_bytearray: bytearray, + v_memoryview: memoryview, + v_all: bytes | bytearray | memoryview, +) -> None: + if v_bytes == v_bytearray: + reveal_type(v_bytes) # N: Revealed type is "builtins.bytes" + reveal_type(v_bytearray) # N: Revealed type is "builtins.bytearray" + if v_bytes == v_memoryview: + reveal_type(v_bytes) # N: Revealed type is "builtins.bytes" + reveal_type(v_memoryview) # N: Revealed type is "builtins.memoryview" + if v_bytearray == v_memoryview: + reveal_type(v_bytearray) # N: Revealed type is "builtins.bytearray" + reveal_type(v_memoryview) # N: Revealed type is "builtins.memoryview" + + if v_all == v_bytes: + reveal_type(v_all) # N: Revealed type is "builtins.bytes" + reveal_type(v_bytes) # N: Revealed type is "builtins.bytes" + if v_all == v_bytearray: + reveal_type(v_all) # N: Revealed type is "builtins.bytes | builtins.bytearray | builtins.memoryview" + reveal_type(v_bytearray) # N: Revealed type is "builtins.bytearray" + if v_all == v_memoryview: + reveal_type(v_all) # N: Revealed type is "builtins.bytes | builtins.bytearray | builtins.memoryview" + reveal_type(v_memoryview) # N: Revealed type is "builtins.memoryview" +[builtins fixtures/primitives.pyi] + +[case testNarrowingBytesLikeNoPromotion] +# flags: --strict-equality --warn-unreachable --no-strict-bytes +from __future__ import annotations + +def check_test(x: bytes) -> None: ... +check_test(bytearray(b"asdf")) + +def main( + v_bytes: bytes, + v_bytearray: bytearray, + v_memoryview: memoryview, + v_all: bytes | bytearray | memoryview, +) -> None: + if v_bytes == v_bytearray: + reveal_type(v_bytes) # N: Revealed type is "builtins.bytes" + reveal_type(v_bytearray) # N: Revealed type is "builtins.bytearray" + if v_bytes == v_memoryview: + reveal_type(v_bytes) # N: Revealed type is "builtins.bytes" + reveal_type(v_memoryview) # N: Revealed type is "builtins.memoryview" + if v_bytearray == v_memoryview: + reveal_type(v_bytearray) # N: Revealed type is "builtins.bytearray" + reveal_type(v_memoryview) # N: Revealed type is "builtins.memoryview" + + if v_all == v_bytes: + reveal_type(v_all) # N: Revealed type is "builtins.bytes" + reveal_type(v_bytes) # N: Revealed type is "builtins.bytes" + if v_all == v_bytearray: + reveal_type(v_all) # N: Revealed type is "builtins.bytes | builtins.bytearray | builtins.memoryview" + reveal_type(v_bytearray) # N: Revealed type is "builtins.bytearray" + if v_all == v_memoryview: + reveal_type(v_all) # N: Revealed type is "builtins.bytes | builtins.bytearray | builtins.memoryview" + reveal_type(v_memoryview) # N: Revealed type is "builtins.memoryview" +[builtins fixtures/primitives.pyi]