aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Kelley <superjoe30@gmail.com>2018-09-05 18:02:13 -0400
committerAndrew Kelley <superjoe30@gmail.com>2018-09-05 18:02:13 -0400
commitcc17b662e48e43d134549ae5e986abe2e7db2822 (patch)
tree64c287ecaa26f47b05f06fee0b234c9c18ab0eb9
parentffb3b1576b1c02942bce89ef05eaf05fe2f026ac (diff)
parentb517bea734c0141fcda6b267a8f0de34cddc65f8 (diff)
downloadzig-cc17b662e48e43d134549ae5e986abe2e7db2822.tar.gz
zig-cc17b662e48e43d134549ae5e986abe2e7db2822.zip
Merge branch 'hcff-floatToIntError'
-rw-r--r--src/ir.cpp14
-rw-r--r--test/cases/cast.zig1
-rw-r--r--test/compile_errors.zig36
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;