From 027e2a16734d5a1ac884474ed688ecea9a785e73 Mon Sep 17 00:00:00 2001 From: SuperAuguste Date: Sat, 4 Apr 2020 17:56:25 -0400 Subject: [PATCH 1/2] fix multichar literals in translate_c --- src-self-hosted/translate_c.zig | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/src-self-hosted/translate_c.zig b/src-self-hosted/translate_c.zig index 6ba7fc8ca..d18f9bb5e 100644 --- a/src-self-hosted/translate_c.zig +++ b/src-self-hosted/translate_c.zig @@ -5387,12 +5387,24 @@ 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+1] == '\\' and tok.end - tok.start == 4) + or (source[tok.start+1] != '\\' and 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); From 6106cf44197393a3ffa6bab9da0757ee4cecd311 Mon Sep 17 00:00:00 2001 From: SuperAuguste Date: Sun, 5 Apr 2020 19:06:43 -0400 Subject: [PATCH 2/2] fixes --- src-self-hosted/translate_c.zig | 5 +---- test/translate_c.zig | 6 ++++++ 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src-self-hosted/translate_c.zig b/src-self-hosted/translate_c.zig index d18f9bb5e..124a142f9 100644 --- a/src-self-hosted/translate_c.zig +++ b/src-self-hosted/translate_c.zig @@ -5387,10 +5387,7 @@ fn parseCPrimaryExpr(c: *Context, it: *CTokenList.Iterator, source: []const u8, switch (tok.id) { .CharLiteral => { const first_tok = it.list.at(0); - if ( - (source[tok.start+1] == '\\' and tok.end - tok.start == 4) - or (source[tok.start+1] != '\\' and tok.end - tok.start == 3) - ) { + 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.* = .{ diff --git a/test/translate_c.zig b/test/translate_c.zig index 8c84526a4..b850cc4a0 100644 --- a/test/translate_c.zig +++ b/test/translate_c.zig @@ -2847,4 +2847,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; + }); }