From 19b8278f91caaa25f05fe4dd7f51fdd1f0780e1e Mon Sep 17 00:00:00 2001 From: LemonBoy Date: Tue, 16 Apr 2019 20:59:48 +0200 Subject: [PATCH] translate-c: Convert char literals --- src/translate_c.cpp | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/translate_c.cpp b/src/translate_c.cpp index b6841cbada32c3051ca72f62f29467dbcec20f70..c0e7848c094adefba422775651aa885a1f541a74 100644 --- a/src/translate_c.cpp +++ b/src/translate_c.cpp @@ -1334,6 +1334,17 @@ static AstNode *trans_floating_literal(Context *c, ResultUsed result_used, const return maybe_suppress_result(c, result_used, node); } +static AstNode *trans_character_literal(Context *c, ResultUsed result_used, const clang::CharacterLiteral *stmt) { + clang::Expr::EvalResult result; + if (!stmt->EvaluateAsInt(result, *reinterpret_cast(c->ctx))) { + emit_warning(c, bitcast(stmt->getBeginLoc()), "invalid character literal"); + return nullptr; + } + AstNode *node = trans_create_node(c, NodeTypeCharLiteral); + node->data.char_literal.value = result.Val.getInt().getExtValue(); + return maybe_suppress_result(c, result_used, node); +} + static AstNode *trans_constant_expr(Context *c, ResultUsed result_used, const clang::ConstantExpr *expr) { clang::Expr::EvalResult result; if (!expr->EvaluateAsConstantExpr(result, clang::Expr::EvaluateForCodeGen, @@ -3531,7 +3542,8 @@ static int trans_stmt_extra(Context *c, TransScope *scope, const ZigClangStmt *s emit_warning(c, ZigClangStmt_getBeginLoc(stmt), "TODO handle C ObjCBridgedCastExprClass"); return ErrorUnexpected; case ZigClangStmt_CharacterLiteralClass: - emit_warning(c, ZigClangStmt_getBeginLoc(stmt), "TODO handle C CharacterLiteralClass"); + return wrap_stmt(out_node, out_child_scope, scope, + trans_character_literal(c, result_used, (const clang::CharacterLiteral *)stmt)); return ErrorUnexpected; case ZigClangStmt_ChooseExprClass: emit_warning(c, ZigClangStmt_getBeginLoc(stmt), "TODO handle C ChooseExprClass"); -- 2.54.0