commit c5ced0d74a40c8a8a46bf1b65ece17479384ce7c (tree)
parent 701c03d083c4d57275d95e921f03184515e0d247
Author: Vexu <git@vexu.eu>
Date: Mon, 6 Apr 2020 10:31:17 +0300
Merge pull request #4939 from SuperAuguste/master
translate-c: Properly translate C multicharacter literals
Diffstat:
2 files changed, 21 insertions(+), 6 deletions(-)
diff --git a/src-self-hosted/translate_c.zig b/src-self-hosted/translate_c.zig
@@ -5433,12 +5433,21 @@ fn parseCPrimaryExpr(c: *Context, it: *CTokenList.Iterator, source: []const u8,
switch (tok.id) {
.CharLiteral => {
const first_tok = it.list.at(0);
- const token = try appendToken(c, .CharLiteral, try zigifyEscapeSequences(c, source[tok.start..tok.end], source[first_tok.start..first_tok.end], source_loc));
- const node = try c.a().create(ast.Node.CharLiteral);
- node.* = .{
- .token = token,
- };
- return &node.base;
+ if (source[tok.start] != '\'' or source[tok.start + 1] == '\\' or tok.end - tok.start == 3) {
+ const token = try appendToken(c, .CharLiteral, try zigifyEscapeSequences(c, source[tok.start..tok.end], source[first_tok.start..first_tok.end], source_loc));
+ const node = try c.a().create(ast.Node.CharLiteral);
+ node.* = .{
+ .token = token,
+ };
+ return &node.base;
+ } else {
+ const token = try appendTokenFmt(c, .IntegerLiteral, "0x{x}", .{source[tok.start+1..tok.end-1]});
+ const node = try c.a().create(ast.Node.IntegerLiteral);
+ node.* = .{
+ .token = token,
+ };
+ return &node.base;
+ }
},
.StringLiteral => {
const first_tok = it.list.at(0);
diff --git a/test/translate_c.zig b/test/translate_c.zig
@@ -2873,4 +2873,10 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
, &[_][]const u8{
\\pub const FOO = "a" ++ ("b" ++ "c");
});
+
+ cases.add("multibyte character literals",
+ \\#define FOO 'abcd'
+ , &[_][]const u8{
+ \\pub const FOO = 0x61626364;
+ });
}