diff options
| author | LemonBoy <thatlemon@gmail.com> | 2019-04-20 11:25:57 +0200 |
|---|---|---|
| committer | LemonBoy <thatlemon@gmail.com> | 2019-04-22 22:23:41 +0200 |
| commit | 8d05330cf7451066e01700140dcab692624a17bf (patch) | |
| tree | e881238e46ce8054f4eeebb5c93abfa5dabe4f85 /src | |
| parent | ab424bbb35616500b8621fd72562a38ddc824add (diff) | |
| download | zig-8d05330cf7451066e01700140dcab692624a17bf.tar.gz zig-8d05330cf7451066e01700140dcab692624a17bf.zip | |
More precise translation of char literals
Diffstat (limited to 'src')
| -rw-r--r-- | src/translate_c.cpp | 33 |
1 files changed, 26 insertions, 7 deletions
diff --git a/src/translate_c.cpp b/src/translate_c.cpp index d2cf423c09..298039bce6 100644 --- a/src/translate_c.cpp +++ b/src/translate_c.cpp @@ -1335,14 +1335,33 @@ static AstNode *trans_floating_literal(Context *c, ResultUsed result_used, const } static AstNode *trans_character_literal(Context *c, ResultUsed result_used, const clang::CharacterLiteral *stmt) { - clang::Expr::EvalResult result; - if (!stmt->EvaluateAsInt(result, *reinterpret_cast<clang::ASTContext *>(c->ctx))) { - emit_warning(c, bitcast(stmt->getBeginLoc()), "invalid character literal"); - return nullptr; + switch (stmt->getKind()) { + case clang::CharacterLiteral::CharacterKind::Ascii: + { + unsigned val = stmt->getValue(); + // C has a somewhat obscure feature called multi-character character + // constant + if (val > 255) + return trans_create_node_unsigned(c, val); + } + // fallthrough + case clang::CharacterLiteral::CharacterKind::UTF8: + { + AstNode *node = trans_create_node(c, NodeTypeCharLiteral); + node->data.char_literal.value = stmt->getValue(); + return maybe_suppress_result(c, result_used, node); + } + case clang::CharacterLiteral::CharacterKind::UTF16: + emit_warning(c, bitcast(stmt->getBeginLoc()), "TODO support UTF16 character literals"); + return nullptr; + case clang::CharacterLiteral::CharacterKind::UTF32: + emit_warning(c, bitcast(stmt->getBeginLoc()), "TODO support UTF32 character literals"); + return nullptr; + case clang::CharacterLiteral::CharacterKind::Wide: + emit_warning(c, bitcast(stmt->getBeginLoc()), "TODO support wide character literals"); + 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); + zig_unreachable(); } static AstNode *trans_constant_expr(Context *c, ResultUsed result_used, const clang::ConstantExpr *expr) { |
