| ... | ... | @@ -274,7 +274,7 @@ pub fn translate( |
| 274 | 274 | errdefer tree_arena.deinit(); |
| 275 | 275 | |
| 276 | 276 | const tree = try tree_arena.allocator.create(ast.Tree); |
| 277 | | tree.* = ast.Tree{ |
| 277 | tree.* = .{ |
| 278 | 278 | .source = undefined, // need to use toOwnedSlice later |
| 279 | 279 | .root_node = undefined, |
| 280 | 280 | .arena_allocator = tree_arena, |
| ... | ... | @@ -644,7 +644,7 @@ fn visitVarDecl(c: *Context, var_decl: *const ZigClangVarDecl) Error!void { |
| 644 | 644 | }; |
| 645 | 645 | |
| 646 | 646 | const node = try c.a().create(ast.Node.VarDecl); |
| 647 | | node.* = ast.Node.VarDecl{ |
| 647 | node.* = .{ |
| 648 | 648 | .doc_comments = null, |
| 649 | 649 | .visib_token = visib_tok, |
| 650 | 650 | .thread_local_token = thread_local_token, |
| ... | ... | @@ -3479,7 +3479,7 @@ fn qualTypeToLog2IntRef(rp: RestorePoint, qt: ZigClangQualType, source_loc: ZigC |
| 3479 | 3479 | // we can perform the log2 now. |
| 3480 | 3480 | const cast_bit_width = math.log2_int(u64, int_bit_width); |
| 3481 | 3481 | const node = try rp.c.a().create(ast.Node.IntegerLiteral); |
| 3482 | | node.* = ast.Node.IntegerLiteral{ |
| 3482 | node.* = .{ |
| 3483 | 3483 | .token = try appendTokenFmt(rp.c, .Identifier, "u{}", .{cast_bit_width}), |
| 3484 | 3484 | }; |
| 3485 | 3485 | return &node.base; |
| ... | ... | @@ -3502,7 +3502,7 @@ fn qualTypeToLog2IntRef(rp: RestorePoint, qt: ZigClangQualType, source_loc: ZigC |
| 3502 | 3502 | const import_fn_call = try transCreateNodeBuiltinFnCall(rp.c, "@import"); |
| 3503 | 3503 | const std_token = try appendToken(rp.c, .StringLiteral, "\"std\""); |
| 3504 | 3504 | const std_node = try rp.c.a().create(ast.Node.StringLiteral); |
| 3505 | | std_node.* = ast.Node.StringLiteral{ |
| 3505 | std_node.* = .{ |
| 3506 | 3506 | .token = std_token, |
| 3507 | 3507 | }; |
| 3508 | 3508 | try import_fn_call.params.push(&std_node.base); |
| ... | ... | @@ -3783,7 +3783,7 @@ fn transCreateNodePrefixOp( |
| 3783 | 3783 | bytes: []const u8, |
| 3784 | 3784 | ) !*ast.Node.PrefixOp { |
| 3785 | 3785 | const node = try c.a().create(ast.Node.PrefixOp); |
| 3786 | | node.* = ast.Node.PrefixOp{ |
| 3786 | node.* = .{ |
| 3787 | 3787 | .op_token = try appendToken(c, op_tok_id, bytes), |
| 3788 | 3788 | .op = op, |
| 3789 | 3789 | .rhs = undefined, // translate and set afterward |
| ... | ... | @@ -3980,7 +3980,7 @@ fn transCreateNodeBoolLiteral(c: *Context, value: bool) !*ast.Node { |
| 3980 | 3980 | fn transCreateNodeArrayInitializer(c: *Context, ty: *ast.Node) !*ast.Node.SuffixOp { |
| 3981 | 3981 | _ = try appendToken(c, .LBrace, "{"); |
| 3982 | 3982 | const node = try c.a().create(ast.Node.SuffixOp); |
| 3983 | | node.* = ast.Node.SuffixOp{ |
| 3983 | node.* = .{ |
| 3984 | 3984 | .lhs = .{ .node = ty }, |
| 3985 | 3985 | .op = .{ |
| 3986 | 3986 | .ArrayInitializer = ast.Node.SuffixOp.Op.InitList.init(c.a()), |
| ... | ... | @@ -3993,7 +3993,7 @@ fn transCreateNodeArrayInitializer(c: *Context, ty: *ast.Node) !*ast.Node.Suffix |
| 3993 | 3993 | fn transCreateNodeStructInitializer(c: *Context, ty: *ast.Node) !*ast.Node.SuffixOp { |
| 3994 | 3994 | _ = try appendToken(c, .LBrace, "{"); |
| 3995 | 3995 | const node = try c.a().create(ast.Node.SuffixOp); |
| 3996 | | node.* = ast.Node.SuffixOp{ |
| 3996 | node.* = .{ |
| 3997 | 3997 | .lhs = .{ .node = ty }, |
| 3998 | 3998 | .op = .{ |
| 3999 | 3999 | .StructInitializer = ast.Node.SuffixOp.Op.InitList.init(c.a()), |
| ... | ... | @@ -4306,7 +4306,7 @@ fn transCreateNodeShiftOp( |
| 4306 | 4306 | cast_node.rparen_token = try appendToken(rp.c, .RParen, ")"); |
| 4307 | 4307 | |
| 4308 | 4308 | const node = try rp.c.a().create(ast.Node.InfixOp); |
| 4309 | | node.* = ast.Node.InfixOp{ |
| 4309 | node.* = .{ |
| 4310 | 4310 | .op_token = op_token, |
| 4311 | 4311 | .lhs = lhs, |
| 4312 | 4312 | .op = op, |
| ... | ... | @@ -4626,8 +4626,7 @@ fn finishTransFnProto( |
| 4626 | 4626 | const type_node = try transQualType(rp, param_qt, source_loc); |
| 4627 | 4627 | |
| 4628 | 4628 | const param_node = try rp.c.a().create(ast.Node.ParamDecl); |
| 4629 | | param_node.* = ast.Node.ParamDecl{ |
| 4630 | | .base = ast.Node{ .id = ast.Node.Id.ParamDecl }, |
| 4629 | param_node.* = .{ |
| 4631 | 4630 | .doc_comments = null, |
| 4632 | 4631 | .comptime_token = null, |
| 4633 | 4632 | .noalias_token = noalias_tok, |
| ... | ... | @@ -4648,8 +4647,7 @@ fn finishTransFnProto( |
| 4648 | 4647 | } |
| 4649 | 4648 | |
| 4650 | 4649 | const var_arg_node = try rp.c.a().create(ast.Node.ParamDecl); |
| 4651 | | var_arg_node.* = ast.Node.ParamDecl{ |
| 4652 | | .base = ast.Node{ .id = ast.Node.Id.ParamDecl }, |
| 4650 | var_arg_node.* = .{ |
| 4653 | 4651 | .doc_comments = null, |
| 4654 | 4652 | .comptime_token = null, |
| 4655 | 4653 | .noalias_token = null, |
| ... | ... | @@ -4774,14 +4772,12 @@ pub fn failDecl(c: *Context, loc: ZigClangSourceLocation, name: []const u8, comp |
| 4774 | 4772 | const semi_tok = try appendToken(c, .Semicolon, ";"); |
| 4775 | 4773 | |
| 4776 | 4774 | const msg_node = try c.a().create(ast.Node.StringLiteral); |
| 4777 | | msg_node.* = ast.Node.StringLiteral{ |
| 4778 | | .base = ast.Node{ .id = ast.Node.Id.StringLiteral }, |
| 4775 | msg_node.* = .{ |
| 4779 | 4776 | .token = msg_tok, |
| 4780 | 4777 | }; |
| 4781 | 4778 | |
| 4782 | 4779 | const call_node = try c.a().create(ast.Node.BuiltinCall); |
| 4783 | | call_node.* = ast.Node.BuiltinCall{ |
| 4784 | | .base = ast.Node{ .id = ast.Node.Id.BuiltinCall }, |
| 4780 | call_node.* = .{ |
| 4785 | 4781 | .builtin_token = builtin_tok, |
| 4786 | 4782 | .params = ast.Node.BuiltinCall.ParamList.init(c.a()), |
| 4787 | 4783 | .rparen_token = rparen_tok, |
| ... | ... | @@ -4789,8 +4785,7 @@ pub fn failDecl(c: *Context, loc: ZigClangSourceLocation, name: []const u8, comp |
| 4789 | 4785 | try call_node.params.push(&msg_node.base); |
| 4790 | 4786 | |
| 4791 | 4787 | const var_decl_node = try c.a().create(ast.Node.VarDecl); |
| 4792 | | var_decl_node.* = ast.Node.VarDecl{ |
| 4793 | | .base = ast.Node{ .id = ast.Node.Id.VarDecl }, |
| 4788 | var_decl_node.* = .{ |
| 4794 | 4789 | .doc_comments = null, |
| 4795 | 4790 | .visib_token = pub_tok, |
| 4796 | 4791 | .thread_local_token = null, |
| ... | ... | @@ -4825,7 +4820,7 @@ fn appendTokenFmt(c: *Context, token_id: Token.Id, comptime format: []const u8, |
| 4825 | 4820 | const new_token = try c.tree.tokens.addOne(); |
| 4826 | 4821 | errdefer c.tree.tokens.shrink(token_index); |
| 4827 | 4822 | |
| 4828 | | new_token.* = Token{ |
| 4823 | new_token.* = .{ |
| 4829 | 4824 | .id = token_id, |
| 4830 | 4825 | .start = start_index, |
| 4831 | 4826 | .end = end_index, |
| ... | ... | @@ -5523,36 +5518,70 @@ fn parseCPrimaryExpr(c: *Context, it: *CTokenList.Iterator, source: []const u8, |
| 5523 | 5518 | return error.ParseError; |
| 5524 | 5519 | } |
| 5525 | 5520 | |
| 5521 | const lparen = try appendToken(c, .LParen, "("); |
| 5522 | |
| 5526 | 5523 | if (saw_integer_literal) { |
| 5527 | | // @intToPtr(dest, x) |
| 5524 | //( if (@typeInfo(dest) == .Pointer)) |
| 5525 | // @intToPtr(dest, x) |
| 5526 | //else |
| 5527 | // @as(dest, x) ) |
| 5528 | const if_node = try transCreateNodeIf(c); |
| 5529 | const type_info_node = try transCreateNodeBuiltinFnCall(c, "@typeInfo"); |
| 5530 | try type_info_node.params.push(inner_node); |
| 5531 | type_info_node.rparen_token = try appendToken(c, .LParen, ")"); |
| 5532 | const cmp_node = try c.a().create(ast.Node.InfixOp); |
| 5533 | cmp_node.* = .{ |
| 5534 | .op_token = try appendToken(c, .EqualEqual, "=="), |
| 5535 | .lhs = &type_info_node.base, |
| 5536 | .op = .EqualEqual, |
| 5537 | .rhs = try transCreateNodeEnumLiteral(c, "Pointer"), |
| 5538 | }; |
| 5539 | if_node.condition = &cmp_node.base; |
| 5540 | _ = try appendToken(c, .RParen, ")"); |
| 5541 | |
| 5528 | 5542 | const int_to_ptr = try transCreateNodeBuiltinFnCall(c, "@intToPtr"); |
| 5529 | 5543 | try int_to_ptr.params.push(inner_node); |
| 5530 | 5544 | try int_to_ptr.params.push(node_to_cast); |
| 5531 | 5545 | int_to_ptr.rparen_token = try appendToken(c, .RParen, ")"); |
| 5532 | | return &int_to_ptr.base; |
| 5546 | if_node.body = &int_to_ptr.base; |
| 5547 | |
| 5548 | const else_node = try transCreateNodeElse(c); |
| 5549 | if_node.@"else" = else_node; |
| 5550 | |
| 5551 | const as_node = try transCreateNodeBuiltinFnCall(c, "@as"); |
| 5552 | try as_node.params.push(inner_node); |
| 5553 | try as_node.params.push(node_to_cast); |
| 5554 | as_node.rparen_token = try appendToken(c, .RParen, ")"); |
| 5555 | else_node.body = &as_node.base; |
| 5556 | |
| 5557 | const group_node = try c.a().create(ast.Node.GroupedExpression); |
| 5558 | group_node.* = .{ |
| 5559 | .lparen = lparen, |
| 5560 | .expr = &if_node.base, |
| 5561 | .rparen = try appendToken(c, .RParen, ")"), |
| 5562 | }; |
| 5563 | return &group_node.base; |
| 5533 | 5564 | } |
| 5534 | 5565 | |
| 5535 | 5566 | //( if (@typeInfo(@TypeOf(x)) == .Pointer) |
| 5536 | 5567 | // @ptrCast(dest, @alignCast(@alignOf(dest.Child), x)) |
| 5537 | | //else if (@typeInfo(@TypeOf(x)) == .Integer and @typeInfo(dest) == .Pointer)) |
| 5568 | //else if (@typeInfo(@TypeOf(x)) == .Int and @typeInfo(dest) == .Pointer)) |
| 5538 | 5569 | // @intToPtr(dest, x) |
| 5539 | 5570 | //else |
| 5540 | 5571 | // @as(dest, x) ) |
| 5541 | 5572 | |
| 5542 | | const lparen = try appendToken(c, .LParen, "("); |
| 5543 | | |
| 5544 | 5573 | const if_1 = try transCreateNodeIf(c); |
| 5545 | | const type_id_1 = try transCreateNodeBuiltinFnCall(c, "@typeInfo"); |
| 5574 | const type_info_1 = try transCreateNodeBuiltinFnCall(c, "@typeInfo"); |
| 5546 | 5575 | const type_of_1 = try transCreateNodeBuiltinFnCall(c, "@TypeOf"); |
| 5547 | | try type_id_1.params.push(&type_of_1.base); |
| 5576 | try type_info_1.params.push(&type_of_1.base); |
| 5548 | 5577 | try type_of_1.params.push(node_to_cast); |
| 5549 | 5578 | type_of_1.rparen_token = try appendToken(c, .RParen, ")"); |
| 5550 | | type_id_1.rparen_token = try appendToken(c, .RParen, ")"); |
| 5579 | type_info_1.rparen_token = try appendToken(c, .RParen, ")"); |
| 5551 | 5580 | |
| 5552 | 5581 | const cmp_1 = try c.a().create(ast.Node.InfixOp); |
| 5553 | 5582 | cmp_1.* = .{ |
| 5554 | 5583 | .op_token = try appendToken(c, .EqualEqual, "=="), |
| 5555 | | .lhs = &type_id_1.base, |
| 5584 | .lhs = &type_info_1.base, |
| 5556 | 5585 | .op = .EqualEqual, |
| 5557 | 5586 | .rhs = try transCreateNodeEnumLiteral(c, "Pointer"), |
| 5558 | 5587 | }; |
| ... | ... | @@ -5590,17 +5619,17 @@ fn parseCPrimaryExpr(c: *Context, it: *CTokenList.Iterator, source: []const u8, |
| 5590 | 5619 | if_1.@"else" = else_1; |
| 5591 | 5620 | |
| 5592 | 5621 | const if_2 = try transCreateNodeIf(c); |
| 5593 | | const type_id_2 = try transCreateNodeBuiltinFnCall(c, "@typeInfo"); |
| 5622 | const type_info_2 = try transCreateNodeBuiltinFnCall(c, "@typeInfo"); |
| 5594 | 5623 | const type_of_2 = try transCreateNodeBuiltinFnCall(c, "@TypeOf"); |
| 5595 | | try type_id_2.params.push(&type_of_2.base); |
| 5624 | try type_info_2.params.push(&type_of_2.base); |
| 5596 | 5625 | try type_of_2.params.push(node_to_cast); |
| 5597 | 5626 | type_of_2.rparen_token = try appendToken(c, .RParen, ")"); |
| 5598 | | type_id_2.rparen_token = try appendToken(c, .RParen, ")"); |
| 5627 | type_info_2.rparen_token = try appendToken(c, .RParen, ")"); |
| 5599 | 5628 | |
| 5600 | 5629 | const cmp_2 = try c.a().create(ast.Node.InfixOp); |
| 5601 | 5630 | cmp_2.* = .{ |
| 5602 | 5631 | .op_token = try appendToken(c, .EqualEqual, "=="), |
| 5603 | | .lhs = &type_id_2.base, |
| 5632 | .lhs = &type_info_2.base, |
| 5604 | 5633 | .op = .EqualEqual, |
| 5605 | 5634 | .rhs = try transCreateNodeEnumLiteral(c, "Int"), |
| 5606 | 5635 | }; |
| ... | ... | @@ -5612,13 +5641,13 @@ fn parseCPrimaryExpr(c: *Context, it: *CTokenList.Iterator, source: []const u8, |
| 5612 | 5641 | .op = .BoolAnd, |
| 5613 | 5642 | .rhs = undefined, |
| 5614 | 5643 | }; |
| 5615 | | const type_id_3 = try transCreateNodeBuiltinFnCall(c, "@typeInfo"); |
| 5616 | | try type_id_3.params.push(inner_node); |
| 5617 | | type_id_3.rparen_token = try appendToken(c, .LParen, ")"); |
| 5644 | const type_info_3 = try transCreateNodeBuiltinFnCall(c, "@typeInfo"); |
| 5645 | try type_info_3.params.push(inner_node); |
| 5646 | type_info_3.rparen_token = try appendToken(c, .LParen, ")"); |
| 5618 | 5647 | const cmp_3 = try c.a().create(ast.Node.InfixOp); |
| 5619 | 5648 | cmp_3.* = .{ |
| 5620 | 5649 | .op_token = try appendToken(c, .EqualEqual, "=="), |
| 5621 | | .lhs = &type_id_3.base, |
| 5650 | .lhs = &type_info_3.base, |
| 5622 | 5651 | .op = .EqualEqual, |
| 5623 | 5652 | .rhs = try transCreateNodeEnumLiteral(c, "Pointer"), |
| 5624 | 5653 | }; |