Commit 1c1c0691cc

Andrew Kelley <superjoe30@gmail.com>
2018-02-15 05:12:51
fix crash when doing comptime float rem comptime int
closes #776
1 parent ca597e2
Changed files (2)
src
test
cases
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;
                     }
                 }
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);
+    }
+}