aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorLemonBoy <thatlemon@gmail.com>2019-04-20 11:25:57 +0200
committerLemonBoy <thatlemon@gmail.com>2019-04-22 22:23:41 +0200
commit8d05330cf7451066e01700140dcab692624a17bf (patch)
treee881238e46ce8054f4eeebb5c93abfa5dabe4f85 /src
parentab424bbb35616500b8621fd72562a38ddc824add (diff)
downloadzig-8d05330cf7451066e01700140dcab692624a17bf.tar.gz
zig-8d05330cf7451066e01700140dcab692624a17bf.zip
More precise translation of char literals
Diffstat (limited to 'src')
-rw-r--r--src/translate_c.cpp33
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) {