Fix division-by-zero checks on a /= 0 and b /= 0f #2558.

This commit is contained in:
Christoffer Lerno
2025-11-03 16:47:57 +01:00
parent 9b05dfdef1
commit 791cbbfb62
3 changed files with 16 additions and 2 deletions

View File

@@ -11,6 +11,7 @@
### Fixes
- `Foo.is_eq` would return false if the type was a `typedef` and had an overload, but the underlying type was not comparable.
- Remove division-by-zero checks for floating point in safe mode #2556.
- Fix division-by-zero checks on `a /= 0` and `b /= 0f` #2558.
### Stdlib changes

View File

@@ -7326,10 +7326,9 @@ BITSTRUCT_OK:
switch (right->const_expr.const_kind)
{
case CONST_INTEGER:
if (int_is_zero(right->const_expr.ixx)) RETURN_SEMA_ERROR(right, operator == BINARYOP_MOD_ASSIGN ? "% by zero not allowed." : "Division by zero not allowed.");
if (int_is_zero(right->const_expr.ixx)) RETURN_SEMA_ERROR(right, operator == BINARYOP_MOD_ASSIGN ? "%% by zero not allowed." : "Division by zero not allowed.");
break;
case CONST_FLOAT:
if (right->const_expr.fxx.f == 0) RETURN_SEMA_ERROR(right, operator == BINARYOP_MOD_ASSIGN ? "% by zero not allowed." : "% by zero not allowed.");
break;
default:
break;

View File

@@ -0,0 +1,14 @@
module test;
struct Foo
{
float val;
int ival;
}
fn int main()
{
Foo bar;
bar.val /= 0f;
bar.ival /= 0; // #error: Division by zero not allowed
return 0;
}