authorgravatar for thatlemon@gmail.comLemonBoy <thatlemon@gmail.com> 2019-04-16 23:09:46+02:00
committergravatar for thatlemon@gmail.comLemonBoy <thatlemon@gmail.com> 2019-04-22 22:16:29+02:00
logd3dd49c403fb42d003dd2ee6d7917d9ebb7c2569
treef4069d24e5d0fe5452e888823d3f8819a1f64866
parent19b8278f91caaa25f05fe4dd7f51fdd1f0780e1e

translate-c: Support for integer to boolean conversions


1 files changed, 17 insertions(+), 2 deletions(-)

src/translate_c.cpp+17-2
......@@ -1944,8 +1944,23 @@ static AstNode *trans_implicit_cast_expr(Context *c, ResultUsed result_used, Tra
19441944 emit_warning(c, bitcast(stmt->getBeginLoc()), "TODO handle C CK_VectorSplat");
19451945 return nullptr;
19461946 case ZigClangCK_IntegralToBoolean:
1947 emit_warning(c, bitcast(stmt->getBeginLoc()), "TODO handle C CK_IntegralToBoolean");
1948 return nullptr;
1947 {
1948 const clang::Expr *expr = stmt->getSubExpr();
1949
1950 bool expr_val;
1951 if (expr->EvaluateAsBooleanCondition(expr_val, *reinterpret_cast<clang::ASTContext *>(c->ctx))) {
1952 return trans_create_node_bool(c, expr_val);
1953 }
1954
1955 AstNode *val = trans_expr(c, ResultUsedYes, scope, bitcast(expr), TransRValue);
1956 if (val == nullptr)
1957 return nullptr;
1958
1959 AstNode *zero = trans_create_node_unsigned(c, 0);
1960
1961 // Translate as val != 0
1962 return trans_create_node_bin_op(c, val, BinOpTypeCmpNotEq, zero);
1963 }
19491964 case ZigClangCK_IntegralToFloating:
19501965 case ZigClangCK_FloatingToIntegral:
19511966 {