authorgravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2020-04-06 10:31:17+03:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2020-04-06 10:31:17+03:00
logc5ced0d74a40c8a8a46bf1b65ece17479384ce7c
tree6ed8e7505d5394d00003424cfabfd0859f0f7047
parent701c03d083c4d57275d95e921f03184515e0d247
parent6106cf44197393a3ffa6bab9da0757ee4cecd311
signaturebadge-question-mark Signed by PGP key 4AEE18F83AFDEB23

Merge pull request #4939 from SuperAuguste/master

translate-c: Properly translate C multicharacter literals

2 files changed, 21 insertions(+), 6 deletions(-)

src-self-hosted/translate_c.zig+15-6
...@@ -5433,12 +5433,21 @@ fn parseCPrimaryExpr(c: *Context, it: *CTokenList.Iterator, source: []const u8,...@@ -5433,12 +5433,21 @@ fn parseCPrimaryExpr(c: *Context, it: *CTokenList.Iterator, source: []const u8,
5433 switch (tok.id) {5433 switch (tok.id) {
5434 .CharLiteral => {5434 .CharLiteral => {
5435 const first_tok = it.list.at(0);5435 const first_tok = it.list.at(0);
5436 const token = try appendToken(c, .CharLiteral, try zigifyEscapeSequences(c, source[tok.start..tok.end], source[first_tok.start..first_tok.end], source_loc));5436 if (source[tok.start] != '\'' or source[tok.start + 1] == '\\' or tok.end - tok.start == 3) {
5437 const node = try c.a().create(ast.Node.CharLiteral);5437 const token = try appendToken(c, .CharLiteral, try zigifyEscapeSequences(c, source[tok.start..tok.end], source[first_tok.start..first_tok.end], source_loc));
5438 node.* = .{5438 const node = try c.a().create(ast.Node.CharLiteral);
5439 .token = token,5439 node.* = .{
5440 };5440 .token = token,
5441 return &node.base;5441 };
5442 return &node.base;
5443 } else {
5444 const token = try appendTokenFmt(c, .IntegerLiteral, "0x{x}", .{source[tok.start+1..tok.end-1]});
5445 const node = try c.a().create(ast.Node.IntegerLiteral);
5446 node.* = .{
5447 .token = token,
5448 };
5449 return &node.base;
5450 }
5442 },5451 },
5443 .StringLiteral => {5452 .StringLiteral => {
5444 const first_tok = it.list.at(0);5453 const first_tok = it.list.at(0);
test/translate_c.zig+6
...@@ -2873,4 +2873,10 @@ pub fn addCases(cases: *tests.TranslateCContext) void {...@@ -2873,4 +2873,10 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
2873 , &[_][]const u8{2873 , &[_][]const u8{
2874 \\pub const FOO = "a" ++ ("b" ++ "c");2874 \\pub const FOO = "a" ++ ("b" ++ "c");
2875 });2875 });
2876
2877 cases.add("multibyte character literals",
2878 \\#define FOO 'abcd'
2879 , &[_][]const u8{
2880 \\pub const FOO = 0x61626364;
2881 });
2876}2882}