[ty] Fix incorrect narrowing for if type(x) == y (#22531)

This commit is contained in:
Alex Waygood
2026-01-12 12:26:47 +00:00
committed by GitHub
parent e15f88ff21
commit 5a3deee353
2 changed files with 10 additions and 5 deletions

View File

@@ -134,12 +134,17 @@ class IsEqualToEverything(type):
class A(metaclass=IsEqualToEverything): ...
class B(metaclass=IsEqualToEverything): ...
def _(x: A | B):
def _(x: A | B, y: object):
if type(x) == A:
reveal_type(x) # revealed: A | B
if type(x) != A:
reveal_type(x) # revealed: A | B
if type(y) == bool:
reveal_type(y) # revealed: object
else:
reveal_type(y) # revealed: object
```
## No narrowing for custom `type` callable

View File

@@ -1220,10 +1220,10 @@ impl<'db, 'ast> NarrowingConstraintsBuilder<'db, 'ast> {
_ => continue,
};
let is_positive = if is_positive {
op == &ast::CmpOp::Is
} else {
op == &ast::CmpOp::IsNot
let is_positive = match op {
ast::CmpOp::Is => is_positive,
ast::CmpOp::IsNot => !is_positive,
_ => continue,
};
// `else`-branch narrowing for `if type(x) is Y` can only be done