zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

commit 1c1c0691cc4d47a39f382aec29654ae94cdf524c (tree)
parent ca597e2bfb3c39aecdf3dea2718e84deb749ed07
Author: Andrew Kelley <superjoe30@gmail.com>
Date:   Wed, 14 Feb 2018 23:12:51 -0500

fix crash when doing comptime float rem comptime int

closes #776

Diffstat:
Msrc/ir.cpp | 9++++++---
Mtest/cases/math.zig | 10++++++++--
2 files changed, 14 insertions(+), 5 deletions(-)

diff --git a/src/ir.cpp b/src/ir.cpp @@ -9975,15 +9975,18 @@ static TypeTableEntry *ir_analyze_bin_op_math(IrAnalyze *ira, IrInstructionBinOp ok = bigint_cmp(&rem_result, &mod_result) == CmpEQ; } } else { - if (float_cmp_zero(&op2->value) == CmpEQ) { + IrInstruction *casted_op2 = ir_implicit_cast(ira, op2, resolved_type); + if (casted_op2 == ira->codegen->invalid_instruction) + return ira->codegen->builtin_types.entry_invalid; + if (float_cmp_zero(&casted_op2->value) == CmpEQ) { // the division by zero error will be caught later, but we don't // have a remainder function ambiguity problem ok = true; } else { ConstExprValue rem_result; ConstExprValue mod_result; - float_rem(&rem_result, &op1->value, &op2->value); - float_mod(&mod_result, &op1->value, &op2->value); + float_rem(&rem_result, &op1->value, &casted_op2->value); + float_mod(&mod_result, &op1->value, &casted_op2->value); ok = float_cmp(&rem_result, &mod_result) == CmpEQ; } } diff --git a/test/cases/math.zig b/test/cases/math.zig @@ -394,4 +394,11 @@ fn test_f128() void { fn should_not_be_zero(x: f128) void { assert(x != 0.0); -} -\ No newline at end of file +} + +test "comptime float rem int" { + comptime { + var x = f32(1) % 2; + assert(x == 1.0); + } +}