authorgravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2019-12-28 22:32:18+02:00
committergravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2019-12-28 22:32:18+02:00
logaea46dcd7e8521fc04bc1980a596c748961804ab
treeda122977a3f841ce37da059c98b82f538408d959
parent68aa221995208a7471290235a86bd184d0057782
signature Commit is signed but in an unrecognized format.

translate-c-2 macro conditional operator


3 files changed, 28 insertions(+), 0 deletions(-)

src-self-hosted/c_tokenizer.zig+10
......@@ -31,6 +31,8 @@ pub const CToken = struct {
3131 LBrace,
3232 RBrace,
3333 Pipe,
34 QuestionMark,
35 Colon,
3436 };
3537
3638 pub const NumLitSuffix = enum {
......@@ -365,6 +367,14 @@ fn next(chars: [*:0]const u8, i: *usize) !CToken {
365367 result.id = .Pipe;
366368 state = .Done;
367369 },
370 '?' => {
371 result.id = .QuestionMark;
372 state = .Done;
373 },
374 ':' => {
375 result.id = .Colon;
376 state = .Done;
377 },
368378 else => return error.TokenizingFailed,
369379 }
370380 },
src-self-hosted/translate_c.zig+12
......@@ -4545,6 +4545,18 @@ fn parseCSuffixOpExpr(rp: RestorePoint, it: *ctok.TokenList.Iterator, source_loc
45454545 call_node.rtoken = try appendToken(rp.c, .RParen, ")");
45464546 node = &call_node.base;
45474547 },
4548 .QuestionMark => {
4549 // must come immediately after expr
4550 _ = try appendToken(rp.c, .RParen, ")");
4551 const if_node = try transCreateNodeIf(rp.c);
4552 if_node.condition = node;
4553 if_node.body = try parseCPrimaryExpr(rp, it, source_loc, scope);
4554 if (it.next().?.id != .Colon)
4555 return error.ParseError;
4556 if_node.@"else" = try transCreateNodeElse(rp.c);
4557 if_node.@"else".?.body = try parseCPrimaryExpr(rp, it, source_loc, scope);
4558 node = &if_node.base;
4559 },
45484560 else => {
45494561 _ = it.prev();
45504562 return node;
test/translate_c.zig+6
......@@ -2192,6 +2192,12 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
21922192 \\}
21932193 });
21942194
2195 cases.add_2("macro conditional operator",
2196 \\#define FOO a ? b : c
2197 , &[_][]const u8{
2198 \\pub const FOO = if (a) b else c;
2199 });
2200
21952201 /////////////// Cases for only stage1 because stage2 behavior is better ////////////////
21962202 cases.addC("Parameterless function prototypes",
21972203 \\void foo() {}