aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorLemonBoy <thatlemon@gmail.com>2019-04-16 16:57:49 +0200
committerLemonBoy <thatlemon@gmail.com>2019-04-19 11:50:30 +0200
commit1fda44cbc85a61da048017b0820ab82d1a9817df (patch)
tree5c719e5adaac745322a122662d692e6a3e387796 /src
parent3b6a4fe4cd0800b7078953d56156475f699751f1 (diff)
downloadzig-1fda44cbc85a61da048017b0820ab82d1a9817df.tar.gz
zig-1fda44cbc85a61da048017b0820ab82d1a9817df.zip
translate-c: support conversion to/from fp types
Diffstat (limited to 'src')
-rw-r--r--src/translate_c.cpp22
1 files changed, 17 insertions, 5 deletions
diff --git a/src/translate_c.cpp b/src/translate_c.cpp
index 43783cf1c0..e466e9d56e 100644
--- a/src/translate_c.cpp
+++ b/src/translate_c.cpp
@@ -1915,17 +1915,29 @@ static AstNode *trans_implicit_cast_expr(Context *c, ResultUsed result_used, Tra
emit_warning(c, bitcast(stmt->getBeginLoc()), "TODO handle C CK_IntegralToBoolean");
return nullptr;
case ZigClangCK_IntegralToFloating:
- emit_warning(c, bitcast(stmt->getBeginLoc()), "TODO handle C CK_IntegralToFloating");
- return nullptr;
+ case ZigClangCK_FloatingToIntegral:
+ {
+ AstNode *target_node = trans_expr(c, ResultUsedYes, scope, bitcast(stmt->getSubExpr()), TransRValue);
+ if (target_node == nullptr)
+ return nullptr;
+
+ AstNode *dest_type_node = get_expr_type(c, (const ZigClangExpr *)stmt);
+ if (dest_type_node == nullptr)
+ return nullptr;
+
+ const bool int_to_float = (ZigClangCK)stmt->getCastKind() == ZigClangCK_IntegralToFloating;
+ const char *fn = int_to_float ? "intToFloat" : "floatToInt";
+ AstNode *node = trans_create_node_builtin_fn_call_str(c, fn);
+ node->data.fn_call_expr.params.append(dest_type_node);
+ node->data.fn_call_expr.params.append(target_node);
+ return maybe_suppress_result(c, result_used, node);
+ }
case ZigClangCK_FixedPointCast:
emit_warning(c, bitcast(stmt->getBeginLoc()), "TODO handle C CK_FixedPointCast");
return nullptr;
case ZigClangCK_FixedPointToBoolean:
emit_warning(c, bitcast(stmt->getBeginLoc()), "TODO handle C CK_FixedPointToBoolean");
return nullptr;
- case ZigClangCK_FloatingToIntegral:
- emit_warning(c, bitcast(stmt->getBeginLoc()), "TODO handle C CK_FloatingToIntegral");
- return nullptr;
case ZigClangCK_FloatingToBoolean:
emit_warning(c, bitcast(stmt->getBeginLoc()), "TODO handle C CK_FloatingToBoolean");
return nullptr;