From d3dd49c403fb42d003dd2ee6d7917d9ebb7c2569 Mon Sep 17 00:00:00 2001 From: LemonBoy Date: Tue, 16 Apr 2019 23:09:46 +0200 Subject: [PATCH] translate-c: Support for integer to boolean conversions --- src/translate_c.cpp | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/src/translate_c.cpp b/src/translate_c.cpp index c0e7848c0..35e868143 100644 --- a/src/translate_c.cpp +++ b/src/translate_c.cpp @@ -1944,8 +1944,23 @@ static AstNode *trans_implicit_cast_expr(Context *c, ResultUsed result_used, Tra emit_warning(c, bitcast(stmt->getBeginLoc()), "TODO handle C CK_VectorSplat"); return nullptr; case ZigClangCK_IntegralToBoolean: - emit_warning(c, bitcast(stmt->getBeginLoc()), "TODO handle C CK_IntegralToBoolean"); - return nullptr; + { + const clang::Expr *expr = stmt->getSubExpr(); + + bool expr_val; + if (expr->EvaluateAsBooleanCondition(expr_val, *reinterpret_cast(c->ctx))) { + return trans_create_node_bool(c, expr_val); + } + + AstNode *val = trans_expr(c, ResultUsedYes, scope, bitcast(expr), TransRValue); + if (val == nullptr) + return nullptr; + + AstNode *zero = trans_create_node_unsigned(c, 0); + + // Translate as val != 0 + return trans_create_node_bin_op(c, val, BinOpTypeCmpNotEq, zero); + } case ZigClangCK_IntegralToFloating: case ZigClangCK_FloatingToIntegral: {