combine the two rules

This commit is contained in:
Alex Waygood
2025-07-11 13:28:37 +01:00
parent 78e51e8601
commit 59570beb57
17 changed files with 220 additions and 245 deletions

View File

@@ -37,8 +37,8 @@ reveal_type(b**b) # revealed: Literal[1]
# Division
reveal_type(a / a) # revealed: float
reveal_type(b / a) # revealed: float
b / b # error: [division-by-zero] "Cannot divide object of type `Literal[False]` by zero"
a / b # error: [division-by-zero] "Cannot divide object of type `Literal[True]` by zero"
b / b # error: [literal-math-error] "Cannot divide object of type `Literal[False]` by zero"
a / b # error: [literal-math-error] "Cannot divide object of type `Literal[True]` by zero"
# bitwise OR
reveal_type(a | a) # revealed: Literal[True]

View File

@@ -135,9 +135,9 @@ reveal_type(int() / 0) # revealed: int | float
# error: "Cannot divide object of type `Literal[1]` by zero"
reveal_type(1 / False) # revealed: float
# error: [division-by-zero] "Cannot divide object of type `Literal[True]` by zero"
# error: [literal-math-error] "Cannot divide object of type `Literal[True]` by zero"
True / False
# error: [division-by-zero] "Cannot divide object of type `Literal[True]` by zero"
# error: [literal-math-error] "Cannot divide object of type `Literal[True]` by zero"
bool(1) / False
# error: "Cannot divide object of type `float` by zero"
@@ -176,20 +176,21 @@ reveal_type(0 >> 100) # revealed: Literal[0]
reveal_type(-42 >> 100) # revealed: Literal[-1]
```
It is an error to shift by a negative value. This is handled similarly to `division-by-zero`, above:
It is an error to shift by a negative value. This is handled similarly to `ZeroDivisionError`
detection, above:
```py
# error: [negative-shift] "Cannot left shift object of type `Literal[42]` by a negative value"
# error: [literal-math-error] "Cannot left shift object of type `Literal[42]` by a negative value"
reveal_type(42 << -3) # revealed: int
# error: [negative-shift] "Cannot left shift object of type `Literal[0]` by a negative value"
# error: [literal-math-error]
reveal_type(0 << -3) # revealed: int
# error: [negative-shift] "Cannot left shift object of type `Literal[-42]` by a negative value"
# error: [literal-math-error]
reveal_type(-42 << -3) # revealed: int
# error: [negative-shift] "Cannot right shift object of type `Literal[42]` by a negative value"
# error: [literal-math-error] "Cannot right shift object of type `Literal[42]` by a negative value"
reveal_type(42 >> -3) # revealed: int
# error: [negative-shift] "Cannot right shift object of type `Literal[0]` by a negative value"
# error: [literal-math-error]
reveal_type(0 >> -3) # revealed: int
# error: [negative-shift] "Cannot right shift object of type `Literal[-42]` by a negative value"
# error: [literal-math-error]
reveal_type(-42 >> -3) # revealed: int
```

View File

@@ -54,6 +54,6 @@ If any of the union elements leads to a division by zero, we will report an erro
```py
def f5(m: int, n: Literal[-1, 0, 1]):
# error: [division-by-zero] "Cannot divide object of type `int` by zero"
# error: [literal-math-error] "Cannot divide object of type `int` by zero"
return m / n
```