aboutsummaryrefslogtreecommitdiff
path: root/src/analyze.cpp
diff options
context:
space:
mode:
authorAndrew Kelley <superjoe30@gmail.com>2016-01-31 21:05:17 -0700
committerAndrew Kelley <superjoe30@gmail.com>2016-01-31 21:05:17 -0700
commite74a7264ad3b221dfef0c959c1fdd6275f7c70ef (patch)
tree915b1d379b4dbe803f89d26242ba1d876229a9fa /src/analyze.cpp
parent954afe5d9a5ae634f7db22641ebac6e755cdaba7 (diff)
downloadzig-e74a7264ad3b221dfef0c959c1fdd6275f7c70ef.tar.gz
zig-e74a7264ad3b221dfef0c959c1fdd6275f7c70ef.zip
support casting between int and float types
Diffstat (limited to 'src/analyze.cpp')
-rw-r--r--src/analyze.cpp26
1 files changed, 26 insertions, 0 deletions
diff --git a/src/analyze.cpp b/src/analyze.cpp
index 756f12251e..785bad9ff2 100644
--- a/src/analyze.cpp
+++ b/src/analyze.cpp
@@ -3417,6 +3417,14 @@ static void eval_const_expr_implicit_cast(CodeGen *g, AstNode *node, AstNode *ex
const_val->ok = true;
break;
}
+ case CastOpIntToFloat:
+ bignum_cast_to_float(&const_val->data.x_bignum, &other_val->data.x_bignum);
+ const_val->ok = true;
+ break;
+ case CastOpFloatToInt:
+ bignum_cast_to_int(&const_val->data.x_bignum, &other_val->data.x_bignum);
+ const_val->ok = true;
+ break;
}
}
@@ -3478,6 +3486,24 @@ static TypeTableEntry *analyze_cast_expr(CodeGen *g, ImportTableEntry *import, B
return wanted_type;
}
+ // explicit cast from int to float
+ if (wanted_type->id == TypeTableEntryIdFloat &&
+ actual_type->id == TypeTableEntryIdInt)
+ {
+ node->data.fn_call_expr.cast_op = CastOpIntToFloat;
+ eval_const_expr_implicit_cast(g, node, expr_node);
+ return wanted_type;
+ }
+
+ // explicit cast from float to int
+ if (wanted_type->id == TypeTableEntryIdInt &&
+ actual_type->id == TypeTableEntryIdFloat)
+ {
+ node->data.fn_call_expr.cast_op = CastOpFloatToInt;
+ eval_const_expr_implicit_cast(g, node, expr_node);
+ return wanted_type;
+ }
+
// explicit cast from fixed size array to unknown size array
if (wanted_type->id == TypeTableEntryIdStruct &&
wanted_type->data.structure.is_unknown_size_array &&