authorgravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2019-12-29 20:10:20+02:00
committergravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2019-12-29 20:19:30+02:00
log950eb81304dedc01ef1500dd2da1458694306b00
treed02476d9903f176468ac2e6267c2b879d8882b83
parentca211617bd6a780037430f170f1c1a730b8aac17
signature Commit is signed but in an unrecognized format.

translate-c-2 macro comparision ops


2 files changed, 110 insertions(+), 43 deletions(-)

src-self-hosted/translate_c.zig+97-43
......@@ -4287,7 +4287,33 @@ fn transMacroFnDefine(c: *Context, it: *ctok.TokenList.Iterator, name: []const u
42874287const ParseError = Error || error{ParseError};
42884288
42894289fn parseCExpr(c: *Context, it: *ctok.TokenList.Iterator, source_loc: ZigClangSourceLocation, scope: *Scope) ParseError!*ast.Node {
4290 return parseCPrefixOpExpr(c, it, source_loc, scope);
4290 const node = try parseCPrefixOpExpr(c, it, source_loc, scope);
4291 switch (it.next().?.id) {
4292 .QuestionMark => {
4293 // must come immediately after expr
4294 _ = try appendToken(c, .RParen, ")");
4295 const if_node = try transCreateNodeIf(c);
4296 if_node.condition = node;
4297 if_node.body = try parseCPrimaryExpr(c, it, source_loc, scope);
4298 if (it.next().?.id != .Colon) {
4299 try failDecl(
4300 c,
4301 source_loc,
4302 it.list.at(0).*.bytes,
4303 "unable to translate C expr: expected ':'",
4304 .{},
4305 );
4306 return error.ParseError;
4307 }
4308 if_node.@"else" = try transCreateNodeElse(c);
4309 if_node.@"else".?.body = try parseCPrimaryExpr(c, it, source_loc, scope);
4310 return &if_node.base;
4311 },
4312 else => {
4313 _ = it.prev();
4314 return node;
4315 },
4316 }
42914317}
42924318
42934319fn parseCNumLit(c: *Context, tok: *CToken, source_loc: ZigClangSourceLocation) ParseError!*ast.Node {
......@@ -4532,7 +4558,7 @@ fn parseCSuffixOpExpr(c: *Context, it: *ctok.TokenList.Iterator, source_loc: Zig
45324558 },
45334559 .Shl => {
45344560 const op_token = try appendToken(c, .AngleBracketAngleBracketLeft, "<<");
4535 const rhs = try parseCExpr(c, it, source_loc, scope);
4561 const rhs = try parseCPrefixOpExpr(c, it, source_loc, scope);
45364562 const bitshift_node = try c.a().create(ast.Node.InfixOp);
45374563 bitshift_node.* = .{
45384564 .op_token = op_token,
......@@ -4543,9 +4569,9 @@ fn parseCSuffixOpExpr(c: *Context, it: *ctok.TokenList.Iterator, source_loc: Zig
45434569 node = &bitshift_node.base;
45444570 },
45454571 .Shr => {
4546 const op_token = try appendToken(rp.c, .AngleBracketAngleBracketRight, ">>");
4547 const rhs = try parseCExpr(rp, it, source_loc, scope);
4548 const bitshift_node = try rp.c.a().create(ast.Node.InfixOp);
4572 const op_token = try appendToken(c, .AngleBracketAngleBracketRight, ">>");
4573 const rhs = try parseCPrefixOpExpr(c, it, source_loc, scope);
4574 const bitshift_node = try c.a().create(ast.Node.InfixOp);
45494575 bitshift_node.* = .{
45504576 .op_token = op_token,
45514577 .lhs = node,
......@@ -4556,7 +4582,7 @@ fn parseCSuffixOpExpr(c: *Context, it: *ctok.TokenList.Iterator, source_loc: Zig
45564582 },
45574583 .Pipe => {
45584584 const op_token = try appendToken(c, .Pipe, "|");
4559 const rhs = try parseCExpr(c, it, source_loc, scope);
4585 const rhs = try parseCPrefixOpExpr(c, it, source_loc, scope);
45604586 const or_node = try c.a().create(ast.Node.InfixOp);
45614587 or_node.* = .{
45624588 .op_token = op_token,
......@@ -4567,9 +4593,9 @@ fn parseCSuffixOpExpr(c: *Context, it: *ctok.TokenList.Iterator, source_loc: Zig
45674593 node = &or_node.base;
45684594 },
45694595 .Ampersand => {
4570 const op_token = try appendToken(rp.c, .Ampersand, "&");
4571 const rhs = try parseCExpr(rp, it, source_loc, scope);
4572 const bitand_node = try rp.c.a().create(ast.Node.InfixOp);
4596 const op_token = try appendToken(c, .Ampersand, "&");
4597 const rhs = try parseCPrefixOpExpr(c, it, source_loc, scope);
4598 const bitand_node = try c.a().create(ast.Node.InfixOp);
45734599 bitand_node.* = .{
45744600 .op_token = op_token,
45754601 .lhs = node,
......@@ -4579,9 +4605,9 @@ fn parseCSuffixOpExpr(c: *Context, it: *ctok.TokenList.Iterator, source_loc: Zig
45794605 node = &bitand_node.base;
45804606 },
45814607 .Plus => {
4582 const op_token = try appendToken(rp.c, .Plus, "+");
4583 const rhs = try parseCExpr(rp, it, source_loc, scope);
4584 const add_node = try rp.c.a().create(ast.Node.InfixOp);
4608 const op_token = try appendToken(c, .Plus, "+");
4609 const rhs = try parseCPrefixOpExpr(c, it, source_loc, scope);
4610 const add_node = try c.a().create(ast.Node.InfixOp);
45854611 add_node.* = .{
45864612 .op_token = op_token,
45874613 .lhs = node,
......@@ -4591,9 +4617,9 @@ fn parseCSuffixOpExpr(c: *Context, it: *ctok.TokenList.Iterator, source_loc: Zig
45914617 node = &add_node.base;
45924618 },
45934619 .Minus => {
4594 const op_token = try appendToken(rp.c, .Minus, "-");
4595 const rhs = try parseCExpr(rp, it, source_loc, scope);
4596 const sub_node = try rp.c.a().create(ast.Node.InfixOp);
4620 const op_token = try appendToken(c, .Minus, "-");
4621 const rhs = try parseCPrefixOpExpr(c, it, source_loc, scope);
4622 const sub_node = try c.a().create(ast.Node.InfixOp);
45974623 sub_node.* = .{
45984624 .op_token = op_token,
45994625 .lhs = node,
......@@ -4603,9 +4629,9 @@ fn parseCSuffixOpExpr(c: *Context, it: *ctok.TokenList.Iterator, source_loc: Zig
46034629 node = &sub_node.base;
46044630 },
46054631 .And => {
4606 const op_token = try appendToken(rp.c, .Keyword_and, "and");
4607 const rhs = try parseCExpr(rp, it, source_loc, scope);
4608 const and_node = try rp.c.a().create(ast.Node.InfixOp);
4632 const op_token = try appendToken(c, .Keyword_and, "and");
4633 const rhs = try parseCPrefixOpExpr(c, it, source_loc, scope);
4634 const and_node = try c.a().create(ast.Node.InfixOp);
46094635 and_node.* = .{
46104636 .op_token = op_token,
46114637 .lhs = node,
......@@ -4615,9 +4641,9 @@ fn parseCSuffixOpExpr(c: *Context, it: *ctok.TokenList.Iterator, source_loc: Zig
46154641 node = &and_node.base;
46164642 },
46174643 .Or => {
4618 const op_token = try appendToken(rp.c, .Keyword_or, "or");
4619 const rhs = try parseCExpr(rp, it, source_loc, scope);
4620 const or_node = try rp.c.a().create(ast.Node.InfixOp);
4644 const op_token = try appendToken(c, .Keyword_or, "or");
4645 const rhs = try parseCPrefixOpExpr(c, it, source_loc, scope);
4646 const or_node = try c.a().create(ast.Node.InfixOp);
46214647 or_node.* = .{
46224648 .op_token = op_token,
46234649 .lhs = node,
......@@ -4626,9 +4652,57 @@ fn parseCSuffixOpExpr(c: *Context, it: *ctok.TokenList.Iterator, source_loc: Zig
46264652 };
46274653 node = &or_node.base;
46284654 },
4655 .Gt => {
4656 const op_token = try appendToken(c, .AngleBracketRight, ">");
4657 const rhs = try parseCPrefixOpExpr(c, it, source_loc, scope);
4658 const and_node = try c.a().create(ast.Node.InfixOp);
4659 and_node.* = .{
4660 .op_token = op_token,
4661 .lhs = node,
4662 .op = .GreaterThan,
4663 .rhs = rhs,
4664 };
4665 node = &and_node.base;
4666 },
4667 .Gte => {
4668 const op_token = try appendToken(c, .AngleBracketRightEqual, ">=");
4669 const rhs = try parseCPrefixOpExpr(c, it, source_loc, scope);
4670 const and_node = try c.a().create(ast.Node.InfixOp);
4671 and_node.* = .{
4672 .op_token = op_token,
4673 .lhs = node,
4674 .op = .GreaterOrEqual,
4675 .rhs = rhs,
4676 };
4677 node = &and_node.base;
4678 },
4679 .Lt => {
4680 const op_token = try appendToken(c, .AngleBracketLeft, "<");
4681 const rhs = try parseCPrefixOpExpr(c, it, source_loc, scope);
4682 const and_node = try c.a().create(ast.Node.InfixOp);
4683 and_node.* = .{
4684 .op_token = op_token,
4685 .lhs = node,
4686 .op = .LessThan,
4687 .rhs = rhs,
4688 };
4689 node = &and_node.base;
4690 },
4691 .Lte => {
4692 const op_token = try appendToken(c, .AngleBracketLeftEqual, "<=");
4693 const rhs = try parseCPrefixOpExpr(c, it, source_loc, scope);
4694 const and_node = try c.a().create(ast.Node.InfixOp);
4695 and_node.* = .{
4696 .op_token = op_token,
4697 .lhs = node,
4698 .op = .LessOrEqual,
4699 .rhs = rhs,
4700 };
4701 node = &and_node.base;
4702 },
46294703 .LBrace => {
46304704 const arr_node = try transCreateNodeArrayAccess(c, node);
4631 arr_node.op.ArrayAccess = try parseCExpr(c, it, source_loc, scope);
4705 arr_node.op.ArrayAccess = try parseCPrefixOpExpr(c, it, source_loc, scope);
46324706 arr_node.rtoken = try appendToken(c, .RBrace, "]");
46334707 node = &arr_node.base;
46344708 if (it.next().?.id != .RBrace) {
......@@ -4645,7 +4719,7 @@ fn parseCSuffixOpExpr(c: *Context, it: *ctok.TokenList.Iterator, source_loc: Zig
46454719 .LParen => {
46464720 const call_node = try transCreateNodeFnCall(c, node);
46474721 while (true) {
4648 const arg = try parseCExpr(c, it, source_loc, scope);
4722 const arg = try parseCPrefixOpExpr(c, it, source_loc, scope);
46494723 try call_node.op.Call.params.push(arg);
46504724 const next = it.next().?;
46514725 if (next.id == .Comma)
......@@ -4666,26 +4740,6 @@ fn parseCSuffixOpExpr(c: *Context, it: *ctok.TokenList.Iterator, source_loc: Zig
46664740 call_node.rtoken = try appendToken(c, .RParen, ")");
46674741 node = &call_node.base;
46684742 },
4669 .QuestionMark => {
4670 // must come immediately after expr
4671 _ = try appendToken(c, .RParen, ")");
4672 const if_node = try transCreateNodeIf(c);
4673 if_node.condition = node;
4674 if_node.body = try parseCPrimaryExpr(c, it, source_loc, scope);
4675 if (it.next().?.id != .Colon) {
4676 try failDecl(
4677 c,
4678 source_loc,
4679 it.list.at(0).*.bytes,
4680 "unable to translate C expr: expected ':'",
4681 .{},
4682 );
4683 return error.ParseError;
4684 }
4685 if_node.@"else" = try transCreateNodeElse(c);
4686 if_node.@"else".?.body = try parseCPrimaryExpr(c, it, source_loc, scope);
4687 node = &if_node.base;
4688 },
46894743 else => {
46904744 _ = it.prev();
46914745 return node;
test/translate_c.zig+13
......@@ -2219,4 +2219,17 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
22192219 \\ };
22202220 \\}
22212221 });
2222
2223 cases.add("macro comparisions",
2224 \\#define MIN(a, b) ((b) < (a) ? (b) : (a))
2225 \\#define MAX(a, b) ((b) > (a) ? (b) : (a))
2226 , &[_][]const u8{
2227 \\pub inline fn MIN(a: var, b: var) @TypeOf(if (b < a) b else a) {
2228 \\ return if (b < a) b else a;
2229 \\}
2230 ,
2231 \\pub inline fn MAX(a: var, b: var) @TypeOf(if (b > a) b else a) {
2232 \\ return if (b > a) b else a;
2233 \\}
2234 });
22222235}