fix @intToFloat on comptime_floats

This commit is contained in:
Vexu 2020-05-12 00:24:09 +03:00
parent 3e3c651b67
commit 0847b47bf8
No known key found for this signature in database
GPG Key ID: 59AEB8936E16A6AC
2 changed files with 16 additions and 5 deletions

View File

@ -12760,9 +12760,7 @@ static bool eval_const_expr_implicit_cast(IrAnalyze *ira, IrInst *source_instr,
const_val->type = new_type;
break;
case CastOpIntToFloat:
{
assert(new_type->id == ZigTypeIdFloat);
if (new_type->id == ZigTypeIdFloat) {
BigFloat bigfloat;
bigfloat_init_bigint(&bigfloat, &other_val->data.x_bigint);
switch (new_type->data.floating.bit_count) {
@ -12783,9 +12781,13 @@ static bool eval_const_expr_implicit_cast(IrAnalyze *ira, IrInst *source_instr,
default:
zig_unreachable();
}
const_val->special = ConstValSpecialStatic;
break;
} else if (new_type->id == ZigTypeIdComptimeFloat) {
bigfloat_init_bigint(&const_val->data.x_bigfloat, &other_val->data.x_bigint);
} else {
zig_unreachable();
}
const_val->special = ConstValSpecialStatic;
break;
case CastOpFloatToInt:
float_init_bigint(&const_val->data.x_bigint, other_val);
if (new_type->id == ZigTypeIdInt) {

View File

@ -827,3 +827,12 @@ test "peer type resolve array pointer and unknown pointer" {
comptime expect(@TypeOf(&const_array, const_ptr) == [*]const u8);
comptime expect(@TypeOf(const_ptr, &const_array) == [*]const u8);
}
test "comptime float casts" {
const a = @intToFloat(comptime_float, 1);
expect(a == 1);
expect(@TypeOf(a) == comptime_float);
const b = @floatToInt(comptime_int, 2);
expect(b == 2);
expect(@TypeOf(b) == comptime_int);
}