diff options
| author | LemonBoy <thatlemon@gmail.com> | 2019-04-16 16:57:49 +0200 |
|---|---|---|
| committer | LemonBoy <thatlemon@gmail.com> | 2019-04-19 11:50:30 +0200 |
| commit | 1fda44cbc85a61da048017b0820ab82d1a9817df (patch) | |
| tree | 5c719e5adaac745322a122662d692e6a3e387796 /src | |
| parent | 3b6a4fe4cd0800b7078953d56156475f699751f1 (diff) | |
| download | zig-1fda44cbc85a61da048017b0820ab82d1a9817df.tar.gz zig-1fda44cbc85a61da048017b0820ab82d1a9817df.zip | |
translate-c: support conversion to/from fp types
Diffstat (limited to 'src')
| -rw-r--r-- | src/translate_c.cpp | 22 |
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; |
