diff options
| author | Vexu <git@vexu.eu> | 2020-04-06 10:31:17 +0300 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-04-06 10:31:17 +0300 |
| commit | c5ced0d74a40c8a8a46bf1b65ece17479384ce7c (patch) | |
| tree | 6ed8e7505d5394d00003424cfabfd0859f0f7047 | |
| parent | 701c03d083c4d57275d95e921f03184515e0d247 (diff) | |
| parent | 6106cf44197393a3ffa6bab9da0757ee4cecd311 (diff) | |
| download | zig-c5ced0d74a40c8a8a46bf1b65ece17479384ce7c.tar.gz zig-c5ced0d74a40c8a8a46bf1b65ece17479384ce7c.zip | |
Merge pull request #4939 from SuperAuguste/master
translate-c: Properly translate C multicharacter literals
| -rw-r--r-- | src-self-hosted/translate_c.zig | 21 | ||||
| -rw-r--r-- | test/translate_c.zig | 6 |
2 files changed, 21 insertions, 6 deletions
diff --git a/src-self-hosted/translate_c.zig b/src-self-hosted/translate_c.zig index 410443b405..2140722b76 100644 --- 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 index a3a22a1992..55414488f6 100644 --- 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; + }); } |
