| ... | ... | @@ -610,7 +610,7 @@ fn visitVarDecl(c: *Context, var_decl: *const ZigClangVarDecl) Error!void { |
| 610 | 610 | try transCreateNodeUndefinedLiteral(c); |
| 611 | 611 | } else if (storage_class != .Extern) { |
| 612 | 612 | eq_tok = try appendToken(c, .Equal, "="); |
| 613 | | init_node = try transCreateNodeTypeIdentifier(c, "undefined"); |
| 613 | init_node = try transCreateNodeIdentifierUnchecked(c, "undefined"); |
| 614 | 614 | } |
| 615 | 615 | |
| 616 | 616 | const linksection_expr = blk: { |
| ... | ... | @@ -4814,7 +4814,7 @@ fn transCreateNodeIdentifier(c: *Context, name: []const u8) !*ast.Node { |
| 4814 | 4814 | return &identifier.base; |
| 4815 | 4815 | } |
| 4816 | 4816 | |
| 4817 | | fn transCreateNodeTypeIdentifier(c: *Context, name: []const u8) !*ast.Node { |
| 4817 | fn transCreateNodeIdentifierUnchecked(c: *Context, name: []const u8) !*ast.Node { |
| 4818 | 4818 | const token_index = try appendTokenFmt(c, .Identifier, "{}", .{name}); |
| 4819 | 4819 | const identifier = try c.a().create(ast.Node.Identifier); |
| 4820 | 4820 | identifier.* = .{ |
| ... | ... | @@ -5368,15 +5368,15 @@ fn parseCPrimaryExpr(c: *Context, it: *CTokenList.Iterator, source: []const u8, |
| 5368 | 5368 | return parseCNumLit(c, tok, source, source_loc); |
| 5369 | 5369 | }, |
| 5370 | 5370 | // eventually this will be replaced by std.c.parse which will handle these correctly |
| 5371 | | .Keyword_void => return transCreateNodeTypeIdentifier(c, "c_void"), |
| 5372 | | .Keyword_bool => return transCreateNodeTypeIdentifier(c, "bool"), |
| 5373 | | .Keyword_double => return transCreateNodeTypeIdentifier(c, "f64"), |
| 5374 | | .Keyword_long => return transCreateNodeTypeIdentifier(c, "c_long"), |
| 5375 | | .Keyword_int => return transCreateNodeTypeIdentifier(c, "c_int"), |
| 5376 | | .Keyword_float => return transCreateNodeTypeIdentifier(c, "f32"), |
| 5377 | | .Keyword_short => return transCreateNodeTypeIdentifier(c, "c_short"), |
| 5378 | | .Keyword_char => return transCreateNodeTypeIdentifier(c, "c_char"), |
| 5379 | | .Keyword_unsigned => return transCreateNodeTypeIdentifier(c, "c_uint"), |
| 5371 | .Keyword_void => return transCreateNodeIdentifierUnchecked(c, "c_void"), |
| 5372 | .Keyword_bool => return transCreateNodeIdentifierUnchecked(c, "bool"), |
| 5373 | .Keyword_double => return transCreateNodeIdentifierUnchecked(c, "f64"), |
| 5374 | .Keyword_long => return transCreateNodeIdentifierUnchecked(c, "c_long"), |
| 5375 | .Keyword_int => return transCreateNodeIdentifierUnchecked(c, "c_int"), |
| 5376 | .Keyword_float => return transCreateNodeIdentifierUnchecked(c, "f32"), |
| 5377 | .Keyword_short => return transCreateNodeIdentifierUnchecked(c, "c_short"), |
| 5378 | .Keyword_char => return transCreateNodeIdentifierUnchecked(c, "c_char"), |
| 5379 | .Keyword_unsigned => return transCreateNodeIdentifierUnchecked(c, "c_uint"), |
| 5380 | 5380 | .Identifier => { |
| 5381 | 5381 | const mangled_name = scope.getAlias(source[tok.start..tok.end]); |
| 5382 | 5382 | return transCreateNodeIdentifier(c, mangled_name); |
| ... | ... | @@ -5512,6 +5512,8 @@ fn parseCSuffixOpExpr(c: *Context, it: *CTokenList.Iterator, source: []const u8, |
| 5512 | 5512 | var node = try parseCPrimaryExpr(c, it, source, source_loc, scope); |
| 5513 | 5513 | while (true) { |
| 5514 | 5514 | const tok = it.next().?; |
| 5515 | var op_token: ast.TokenIndex = undefined; |
| 5516 | var op_id: ast.Node.InfixOp.Op = undefined; |
| 5515 | 5517 | switch (tok.id) { |
| 5516 | 5518 | .Period => { |
| 5517 | 5519 | const name_tok = it.next().?; |
| ... | ... | @@ -5528,6 +5530,7 @@ fn parseCSuffixOpExpr(c: *Context, it: *CTokenList.Iterator, source: []const u8, |
| 5528 | 5530 | } |
| 5529 | 5531 | |
| 5530 | 5532 | node = try transCreateNodeFieldAccess(c, node, source[name_tok.start..name_tok.end]); |
| 5533 | continue; |
| 5531 | 5534 | }, |
| 5532 | 5535 | .Arrow => { |
| 5533 | 5536 | const name_tok = it.next().?; |
| ... | ... | @@ -5542,9 +5545,16 @@ fn parseCSuffixOpExpr(c: *Context, it: *CTokenList.Iterator, source: []const u8, |
| 5542 | 5545 | ); |
| 5543 | 5546 | return error.ParseError; |
| 5544 | 5547 | } |
| 5545 | | |
| 5546 | | const deref = try transCreateNodePtrDeref(c, node); |
| 5548 | // deref is often used together with casts so we group the lhs expression |
| 5549 | const group = try c.a().create(ast.Node.GroupedExpression); |
| 5550 | group.* = .{ |
| 5551 | .lparen = try appendToken(c, .LParen, "("), |
| 5552 | .expr = node, |
| 5553 | .rparen = try appendToken(c, .RParen, ")"), |
| 5554 | }; |
| 5555 | const deref = try transCreateNodePtrDeref(c, &group.base); |
| 5547 | 5556 | node = try transCreateNodeFieldAccess(c, deref, source[name_tok.start..name_tok.end]); |
| 5557 | continue; |
| 5548 | 5558 | }, |
| 5549 | 5559 | .Asterisk => { |
| 5550 | 5560 | if (it.peek().?.id == .RParen) { |
| ... | ... | @@ -5568,161 +5578,57 @@ fn parseCSuffixOpExpr(c: *Context, it: *CTokenList.Iterator, source: []const u8, |
| 5568 | 5578 | return &ptr.base; |
| 5569 | 5579 | } else { |
| 5570 | 5580 | // expr * expr |
| 5571 | | const op_token = try appendToken(c, .Asterisk, "*"); |
| 5572 | | const rhs = try parseCPrimaryExpr(c, it, source, source_loc, scope); |
| 5573 | | const mul_node = try c.a().create(ast.Node.InfixOp); |
| 5574 | | mul_node.* = .{ |
| 5575 | | .op_token = op_token, |
| 5576 | | .lhs = node, |
| 5577 | | .op = .BitShiftLeft, |
| 5578 | | .rhs = rhs, |
| 5579 | | }; |
| 5580 | | node = &mul_node.base; |
| 5581 | op_token = try appendToken(c, .Asterisk, "*"); |
| 5582 | op_id = .BitShiftLeft; |
| 5581 | 5583 | } |
| 5582 | 5584 | }, |
| 5583 | 5585 | .AngleBracketAngleBracketLeft => { |
| 5584 | | const op_token = try appendToken(c, .AngleBracketAngleBracketLeft, "<<"); |
| 5585 | | const rhs = try parseCPrefixOpExpr(c, it, source, source_loc, scope); |
| 5586 | | const bitshift_node = try c.a().create(ast.Node.InfixOp); |
| 5587 | | bitshift_node.* = .{ |
| 5588 | | .op_token = op_token, |
| 5589 | | .lhs = node, |
| 5590 | | .op = .BitShiftLeft, |
| 5591 | | .rhs = rhs, |
| 5592 | | }; |
| 5593 | | node = &bitshift_node.base; |
| 5586 | op_token = try appendToken(c, .AngleBracketAngleBracketLeft, "<<"); |
| 5587 | op_id = .BitShiftLeft; |
| 5594 | 5588 | }, |
| 5595 | 5589 | .AngleBracketAngleBracketRight => { |
| 5596 | | const op_token = try appendToken(c, .AngleBracketAngleBracketRight, ">>"); |
| 5597 | | const rhs = try parseCPrefixOpExpr(c, it, source, source_loc, scope); |
| 5598 | | const bitshift_node = try c.a().create(ast.Node.InfixOp); |
| 5599 | | bitshift_node.* = .{ |
| 5600 | | .op_token = op_token, |
| 5601 | | .lhs = node, |
| 5602 | | .op = .BitShiftRight, |
| 5603 | | .rhs = rhs, |
| 5604 | | }; |
| 5605 | | node = &bitshift_node.base; |
| 5590 | op_token = try appendToken(c, .AngleBracketAngleBracketRight, ">>"); |
| 5591 | op_id = .BitShiftRight; |
| 5606 | 5592 | }, |
| 5607 | 5593 | .Pipe => { |
| 5608 | | const op_token = try appendToken(c, .Pipe, "|"); |
| 5609 | | const rhs = try parseCPrefixOpExpr(c, it, source, source_loc, scope); |
| 5610 | | const or_node = try c.a().create(ast.Node.InfixOp); |
| 5611 | | or_node.* = .{ |
| 5612 | | .op_token = op_token, |
| 5613 | | .lhs = node, |
| 5614 | | .op = .BitOr, |
| 5615 | | .rhs = rhs, |
| 5616 | | }; |
| 5617 | | node = &or_node.base; |
| 5594 | op_token = try appendToken(c, .Pipe, "|"); |
| 5595 | op_id = .BitOr; |
| 5618 | 5596 | }, |
| 5619 | 5597 | .Ampersand => { |
| 5620 | | const op_token = try appendToken(c, .Ampersand, "&"); |
| 5621 | | const rhs = try parseCPrefixOpExpr(c, it, source, source_loc, scope); |
| 5622 | | const bitand_node = try c.a().create(ast.Node.InfixOp); |
| 5623 | | bitand_node.* = .{ |
| 5624 | | .op_token = op_token, |
| 5625 | | .lhs = node, |
| 5626 | | .op = .BitAnd, |
| 5627 | | .rhs = rhs, |
| 5628 | | }; |
| 5629 | | node = &bitand_node.base; |
| 5598 | op_token = try appendToken(c, .Ampersand, "&"); |
| 5599 | op_id .BitAnd; |
| 5630 | 5600 | }, |
| 5631 | 5601 | .Plus => { |
| 5632 | | const op_token = try appendToken(c, .Plus, "+"); |
| 5633 | | const rhs = try parseCPrefixOpExpr(c, it, source, source_loc, scope); |
| 5634 | | const add_node = try c.a().create(ast.Node.InfixOp); |
| 5635 | | add_node.* = .{ |
| 5636 | | .op_token = op_token, |
| 5637 | | .lhs = node, |
| 5638 | | .op = .Add, |
| 5639 | | .rhs = rhs, |
| 5640 | | }; |
| 5641 | | node = &add_node.base; |
| 5602 | op_token = try appendToken(c, .Plus, "+"); |
| 5603 | op_id = .Add; |
| 5642 | 5604 | }, |
| 5643 | 5605 | .Minus => { |
| 5644 | | const op_token = try appendToken(c, .Minus, "-"); |
| 5645 | | const rhs = try parseCPrefixOpExpr(c, it, source, source_loc, scope); |
| 5646 | | const sub_node = try c.a().create(ast.Node.InfixOp); |
| 5647 | | sub_node.* = .{ |
| 5648 | | .op_token = op_token, |
| 5649 | | .lhs = node, |
| 5650 | | .op = .Sub, |
| 5651 | | .rhs = rhs, |
| 5652 | | }; |
| 5653 | | node = &sub_node.base; |
| 5606 | op_token = try appendToken(c, .Minus, "-"); |
| 5607 | op_id .Sub; |
| 5654 | 5608 | }, |
| 5655 | 5609 | .AmpersandAmpersand => { |
| 5656 | | const op_token = try appendToken(c, .Keyword_and, "and"); |
| 5657 | | const rhs = try parseCPrefixOpExpr(c, it, source, source_loc, scope); |
| 5658 | | const and_node = try c.a().create(ast.Node.InfixOp); |
| 5659 | | and_node.* = .{ |
| 5660 | | .op_token = op_token, |
| 5661 | | .lhs = node, |
| 5662 | | .op = .BoolAnd, |
| 5663 | | .rhs = rhs, |
| 5664 | | }; |
| 5665 | | node = &and_node.base; |
| 5610 | op_token = try appendToken(c, .Keyword_and, "and"); |
| 5611 | op_id = .BoolAnd; |
| 5666 | 5612 | }, |
| 5667 | 5613 | .PipePipe => { |
| 5668 | | const op_token = try appendToken(c, .Keyword_or, "or"); |
| 5669 | | const rhs = try parseCPrefixOpExpr(c, it, source, source_loc, scope); |
| 5670 | | const or_node = try c.a().create(ast.Node.InfixOp); |
| 5671 | | or_node.* = .{ |
| 5672 | | .op_token = op_token, |
| 5673 | | .lhs = node, |
| 5674 | | .op = .BoolOr, |
| 5675 | | .rhs = rhs, |
| 5676 | | }; |
| 5677 | | node = &or_node.base; |
| 5614 | op_token = try appendToken(c, .Keyword_or, "or"); |
| 5615 | op_id = .BoolOr; |
| 5678 | 5616 | }, |
| 5679 | 5617 | .AngleBracketRight => { |
| 5680 | | const op_token = try appendToken(c, .AngleBracketRight, ">"); |
| 5681 | | const rhs = try parseCPrefixOpExpr(c, it, source, source_loc, scope); |
| 5682 | | const and_node = try c.a().create(ast.Node.InfixOp); |
| 5683 | | and_node.* = .{ |
| 5684 | | .op_token = op_token, |
| 5685 | | .lhs = node, |
| 5686 | | .op = .GreaterThan, |
| 5687 | | .rhs = rhs, |
| 5688 | | }; |
| 5689 | | node = &and_node.base; |
| 5618 | op_token = try appendToken(c, .AngleBracketRight, ">"); |
| 5619 | op_id = .GreaterThan; |
| 5690 | 5620 | }, |
| 5691 | 5621 | .AngleBracketRightEqual => { |
| 5692 | | const op_token = try appendToken(c, .AngleBracketRightEqual, ">="); |
| 5693 | | const rhs = try parseCPrefixOpExpr(c, it, source, source_loc, scope); |
| 5694 | | const and_node = try c.a().create(ast.Node.InfixOp); |
| 5695 | | and_node.* = .{ |
| 5696 | | .op_token = op_token, |
| 5697 | | .lhs = node, |
| 5698 | | .op = .GreaterOrEqual, |
| 5699 | | .rhs = rhs, |
| 5700 | | }; |
| 5701 | | node = &and_node.base; |
| 5622 | op_token = try appendToken(c, .AngleBracketRightEqual, ">="); |
| 5623 | op_id = .GreaterOrEqual; |
| 5702 | 5624 | }, |
| 5703 | 5625 | .AngleBracketLeft => { |
| 5704 | | const op_token = try appendToken(c, .AngleBracketLeft, "<"); |
| 5705 | | const rhs = try parseCPrefixOpExpr(c, it, source, source_loc, scope); |
| 5706 | | const and_node = try c.a().create(ast.Node.InfixOp); |
| 5707 | | and_node.* = .{ |
| 5708 | | .op_token = op_token, |
| 5709 | | .lhs = node, |
| 5710 | | .op = .LessThan, |
| 5711 | | .rhs = rhs, |
| 5712 | | }; |
| 5713 | | node = &and_node.base; |
| 5626 | op_token = try appendToken(c, .AngleBracketLeft, "<"); |
| 5627 | op_id = .LessThan; |
| 5714 | 5628 | }, |
| 5715 | 5629 | .AngleBracketLeftEqual => { |
| 5716 | | const op_token = try appendToken(c, .AngleBracketLeftEqual, "<="); |
| 5717 | | const rhs = try parseCPrefixOpExpr(c, it, source, source_loc, scope); |
| 5718 | | const and_node = try c.a().create(ast.Node.InfixOp); |
| 5719 | | and_node.* = .{ |
| 5720 | | .op_token = op_token, |
| 5721 | | .lhs = node, |
| 5722 | | .op = .LessOrEqual, |
| 5723 | | .rhs = rhs, |
| 5724 | | }; |
| 5725 | | node = &and_node.base; |
| 5630 | op_token = try appendToken(c, .AngleBracketLeftEqual, "<="); |
| 5631 | op_id = .LessOrEqual; |
| 5726 | 5632 | }, |
| 5727 | 5633 | .LBracket => { |
| 5728 | 5634 | const arr_node = try transCreateNodeArrayAccess(c, node); |
| ... | ... | @@ -5740,6 +5646,7 @@ fn parseCSuffixOpExpr(c: *Context, it: *CTokenList.Iterator, source: []const u8, |
| 5740 | 5646 | ); |
| 5741 | 5647 | return error.ParseError; |
| 5742 | 5648 | } |
| 5649 | continue; |
| 5743 | 5650 | }, |
| 5744 | 5651 | .LParen => { |
| 5745 | 5652 | const call_node = try transCreateNodeFnCall(c, node); |
| ... | ... | @@ -5765,12 +5672,39 @@ fn parseCSuffixOpExpr(c: *Context, it: *CTokenList.Iterator, source: []const u8, |
| 5765 | 5672 | } |
| 5766 | 5673 | call_node.rtoken = try appendToken(c, .RParen, ")"); |
| 5767 | 5674 | node = &call_node.base; |
| 5675 | continue; |
| 5676 | }, |
| 5677 | .BangEqual => { |
| 5678 | op_token = try appendToken(c, .BangEqual, "!="); |
| 5679 | op_id = .BangEqual; |
| 5680 | }, |
| 5681 | .EqualEqual => { |
| 5682 | op_token = try appendToken(c, .EqualEqual, "=="); |
| 5683 | op_id = .EqualEqual; |
| 5684 | }, |
| 5685 | .Slash => { |
| 5686 | // unsigned/float division uses the operator |
| 5687 | op_id = .Div; |
| 5688 | op_token = try appendToken(c, .Slash, "/"); |
| 5689 | }, |
| 5690 | .Percent => { |
| 5691 | // unsigned/float division uses the operator |
| 5692 | op_id = .Mod; |
| 5693 | op_token = try appendToken(c, .Percent, "%"); |
| 5768 | 5694 | }, |
| 5769 | 5695 | else => { |
| 5770 | 5696 | _ = it.prev(); |
| 5771 | 5697 | return node; |
| 5772 | 5698 | }, |
| 5773 | 5699 | } |
| 5700 | const op_node = try c.a().create(ast.Node.InfixOp); |
| 5701 | op_node.* = .{ |
| 5702 | .op_token = op_token, |
| 5703 | .lhs = node, |
| 5704 | .op = op_id, |
| 5705 | .rhs = try parseCPrefixOpExpr(c, it, source, source_loc, scope), |
| 5706 | }; |
| 5707 | node = &op_node.base; |
| 5774 | 5708 | } |
| 5775 | 5709 | } |
| 5776 | 5710 | |
| ... | ... | @@ -5788,14 +5722,33 @@ fn parseCPrefixOpExpr(c: *Context, it: *CTokenList.Iterator, source: []const u8, |
| 5788 | 5722 | node.rhs = try parseCPrefixOpExpr(c, it, source, source_loc, scope); |
| 5789 | 5723 | return &node.base; |
| 5790 | 5724 | }, |
| 5725 | .Plus => return try parseCPrefixOpExpr(c, it, source, source_loc, scope), |
| 5791 | 5726 | .Tilde => { |
| 5792 | 5727 | const node = try transCreateNodePrefixOp(c, .BitNot, .Tilde, "~"); |
| 5793 | 5728 | node.rhs = try parseCPrefixOpExpr(c, it, source, source_loc, scope); |
| 5794 | 5729 | return &node.base; |
| 5795 | 5730 | }, |
| 5796 | 5731 | .Asterisk => { |
| 5797 | | const prefix_op_expr = try parseCPrefixOpExpr(c, it, source, source_loc, scope); |
| 5798 | | return try transCreateNodePtrDeref(c, prefix_op_expr); |
| 5732 | // deref is often used together with casts so we group the lhs expression |
| 5733 | const group = try c.a().create(ast.Node.GroupedExpression); |
| 5734 | group.* = .{ |
| 5735 | .lparen = try appendToken(c, .LParen, "("), |
| 5736 | .expr = try parseCPrefixOpExpr(c, it, source, source_loc, scope), |
| 5737 | .rparen = try appendToken(c, .RParen, ")"), |
| 5738 | }; |
| 5739 | return try transCreateNodePtrDeref(c, &group.base); |
| 5740 | }, |
| 5741 | .Ampersand => { |
| 5742 | // address of is often used together with casts so we group the rhs expression |
| 5743 | const node = try transCreateNodePrefixOp(c, .AddressOf, .Ampersand, "&"); |
| 5744 | const group = try c.a().create(ast.Node.GroupedExpression); |
| 5745 | group.* = .{ |
| 5746 | .lparen = try appendToken(c, .LParen, "("), |
| 5747 | .expr = try parseCPrefixOpExpr(c, it, source, source_loc, scope), |
| 5748 | .rparen = try appendToken(c, .RParen, ")"), |
| 5749 | }; |
| 5750 | node.rhs = &group.base; |
| 5751 | return &node.base; |
| 5799 | 5752 | }, |
| 5800 | 5753 | else => { |
| 5801 | 5754 | _ = it.prev(); |