diff options
| author | Andrew Kelley <superjoe30@gmail.com> | 2018-09-05 18:02:13 -0400 |
|---|---|---|
| committer | Andrew Kelley <superjoe30@gmail.com> | 2018-09-05 18:02:13 -0400 |
| commit | cc17b662e48e43d134549ae5e986abe2e7db2822 (patch) | |
| tree | 64c287ecaa26f47b05f06fee0b234c9c18ab0eb9 | |
| parent | ffb3b1576b1c02942bce89ef05eaf05fe2f026ac (diff) | |
| parent | b517bea734c0141fcda6b267a8f0de34cddc65f8 (diff) | |
| download | zig-cc17b662e48e43d134549ae5e986abe2e7db2822.tar.gz zig-cc17b662e48e43d134549ae5e986abe2e7db2822.zip | |
Merge branch 'hcff-floatToIntError'
| -rw-r--r-- | src/ir.cpp | 14 | ||||
| -rw-r--r-- | test/cases/cast.zig | 1 | ||||
| -rw-r--r-- | test/compile_errors.zig | 36 |
3 files changed, 42 insertions, 9 deletions
diff --git a/src/ir.cpp b/src/ir.cpp index 3184561ebc..8c44363bbe 100644 --- a/src/ir.cpp +++ b/src/ir.cpp @@ -18497,6 +18497,20 @@ static TypeTableEntry *ir_analyze_instruction_float_to_int(IrAnalyze *ira, IrIns if (type_is_invalid(target->value.type)) return ira->codegen->builtin_types.entry_invalid; + if (target->value.type->id == TypeTableEntryIdComptimeInt) { + IrInstruction *casted_value = ir_implicit_cast(ira, target, dest_type); + if (type_is_invalid(casted_value->value.type)) + return ira->codegen->builtin_types.entry_invalid; + ir_link_new_instruction(casted_value, &instruction->base); + return casted_value->value.type; + } + + if (target->value.type->id != TypeTableEntryIdFloat && target->value.type->id != TypeTableEntryIdComptimeFloat) { + ir_add_error(ira, instruction->target, buf_sprintf("expected float type, found '%s'", + buf_ptr(&target->value.type->name))); + return ira->codegen->builtin_types.entry_invalid; + } + IrInstruction *result = ir_resolve_cast(ira, &instruction->base, target, dest_type, CastOpFloatToInt, false); ir_link_new_instruction(result, &instruction->base); return dest_type; diff --git a/test/cases/cast.zig b/test/cases/cast.zig index 2b455ccc43..94fbda7899 100644 --- a/test/cases/cast.zig +++ b/test/cases/cast.zig @@ -356,6 +356,7 @@ fn testFloatToInts() void { expectFloatToInt(f32, 255.1, u8, 255); expectFloatToInt(f32, 127.2, i8, 127); expectFloatToInt(f32, -128.2, i8, -128); + expectFloatToInt(comptime_int, 1234, i16, 1234); } fn expectFloatToInt(comptime F: type, f: F, comptime I: type, i: I) void { diff --git a/test/compile_errors.zig b/test/compile_errors.zig index cbca4bb7e3..00fc33d122 100644 --- a/test/compile_errors.zig +++ b/test/compile_errors.zig @@ -2,6 +2,33 @@ const tests = @import("tests.zig"); pub fn addCases(cases: *tests.CompileErrorContext) void { cases.add( + "non int passed to @intToFloat", + \\export fn entry() void { + \\ const x = @intToFloat(f32, 1.1); + \\} + , + ".tmp_source.zig:2:32: error: expected int type, found 'comptime_float'", + ); + + cases.add( + "non float passed to @floatToInt", + \\export fn entry() void { + \\ const x = @floatToInt(i32, i32(54)); + \\} + , + ".tmp_source.zig:2:35: error: expected float type, found 'i32'", + ); + + cases.add( + "out of range comptime_int passed to @floatToInt", + \\export fn entry() void { + \\ const x = @floatToInt(i8, 200); + \\} + , + ".tmp_source.zig:2:31: error: integer value 200 cannot be implicitly casted to type 'i8'", + ); + + cases.add( "load too many bytes from comptime reinterpreted pointer", \\export fn entry() void { \\ const float: f32 = 5.99999999999994648725e-01; @@ -487,15 +514,6 @@ pub fn addCases(cases: *tests.CompileErrorContext) void { ); cases.add( - "non int passed to @intToFloat", - \\export fn entry() void { - \\ const x = @intToFloat(f32, 1.1); - \\} - , - ".tmp_source.zig:2:32: error: expected int type, found 'comptime_float'", - ); - - cases.add( "use implicit casts to assign null to non-nullable pointer", \\export fn entry() void { \\ var x: i32 = 1234; |
