Skip to content

Commit 59d408f

Browse files
committed
v: limit -div-by-zero-is-zero influence to just the integer types (for f32 and f64, / produces a +inf or -inf value, and the program continues to run)
1 parent a5f9899 commit 59d408f

4 files changed

Lines changed: 12 additions & 2 deletions

File tree

‎vlib/v/gen/c/infix.v‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1204,8 +1204,6 @@ fn (mut g Gen) gen_plain_infix_expr(node ast.InfixExpr) {
12041204
needs_cast := node.left_type.is_number() && node.right_type.is_number()
12051205
&& node.op in [.plus, .minus, .mul, .div, .mod] && !(g.pref.translated
12061206
|| g.file.is_translated)
1207-
is_safe_div := node.op == .div && g.pref.div_by_zero_is_zero
1208-
is_safe_mod := node.op == .mod && g.pref.div_by_zero_is_zero
12091207
mut typ := node.promoted_type
12101208
mut typ_str := g.styp(typ)
12111209
if needs_cast {
@@ -1219,6 +1217,8 @@ fn (mut g Gen) gen_plain_infix_expr(node ast.InfixExpr) {
12191217
typ_str = g.styp(typ)
12201218
g.write('(${typ_str})(')
12211219
}
1220+
is_safe_div := node.op == .div && g.pref.div_by_zero_is_zero && typ.is_int()
1221+
is_safe_mod := node.op == .mod && g.pref.div_by_zero_is_zero && typ.is_int()
12221222
if node.left_type.is_ptr() && node.left.is_auto_deref_var() && !node.right_type.is_pointer() {
12231223
g.write('*')
12241224
} else if !g.inside_interface_deref && node.left is ast.Ident
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
int c = (int)(VSAFE_DIV_int(a , z));
22
int d = (int)(VSAFE_MOD_int(a , z));
3+
f32 fc = (f32)(fa / fz);

‎vlib/v/gen/c/testdata/div_by_zero_is_zero.out‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,6 @@ a == 42
22
z == 0
33
c == a / z == 0
44
d == a % z == 42
5+
fa == 42.0
6+
fz == 0.0
7+
fc == fa / fz == +inf

‎vlib/v/gen/c/testdata/div_by_zero_is_zero.vv‎

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,9 @@ println('a == ${a}')
77
println('z == ${z}')
88
println('c == a / z == ${c}')
99
println('d == a % z == ${d}')
10+
fa := f32(42)
11+
fz := f32(0)
12+
fc := fa / fz
13+
println('fa == ${fa}')
14+
println('fz == ${fz}')
15+
println('fc == fa / fz == ${fc}')

0 commit comments

Comments
 (0)