mirror of
https://github.com/vlang/v.git
synced 2025-08-04 02:07:28 -04:00
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)
This commit is contained in:
parent
a5f9899ae3
commit
59d408f72c
@ -1204,8 +1204,6 @@ fn (mut g Gen) gen_plain_infix_expr(node ast.InfixExpr) {
|
|||||||
needs_cast := node.left_type.is_number() && node.right_type.is_number()
|
needs_cast := node.left_type.is_number() && node.right_type.is_number()
|
||||||
&& node.op in [.plus, .minus, .mul, .div, .mod] && !(g.pref.translated
|
&& node.op in [.plus, .minus, .mul, .div, .mod] && !(g.pref.translated
|
||||||
|| g.file.is_translated)
|
|| g.file.is_translated)
|
||||||
is_safe_div := node.op == .div && g.pref.div_by_zero_is_zero
|
|
||||||
is_safe_mod := node.op == .mod && g.pref.div_by_zero_is_zero
|
|
||||||
mut typ := node.promoted_type
|
mut typ := node.promoted_type
|
||||||
mut typ_str := g.styp(typ)
|
mut typ_str := g.styp(typ)
|
||||||
if needs_cast {
|
if needs_cast {
|
||||||
@ -1219,6 +1217,8 @@ fn (mut g Gen) gen_plain_infix_expr(node ast.InfixExpr) {
|
|||||||
typ_str = g.styp(typ)
|
typ_str = g.styp(typ)
|
||||||
g.write('(${typ_str})(')
|
g.write('(${typ_str})(')
|
||||||
}
|
}
|
||||||
|
is_safe_div := node.op == .div && g.pref.div_by_zero_is_zero && typ.is_int()
|
||||||
|
is_safe_mod := node.op == .mod && g.pref.div_by_zero_is_zero && typ.is_int()
|
||||||
if node.left_type.is_ptr() && node.left.is_auto_deref_var() && !node.right_type.is_pointer() {
|
if node.left_type.is_ptr() && node.left.is_auto_deref_var() && !node.right_type.is_pointer() {
|
||||||
g.write('*')
|
g.write('*')
|
||||||
} else if !g.inside_interface_deref && node.left is ast.Ident
|
} else if !g.inside_interface_deref && node.left is ast.Ident
|
||||||
|
@ -1,2 +1,3 @@
|
|||||||
int c = (int)(VSAFE_DIV_int(a , z));
|
int c = (int)(VSAFE_DIV_int(a , z));
|
||||||
int d = (int)(VSAFE_MOD_int(a , z));
|
int d = (int)(VSAFE_MOD_int(a , z));
|
||||||
|
f32 fc = (f32)(fa / fz);
|
||||||
|
@ -2,3 +2,6 @@ a == 42
|
|||||||
z == 0
|
z == 0
|
||||||
c == a / z == 0
|
c == a / z == 0
|
||||||
d == a % z == 42
|
d == a % z == 42
|
||||||
|
fa == 42.0
|
||||||
|
fz == 0.0
|
||||||
|
fc == fa / fz == +inf
|
||||||
|
6
vlib/v/gen/c/testdata/div_by_zero_is_zero.vv
vendored
6
vlib/v/gen/c/testdata/div_by_zero_is_zero.vv
vendored
@ -7,3 +7,9 @@ println('a == ${a}')
|
|||||||
println('z == ${z}')
|
println('z == ${z}')
|
||||||
println('c == a / z == ${c}')
|
println('c == a / z == ${c}')
|
||||||
println('d == a % z == ${d}')
|
println('d == a % z == ${d}')
|
||||||
|
fa := f32(42)
|
||||||
|
fz := f32(0)
|
||||||
|
fc := fa / fz
|
||||||
|
println('fa == ${fa}')
|
||||||
|
println('fz == ${fz}')
|
||||||
|
println('fc == fa / fz == ${fc}')
|
||||||
|
Loading…
x
Reference in New Issue
Block a user