authorgravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2019-12-16 12:18:56+02:00
committergravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2019-12-16 12:45:00+02:00
log04dc0bd0e4f7bc7c23e9d0e30b5d2b6153e2c0d5
tree519b41d69c3df12801f6616481f71ed7497d262a
parenta37caaa5285ed6c040675a94dbd639e881ad72b6
signature Commit is signed but in an unrecognized format.

translate-c-2 variable aliasing


3 files changed, 178 insertions(+), 261 deletions(-)

src-self-hosted/c_tokenizer.zig+1-1
......@@ -6,7 +6,7 @@ pub const TokenList = std.SegmentedList(CToken, 32);
66pub const CToken = struct {
77 id: Id,
88 bytes: []const u8,
9 num_lit_suffix: NumLitSuffix = undefined,
9 num_lit_suffix: NumLitSuffix = .None,
1010
1111 pub const Id = enum {
1212 CharLit,
src-self-hosted/translate_c.zig+147-257
......@@ -45,26 +45,26 @@ const Scope = struct {
4545
4646 const Id = enum {
4747 Switch,
48 Var,
4948 Block,
5049 Root,
5150 While,
5251 FnDef,
52 Ref,
5353 };
5454
5555 const Switch = struct {
5656 base: Scope,
5757 };
5858
59 const Var = struct {
59 /// used when getting a member `a.b`
60 const Ref = struct {
6061 base: Scope,
61 c_name: []const u8,
62 zig_name: []const u8,
6362 };
6463
6564 const Block = struct {
6665 base: Scope,
6766 block_node: *ast.Node.Block,
67 variables: AliasList,
6868
6969 /// Don't forget to set rbrace token later
7070 fn init(c: *Context, parent: *Scope, block_node: *ast.Node.Block) !*Block {
......@@ -75,9 +75,28 @@ const Scope = struct {
7575 .parent = parent,
7676 },
7777 .block_node = block_node,
78 .variables = AliasList.init(c.a()),
7879 };
7980 return block;
8081 }
82
83 fn getAlias(scope: *Block, name: []const u8) ?[]const u8 {
84 var it = scope.variables.iterator(0);
85 while (it.next()) |p| {
86 if (std.mem.eql(u8, p.name, name))
87 return p.alias;
88 }
89 return scope.base.parent.?.getAlias(name);
90 }
91
92 fn contains(scope: *Block, name: []const u8) bool {
93 var it = scope.variables.iterator(0);
94 while (it.next()) |p| {
95 if (std.mem.eql(u8, p.name, name))
96 return true;
97 }
98 return scope.base.parent.?.contains(name);
99 }
81100 };
82101
83102 const Root = struct {
......@@ -155,26 +174,24 @@ const Scope = struct {
155174 fn getAlias(scope: *Scope, name: []const u8) ?[]const u8 {
156175 return switch (scope.id) {
157176 .Root => null,
177 .Ref => null,
158178 .FnDef => @fieldParentPtr(FnDef, "base", scope).getAlias(name),
179 .Block => @fieldParentPtr(Block, "base", scope).getAlias(name),
159180 else => @panic("TODO Scope.getAlias"),
160181 };
161182 }
162183
163184 fn contains(scope: *Scope, name: []const u8) bool {
164185 return switch (scope.id) {
186 .Ref => false,
165187 .Root => @fieldParentPtr(Root, "base", scope).contains(name),
166188 .FnDef => @fieldParentPtr(FnDef, "base", scope).contains(name),
189 .Block => @fieldParentPtr(Block, "base", scope).contains(name),
167190 else => @panic("TODO Scope.contains"),
168191 };
169192 }
170193};
171194
172const TransResult = struct {
173 node: *ast.Node,
174 node_scope: *Scope,
175 child_scope: *Scope,
176};
177
178195const Context = struct {
179196 tree: *ast.Tree,
180197 source_buffer: *std.Buffer,
......@@ -388,14 +405,14 @@ fn visitFnDecl(c: *Context, fn_decl: *const ZigClangFunctionDecl) Error!void {
388405
389406 // actual function definition with body
390407 const body_stmt = ZigClangFunctionDecl_getBody(fn_decl);
391 const result = transStmt(rp, scope, body_stmt, .unused, .r_value) catch |err| switch (err) {
408 const body_node = transStmt(rp, scope, body_stmt, .unused, .r_value) catch |err| switch (err) {
392409 error.OutOfMemory => |e| return e,
393410 error.UnsupportedTranslation,
394411 error.UnsupportedType,
395412 => return failDecl(c, fn_decl_loc, fn_name, "unable to translate function", .{}),
396413 };
397 assert(result.node.id == ast.Node.Id.Block);
398 proto_node.body_node = result.node;
414 assert(body_node.id == .Block);
415 proto_node.body_node = body_node;
399416
400417 return addTopLevelDecl(c, fn_name, &proto_node.base);
401418}
......@@ -431,7 +448,7 @@ fn visitVarDecl(c: *Context, var_decl: *const ZigClangVarDecl) Error!void {
431448 else
432449 try appendToken(c, .Keyword_var, "var");
433450
434 const name_tok = try appendIdentifier(c, var_name, null);
451 const name_tok = try appendIdentifier(c, var_name);
435452
436453 _ = try appendToken(c, .Colon, ":");
437454 const type_node = transQualType(rp, qual_type, var_decl_loc) catch |err| switch (err) {
......@@ -446,17 +463,16 @@ fn visitVarDecl(c: *Context, var_decl: *const ZigClangVarDecl) Error!void {
446463
447464 if (ZigClangVarDecl_hasInit(var_decl)) {
448465 eq_tok = try appendToken(c, .Equal, "=");
449 init_node = if (ZigClangVarDecl_getInit(var_decl)) |expr| blk: {
450 var res = transExpr(rp, &c.global_scope.base, expr, .used, .r_value) catch |err| switch (err) {
466 init_node = if (ZigClangVarDecl_getInit(var_decl)) |expr|
467 transExpr(rp, &c.global_scope.base, expr, .used, .r_value) catch |err| switch (err) {
451468 error.UnsupportedTranslation,
452469 error.UnsupportedType,
453470 => {
454471 return failDecl(c, var_decl_loc, var_name, "unable to translate initializer", .{});
455472 },
456473 error.OutOfMemory => |e| return e,
457 };
458 break :blk res.node;
459 } else
474 }
475 else
460476 try transCreateNodeUndefinedLiteral(c);
461477 } else if (storage_class != .Extern) {
462478 return failDecl(c, var_decl_loc, var_name, "non-extern variable has no initializer", .{});
......@@ -492,7 +508,7 @@ fn resolveTypeDef(c: *Context, typedef_decl: *const ZigClangTypedefNameDecl) Err
492508
493509 const typedef_name = try c.str(ZigClangDecl_getName_bytes_begin(@ptrCast(*const ZigClangDecl, typedef_decl)));
494510 _ = try c.decl_table.put(@ptrToInt(ZigClangTypedefNameDecl_getCanonicalDecl(typedef_decl)), typedef_name);
495 const name_tok = try appendIdentifier(c, typedef_name, null);
511 const name_tok = try appendIdentifier(c, typedef_name);
496512 const eq_tok = try appendToken(c, .Equal, "=");
497513
498514 const child_qt = ZigClangTypedefNameDecl_getUnderlyingType(typedef_decl);
......@@ -545,7 +561,7 @@ fn resolveRecordDecl(c: *Context, record_decl: *const ZigClangRecordDecl) Error!
545561
546562 const name = try std.fmt.allocPrint(c.a(), "{}_{}", .{ container_kind_name, bare_name });
547563 _ = try c.decl_table.put(@ptrToInt(ZigClangRecordDecl_getCanonicalDecl(record_decl)), name);
548 const name_tok = try appendIdentifier(c, name, null);
564 const name_tok = try appendIdentifier(c, name);
549565
550566 const eq_tok = try appendToken(c, .Equal, "=");
551567 const init_node = transRecordDecl(c, record_decl) catch |err| switch (err) {
......@@ -581,10 +597,10 @@ fn resolveRecordDecl(c: *Context, record_decl: *const ZigClangRecordDecl) Error!
581597fn createAlias(c: *Context, alias: var) !void {
582598 const visib_tok = try appendToken(c, .Keyword_pub, "pub");
583599 const mut_tok = try appendToken(c, .Keyword_const, "const");
584 const name_tok = try appendIdentifier(c, alias.alias, null);
600 const name_tok = try appendIdentifier(c, alias.alias);
585601
586602 const eq_tok = try appendToken(c, .Equal, "=");
587 const init_node = try transCreateNodeIdentifier(c, alias.name, null);
603 const init_node = try transCreateNodeIdentifier(c, alias.name);
588604
589605 const node = try c.a().create(ast.Node.VarDecl);
590606 node.* = ast.Node.VarDecl{
......@@ -622,7 +638,7 @@ fn transStmt(
622638 stmt: *const ZigClangStmt,
623639 result_used: ResultUsed,
624640 lrvalue: LRValue,
625) TransError!TransResult {
641) TransError!*ast.Node {
626642 const sc = ZigClangStmt_getStmtClass(stmt);
627643 switch (sc) {
628644 .BinaryOperatorClass => return transBinaryOperator(rp, scope, @ptrCast(*const ZigClangBinaryOperator, stmt), result_used),
......@@ -654,7 +670,7 @@ fn transBinaryOperator(
654670 scope: *Scope,
655671 stmt: *const ZigClangBinaryOperator,
656672 result_used: ResultUsed,
657) TransError!TransResult {
673) TransError!*ast.Node {
658674 const op = ZigClangBinaryOperator_getOpcode(stmt);
659675 const qt = ZigClangBinaryOperator_getType(stmt);
660676 switch (op) {
......@@ -665,67 +681,43 @@ fn transBinaryOperator(
665681 "TODO: handle more C binary operators: {}",
666682 .{op},
667683 ),
668 .Assign => return TransResult{
669 .node = &(try transCreateNodeAssign(rp, scope, result_used, ZigClangBinaryOperator_getLHS(stmt), ZigClangBinaryOperator_getRHS(stmt))).base,
670 .child_scope = scope,
671 .node_scope = scope,
672 },
684 .Assign => return &(try transCreateNodeAssign(rp, scope, result_used, ZigClangBinaryOperator_getLHS(stmt), ZigClangBinaryOperator_getRHS(stmt))).base,
673685 .Add => {
674686 const node = if (cIsUnsignedInteger(qt))
675687 try transCreateNodeInfixOp(rp, scope, stmt, .AddWrap, .PlusPercent, "+%", true)
676688 else
677689 try transCreateNodeInfixOp(rp, scope, stmt, .Add, .Plus, "+", true);
678 return maybeSuppressResult(rp, scope, result_used, TransResult{
679 .node = node,
680 .child_scope = scope,
681 .node_scope = scope,
682 });
690 return maybeSuppressResult(rp, scope, result_used, node);
683691 },
684692 .Sub => {
685693 const node = if (cIsUnsignedInteger(qt))
686694 try transCreateNodeInfixOp(rp, scope, stmt, .SubWrap, .MinusPercent, "-%", true)
687695 else
688696 try transCreateNodeInfixOp(rp, scope, stmt, .Sub, .Minus, "-", true);
689 return maybeSuppressResult(rp, scope, result_used, TransResult{
690 .node = node,
691 .child_scope = scope,
692 .node_scope = scope,
693 });
697 return maybeSuppressResult(rp, scope, result_used, node);
694698 },
695699 .Mul => {
696700 const node = if (cIsUnsignedInteger(qt))
697701 try transCreateNodeInfixOp(rp, scope, stmt, .MultWrap, .AsteriskPercent, "*%", true)
698702 else
699703 try transCreateNodeInfixOp(rp, scope, stmt, .Mult, .Asterisk, "*", true);
700 return maybeSuppressResult(rp, scope, result_used, TransResult{
701 .node = node,
702 .child_scope = scope,
703 .node_scope = scope,
704 });
704 return maybeSuppressResult(rp, scope, result_used, node);
705705 },
706706 .Div => {
707707 if (!cIsUnsignedInteger(qt)) {
708708 // signed integer division uses @divTrunc
709709 const div_trunc_node = try transCreateNodeBuiltinFnCall(rp.c, "@divTrunc");
710710 const lhs = try transExpr(rp, scope, ZigClangBinaryOperator_getLHS(stmt), .used, .l_value);
711 try div_trunc_node.params.push(lhs.node);
711 try div_trunc_node.params.push(lhs);
712712 _ = try appendToken(rp.c, .Comma, ",");
713713 const rhs = try transExpr(rp, scope, ZigClangBinaryOperator_getRHS(stmt), .used, .r_value);
714 try div_trunc_node.params.push(rhs.node);
714 try div_trunc_node.params.push(rhs);
715715 div_trunc_node.rparen_token = try appendToken(rp.c, .RParen, ")");
716 return maybeSuppressResult(rp, scope, result_used, TransResult{
717 .node = &div_trunc_node.base,
718 .child_scope = scope,
719 .node_scope = scope,
720 });
716 return maybeSuppressResult(rp, scope, result_used, &div_trunc_node.base);
721717 } else {
722718 // unsigned/float division uses the operator
723719 const node = try transCreateNodeInfixOp(rp, scope, stmt, .Div, .Slash, "/", true);
724 return maybeSuppressResult(rp, scope, result_used, TransResult{
725 .node = node,
726 .child_scope = scope,
727 .node_scope = scope,
728 });
720 return maybeSuppressResult(rp, scope, result_used, node);
729721 }
730722 },
731723 .Rem => {
......@@ -733,24 +725,16 @@ fn transBinaryOperator(
733725 // signed integer division uses @rem
734726 const rem_node = try transCreateNodeBuiltinFnCall(rp.c, "@rem");
735727 const lhs = try transExpr(rp, scope, ZigClangBinaryOperator_getLHS(stmt), .used, .l_value);
736 try rem_node.params.push(lhs.node);
728 try rem_node.params.push(lhs);
737729 _ = try appendToken(rp.c, .Comma, ",");
738730 const rhs = try transExpr(rp, scope, ZigClangBinaryOperator_getRHS(stmt), .used, .r_value);
739 try rem_node.params.push(rhs.node);
731 try rem_node.params.push(rhs);
740732 rem_node.rparen_token = try appendToken(rp.c, .RParen, ")");
741 return maybeSuppressResult(rp, scope, result_used, TransResult{
742 .node = &rem_node.base,
743 .child_scope = scope,
744 .node_scope = scope,
745 });
733 return maybeSuppressResult(rp, scope, result_used, &rem_node.base);
746734 } else {
747735 // unsigned/float division uses the operator
748736 const node = try transCreateNodeInfixOp(rp, scope, stmt, .Mod, .Percent, "%", true);
749 return maybeSuppressResult(rp, scope, result_used, TransResult{
750 .node = node,
751 .child_scope = scope,
752 .node_scope = scope,
753 });
737 return maybeSuppressResult(rp, scope, result_used, node);
754738 }
755739 },
756740 .Shl,
......@@ -793,33 +777,22 @@ fn transCompoundStmtInline(
793777 parent_scope: *Scope,
794778 stmt: *const ZigClangCompoundStmt,
795779 block_node: *ast.Node.Block,
796) TransError!TransResult {
780) TransError!void {
797781 var it = ZigClangCompoundStmt_body_begin(stmt);
798782 const end_it = ZigClangCompoundStmt_body_end(stmt);
799 var scope = parent_scope;
800783 while (it != end_it) : (it += 1) {
801784 const result = try transStmt(rp, parent_scope, it[0], .unused, .r_value);
802 scope = result.child_scope;
803 if (result.node != &block_node.base)
804 try block_node.statements.push(result.node);
785 if (result != &block_node.base)
786 try block_node.statements.push(result);
805787 }
806 return TransResult{
807 .node = &block_node.base,
808 .child_scope = scope,
809 .node_scope = scope,
810 };
811788}
812789
813fn transCompoundStmt(rp: RestorePoint, scope: *Scope, stmt: *const ZigClangCompoundStmt) TransError!TransResult {
814 const block_node = try transCreateNodeBlock(rp.c, null, null);
790fn transCompoundStmt(rp: RestorePoint, scope: *Scope, stmt: *const ZigClangCompoundStmt) TransError!*ast.Node {
791 const block_node = try transCreateNodeBlock(rp.c, null);
815792 const block_scope = try Scope.Block.init(rp.c, scope, block_node);
816 const inline_result = try transCompoundStmtInline(rp, &block_scope.base, stmt, block_node);
793 try transCompoundStmtInline(rp, &block_scope.base, stmt, block_node);
817794 block_node.rbrace = try appendToken(rp.c, .RBrace, "}");
818 return TransResult{
819 .node = &block_node.base,
820 .node_scope = inline_result.node_scope,
821 .child_scope = inline_result.child_scope,
822 };
795 return &block_node.base;
823796}
824797
825798fn transCStyleCastExprClass(
......@@ -828,7 +801,7 @@ fn transCStyleCastExprClass(
828801 stmt: *const ZigClangCStyleCastExpr,
829802 result_used: ResultUsed,
830803 lrvalue: LRValue,
831) !TransResult {
804) TransError!*ast.Node {
832805 const sub_expr = ZigClangCStyleCastExpr_getSubExpr(stmt);
833806 const cast_node = (try transCCast(
834807 rp,
......@@ -836,20 +809,14 @@ fn transCStyleCastExprClass(
836809 ZigClangCStyleCastExpr_getBeginLoc(stmt),
837810 ZigClangCStyleCastExpr_getType(stmt),
838811 ZigClangExpr_getType(sub_expr),
839 (try transExpr(rp, scope, sub_expr, .used, lrvalue)).node,
812 try transExpr(rp, scope, sub_expr, .used, lrvalue),
840813 ));
841 const cast_res = TransResult{
842 .node = cast_node,
843 .child_scope = scope,
844 .node_scope = scope,
845 };
846 return maybeSuppressResult(rp, scope, result_used, cast_res);
814 return maybeSuppressResult(rp, scope, result_used, cast_node);
847815}
848816
849fn transDeclStmt(rp: RestorePoint, parent_scope: *Scope, stmt: *const ZigClangDeclStmt) TransError!TransResult {
817fn transDeclStmt(rp: RestorePoint, scope: *Scope, stmt: *const ZigClangDeclStmt) TransError!*ast.Node {
850818 const c = rp.c;
851 const block_scope = parent_scope.findBlockScope();
852 var scope = parent_scope;
819 const block_scope = scope.findBlockScope();
853820
854821 var it = ZigClangDeclStmt_decl_begin(stmt);
855822 const end_it = ZigClangDeclStmt_decl_end(stmt);
......@@ -867,18 +834,14 @@ fn transDeclStmt(rp: RestorePoint, parent_scope: *Scope, stmt: *const ZigClangDe
867834 try appendToken(c, .Keyword_const, "const")
868835 else
869836 try appendToken(c, .Keyword_var, "var");
870 const c_name = try c.str(ZigClangDecl_getName_bytes_begin(
837 const name = try c.str(ZigClangDecl_getName_bytes_begin(
871838 @ptrCast(*const ZigClangDecl, var_decl),
872839 ));
873 const name_token = try appendIdentifier(c, c_name, null); // TODO parent_scope);
874
875 const var_scope = try c.a().create(Scope.Var);
876 var_scope.* = Scope.Var{
877 .base = Scope{ .id = .Var, .parent = scope },
878 .c_name = c_name,
879 .zig_name = c_name, // TODO: getWantedName
880 };
881 scope = &var_scope.base;
840 const checked_name = if (try scope.createAlias(c, name)) |a| blk: {
841 try block_scope.variables.push(.{ .name = name, .alias = a });
842 break :blk a;
843 } else name;
844 const name_token = try appendIdentifier(c, checked_name);
882845
883846 const colon_token = try appendToken(c, .Colon, ":");
884847 const loc = ZigClangStmt_getBeginLoc(@ptrCast(*const ZigClangStmt, stmt));
......@@ -886,7 +849,7 @@ fn transDeclStmt(rp: RestorePoint, parent_scope: *Scope, stmt: *const ZigClangDe
886849
887850 const eq_token = try appendToken(c, .Equal, "=");
888851 const init_node = if (ZigClangVarDecl_getInit(var_decl)) |expr|
889 (try transExpr(rp, scope, expr, .used, .r_value)).node
852 try transExpr(rp, scope, expr, .used, .r_value)
890853 else
891854 try transCreateNodeUndefinedLiteral(c);
892855 const semicolon_token = try appendToken(c, .Semicolon, ";");
......@@ -910,7 +873,6 @@ fn transDeclStmt(rp: RestorePoint, parent_scope: *Scope, stmt: *const ZigClangDe
910873 };
911874 try block_scope.block_node.statements.push(&node.base);
912875 },
913
914876 else => |kind| return revertAndWarn(
915877 rp,
916878 error.UnsupportedTranslation,
......@@ -920,12 +882,7 @@ fn transDeclStmt(rp: RestorePoint, parent_scope: *Scope, stmt: *const ZigClangDe
920882 ),
921883 }
922884 }
923
924 return TransResult{
925 .node = &block_scope.block_node.base,
926 .node_scope = scope,
927 .child_scope = scope,
928 };
885 return &block_scope.block_node.base;
929886}
930887
931888fn transDeclRefExpr(
......@@ -933,17 +890,12 @@ fn transDeclRefExpr(
933890 scope: *Scope,
934891 expr: *const ZigClangDeclRefExpr,
935892 lrvalue: LRValue,
936) !TransResult {
893) TransError!*ast.Node {
937894 const value_decl = ZigClangDeclRefExpr_getDecl(expr);
938 const c_name = try rp.c.str(ZigClangDecl_getName_bytes_begin(@ptrCast(*const ZigClangDecl, value_decl)));
939 const zig_name = transLookupZigIdentifier(scope, c_name);
940 if (lrvalue == .l_value) try rp.c.ptr_params.put(zig_name);
941 const node = try transCreateNodeIdentifier(rp.c, zig_name, null); // TODO scope);
942 return TransResult{
943 .node = node,
944 .node_scope = scope,
945 .child_scope = scope,
946 };
895 const name = try rp.c.str(ZigClangDecl_getName_bytes_begin(@ptrCast(*const ZigClangDecl, value_decl)));
896 const checked_name = if (scope.getAlias(name)) |a| a else name;
897 if (lrvalue == .l_value) try rp.c.ptr_params.put(checked_name);
898 return transCreateNodeIdentifier(rp.c, checked_name);
947899}
948900
949901fn transImplicitCastExpr(
......@@ -951,7 +903,7 @@ fn transImplicitCastExpr(
951903 scope: *Scope,
952904 expr: *const ZigClangImplicitCastExpr,
953905 result_used: ResultUsed,
954) !TransResult {
906) TransError!*ast.Node {
955907 const c = rp.c;
956908 const sub_expr = ZigClangImplicitCastExpr_getSubExpr(expr);
957909 const sub_expr_node = try transExpr(rp, scope, @ptrCast(*const ZigClangExpr, sub_expr), .used, .r_value);
......@@ -959,20 +911,12 @@ fn transImplicitCastExpr(
959911 .BitCast => {
960912 const dest_type = getExprQualType(c, @ptrCast(*const ZigClangExpr, expr));
961913 const src_type = getExprQualType(c, sub_expr);
962 return TransResult{
963 .node = try transCCast(rp, scope, ZigClangImplicitCastExpr_getBeginLoc(expr), dest_type, src_type, sub_expr_node.node),
964 .node_scope = scope,
965 .child_scope = scope,
966 };
914 return transCCast(rp, scope, ZigClangImplicitCastExpr_getBeginLoc(expr), dest_type, src_type, sub_expr_node);
967915 },
968916 .IntegralCast => {
969917 const dest_type = ZigClangExpr_getType(@ptrCast(*const ZigClangExpr, expr));
970918 const src_type = ZigClangExpr_getType(sub_expr);
971 return TransResult{
972 .node = try transCCast(rp, scope, ZigClangImplicitCastExpr_getBeginLoc(expr), dest_type, src_type, sub_expr_node.node),
973 .node_scope = scope,
974 .child_scope = scope,
975 };
919 return transCCast(rp, scope, ZigClangImplicitCastExpr_getBeginLoc(expr), dest_type, src_type, sub_expr_node);
976920 },
977921 .FunctionToPointerDecay, .ArrayToPointerDecay => {
978922 return maybeSuppressResult(rp, scope, result_used, sub_expr_node);
......@@ -981,11 +925,7 @@ fn transImplicitCastExpr(
981925 return transExpr(rp, scope, sub_expr, .used, .r_value);
982926 },
983927 .NullToPointer => {
984 return TransResult{
985 .node = try transCreateNodeNullLiteral(rp.c),
986 .node_scope = scope,
987 .child_scope = scope,
988 };
928 return transCreateNodeNullLiteral(rp.c);
989929 },
990930 else => |kind| return revertAndWarn(
991931 rp,
......@@ -1002,36 +942,27 @@ fn transIntegerLiteral(
1002942 scope: *Scope,
1003943 expr: *const ZigClangIntegerLiteral,
1004944 result_used: ResultUsed,
1005) !TransResult {
945) TransError!*ast.Node {
1006946 var eval_result: ZigClangExprEvalResult = undefined;
1007947 if (!ZigClangIntegerLiteral_EvaluateAsInt(expr, &eval_result, rp.c.clang_context)) {
1008948 const loc = ZigClangIntegerLiteral_getBeginLoc(expr);
1009949 return revertAndWarn(rp, error.UnsupportedTranslation, loc, "invalid integer literal", .{});
1010950 }
1011951 const node = try transCreateNodeAPInt(rp.c, ZigClangAPValue_getInt(&eval_result.Val));
1012 const res = TransResult{
1013 .node = node,
1014 .child_scope = scope,
1015 .node_scope = scope,
1016 };
1017 return maybeSuppressResult(rp, scope, result_used, res);
952 return maybeSuppressResult(rp, scope, result_used, node);
1018953}
1019954
1020955fn transReturnStmt(
1021956 rp: RestorePoint,
1022957 scope: *Scope,
1023958 expr: *const ZigClangReturnStmt,
1024) !TransResult {
959) TransError!*ast.Node {
1025960 const node = try transCreateNodeReturnExpr(rp.c);
1026961 if (ZigClangReturnStmt_getRetValue(expr)) |val_expr| {
1027 node.rhs = (try transExpr(rp, scope, val_expr, .used, .r_value)).node;
962 node.rhs = try transExpr(rp, scope, val_expr, .used, .r_value);
1028963 }
1029964 _ = try appendToken(rp.c, .Semicolon, ";");
1030 return TransResult{
1031 .node = &node.base,
1032 .child_scope = scope,
1033 .node_scope = scope,
1034 };
965 return &node.base;
1035966}
1036967
1037968fn transStringLiteral(
......@@ -1039,7 +970,7 @@ fn transStringLiteral(
1039970 scope: *Scope,
1040971 stmt: *const ZigClangStringLiteral,
1041972 result_used: ResultUsed,
1042) !TransResult {
973) TransError!*ast.Node {
1043974 const kind = ZigClangStringLiteral_getKind(stmt);
1044975 switch (kind) {
1045976 .Ascii, .UTF8 => {
......@@ -1061,12 +992,7 @@ fn transStringLiteral(
1061992 node.* = ast.Node.StringLiteral{
1062993 .token = token,
1063994 };
1064 const res = TransResult{
1065 .node = &node.base,
1066 .child_scope = scope,
1067 .node_scope = scope,
1068 };
1069 return maybeSuppressResult(rp, scope, result_used, res);
995 return maybeSuppressResult(rp, scope, result_used, &node.base);
1070996 },
1071997 .UTF16, .UTF32, .Wide => return revertAndWarn(
1072998 rp,
......@@ -1159,7 +1085,7 @@ fn transExpr(
11591085 expr: *const ZigClangExpr,
11601086 used: ResultUsed,
11611087 lrvalue: LRValue,
1162) TransError!TransResult {
1088) TransError!*ast.Node {
11631089 return transStmt(rp, scope, @ptrCast(*const ZigClangStmt, expr), used, lrvalue);
11641090}
11651091
......@@ -1168,7 +1094,7 @@ fn transInitListExpr(
11681094 scope: *Scope,
11691095 expr: *const ZigClangInitListExpr,
11701096 used: ResultUsed,
1171) TransError!TransResult {
1097) TransError!*ast.Node {
11721098 const qt = getExprQualType(rp.c, @ptrCast(*const ZigClangExpr, expr));
11731099 const qual_type = ZigClangQualType_getTypePtr(qt);
11741100 const source_loc = ZigClangExpr_getBeginLoc(@ptrCast(*const ZigClangExpr, expr));
......@@ -1199,16 +1125,12 @@ fn transInitListExpr(
11991125 var i: c_uint = 0;
12001126 while (i < init_count) : (i += 1) {
12011127 const elem_expr = ZigClangInitListExpr_getInit(expr, i);
1202 try init_node.op.ArrayInitializer.push((try transExpr(rp, scope, elem_expr, .used, .r_value)).node);
1128 try init_node.op.ArrayInitializer.push(try transExpr(rp, scope, elem_expr, .used, .r_value));
12031129 _ = try appendToken(rp.c, .Comma, ",");
12041130 }
12051131 init_node.rtoken = try appendToken(rp.c, .RBrace, "}");
12061132 if (leftover_count == 0) {
1207 return TransResult{
1208 .node = &init_node.base,
1209 .child_scope = scope,
1210 .node_scope = scope,
1211 };
1133 return &init_node.base;
12121134 }
12131135 cat_tok = try appendToken(rp.c, .PlusPlus, "++");
12141136 }
......@@ -1216,7 +1138,7 @@ fn transInitListExpr(
12161138 const dot_tok = try appendToken(rp.c, .Period, ".");
12171139 var filler_init_node = try transCreateNodeArrayInitializer(rp.c, dot_tok);
12181140 const filler_val_expr = ZigClangInitListExpr_getArrayFiller(expr);
1219 try filler_init_node.op.ArrayInitializer.push((try transExpr(rp, scope, filler_val_expr, .used, .r_value)).node);
1141 try filler_init_node.op.ArrayInitializer.push(try transExpr(rp, scope, filler_val_expr, .used, .r_value));
12201142 filler_init_node.rtoken = try appendToken(rp.c, .RBrace, "}");
12211143
12221144 const rhs_node = if (leftover_count == 1)
......@@ -1234,11 +1156,7 @@ fn transInitListExpr(
12341156 };
12351157
12361158 if (init_count == 0) {
1237 return TransResult{
1238 .node = rhs_node,
1239 .child_scope = scope,
1240 .node_scope = scope,
1241 };
1159 return rhs_node;
12421160 }
12431161
12441162 const cat_node = try rp.c.a().create(ast.Node.InfixOp);
......@@ -1248,11 +1166,7 @@ fn transInitListExpr(
12481166 .op = .ArrayCat,
12491167 .rhs = rhs_node,
12501168 };
1251 return TransResult{
1252 .node = &cat_node.base,
1253 .child_scope = scope,
1254 .node_scope = scope,
1255 };
1169 return &cat_node.base;
12561170}
12571171
12581172fn transImplicitValueInitExpr(
......@@ -1260,7 +1174,7 @@ fn transImplicitValueInitExpr(
12601174 scope: *Scope,
12611175 expr: *const ZigClangExpr,
12621176 used: ResultUsed,
1263) TransError!TransResult {
1177) TransError!*ast.Node {
12641178 const source_loc = ZigClangExpr_getBeginLoc(expr);
12651179 const qt = getExprQualType(rp.c, expr);
12661180 const ty = ZigClangQualType_getTypePtr(qt);
......@@ -1268,9 +1182,7 @@ fn transImplicitValueInitExpr(
12681182 .Builtin => blk: {
12691183 const builtin_ty = @ptrCast(*const ZigClangBuiltinType, ty);
12701184 switch (ZigClangBuiltinType_getKind(builtin_ty)) {
1271 .Bool => {
1272 break :blk try transCreateNodeBoolLiteral(rp.c, false);
1273 },
1185 .Bool => return transCreateNodeBoolLiteral(rp.c, false),
12741186 .Char_U,
12751187 .UChar,
12761188 .Char_S,
......@@ -1291,30 +1203,13 @@ fn transImplicitValueInitExpr(
12911203 .Float128,
12921204 .Float16,
12931205 .LongDouble,
1294 => {
1295 break :blk try transCreateNodeInt(rp.c, 0);
1296 },
1206 => return transCreateNodeInt(rp.c, 0),
12971207 else => return revertAndWarn(rp, error.UnsupportedType, source_loc, "unsupported builtin type", .{}),
12981208 }
12991209 },
1300 .Pointer => try transCreateNodeNullLiteral(rp.c),
1210 .Pointer => return transCreateNodeNullLiteral(rp.c),
13011211 else => return revertAndWarn(rp, error.UnsupportedType, source_loc, "type does not have an implicit init value", .{}),
13021212 };
1303 return TransResult{
1304 .node = node,
1305 .child_scope = scope,
1306 .node_scope = scope,
1307 };
1308}
1309
1310fn transLookupZigIdentifier(inner: *Scope, c_name: []const u8) []const u8 {
1311 var scope = inner;
1312 while (true) : (scope = scope.parent orelse return c_name) {
1313 if (scope.id == .Var) {
1314 const var_scope = @ptrCast(*const Scope.Var, scope);
1315 if (std.mem.eql(u8, var_scope.c_name, c_name)) return var_scope.zig_name;
1316 }
1317 }
13181213}
13191214
13201215fn transCPtrCast(
......@@ -1358,25 +1253,21 @@ fn maybeSuppressResult(
13581253 rp: RestorePoint,
13591254 scope: *Scope,
13601255 used: ResultUsed,
1361 result: TransResult,
1362) !TransResult {
1256 result: *ast.Node,
1257) TransError!*ast.Node {
13631258 if (used == .used) return result;
13641259 // NOTE: This is backwards, but the semicolon must immediately follow the node.
13651260 _ = try appendToken(rp.c, .Semicolon, ";");
1366 const lhs = try transCreateNodeIdentifier(rp.c, "_", null);
1261 const lhs = try transCreateNodeIdentifier(rp.c, "_");
13671262 const op_token = try appendToken(rp.c, .Equal, "=");
13681263 const op_node = try rp.c.a().create(ast.Node.InfixOp);
13691264 op_node.* = ast.Node.InfixOp{
13701265 .op_token = op_token,
13711266 .lhs = lhs,
13721267 .op = .Assign,
1373 .rhs = result.node,
1374 };
1375 return TransResult{
1376 .node = &op_node.base,
1377 .child_scope = scope,
1378 .node_scope = scope,
1268 .rhs = result,
13791269 };
1270 return &op_node.base;
13801271}
13811272
13821273fn addTopLevelDecl(c: *Context, name: []const u8, decl_node: *ast.Node) !void {
......@@ -1443,7 +1334,7 @@ fn transRecordDecl(c: *Context, record_decl: *const ZigClangRecordDecl) TypeErro
14431334 return node;
14441335 }
14451336
1446 const field_name = try appendIdentifier(c, try c.str(ZigClangDecl_getName_bytes_begin(@ptrCast(*const ZigClangDecl, field_decl))), null);
1337 const field_name = try appendIdentifier(c, try c.str(ZigClangDecl_getName_bytes_begin(@ptrCast(*const ZigClangDecl, field_decl))));
14471338 _ = try appendToken(c, .Colon, ":");
14481339 const field_type = try transQualType(rp, ZigClangFieldDecl_getType(field_decl), field_loc);
14491340
......@@ -1467,7 +1358,7 @@ fn transRecordDecl(c: *Context, record_decl: *const ZigClangRecordDecl) TypeErro
14671358
14681359fn transEnumDecl(c: *Context, enum_decl: *const ZigClangEnumDecl) Error!?*ast.Node {
14691360 if (c.decl_table.get(@ptrToInt(ZigClangEnumDecl_getCanonicalDecl(enum_decl)))) |name|
1470 return try transCreateNodeIdentifier(c, name.value, null); // Avoid processing this decl twice
1361 return try transCreateNodeIdentifier(c, name.value); // Avoid processing this decl twice
14711362 const rp = makeRestorePoint(c);
14721363 const enum_loc = ZigClangEnumDecl_getLocation(enum_decl);
14731364
......@@ -1483,7 +1374,7 @@ fn transEnumDecl(c: *Context, enum_decl: *const ZigClangEnumDecl) Error!?*ast.No
14831374
14841375 const name = try std.fmt.allocPrint(c.a(), "enum_{}", .{bare_name});
14851376 _ = try c.decl_table.put(@ptrToInt(ZigClangEnumDecl_getCanonicalDecl(enum_decl)), name);
1486 const name_tok = try appendIdentifier(c, name, null);
1377 const name_tok = try appendIdentifier(c, name);
14871378 const eq_tok = try appendToken(c, .Equal, "=");
14881379
14891380 const init_node = if (ZigClangEnumDecl_getDefinition(enum_decl)) |enum_def| blk: {
......@@ -1550,7 +1441,7 @@ fn transEnumDecl(c: *Context, enum_decl: *const ZigClangEnumDecl) Error!?*ast.No
15501441 else
15511442 enum_val_name;
15521443
1553 const field_name_tok = try appendIdentifier(c, field_name, null);
1444 const field_name_tok = try appendIdentifier(c, field_name);
15541445
15551446 const int_node = if (!pure_enum) blk: {
15561447 _ = try appendToken(c, .Colon, "=");
......@@ -1603,18 +1494,18 @@ fn transEnumDecl(c: *Context, enum_decl: *const ZigClangEnumDecl) Error!?*ast.No
16031494 try addTopLevelDecl(c, name, &node.base);
16041495 if (!is_unnamed)
16051496 try c.alias_list.push(.{ .alias = bare_name, .name = name });
1606 return transCreateNodeIdentifier(c, name, null);
1497 return transCreateNodeIdentifier(c, name);
16071498}
16081499
16091500fn addEnumTopLevel(c: *Context, enum_name: []const u8, field_name: []const u8, enum_val_name: []const u8) !void {
16101501 const visib_tok = try appendToken(c, .Keyword_pub, "pub");
16111502 const const_tok = try appendToken(c, .Keyword_const, "const");
1612 const name_tok = try appendIdentifier(c, enum_val_name, null);
1503 const name_tok = try appendIdentifier(c, enum_val_name);
16131504 const eq_tok = try appendToken(c, .Equal, "=");
16141505
1615 const enum_ident = try transCreateNodeIdentifier(c, enum_name, null);
1506 const enum_ident = try transCreateNodeIdentifier(c, enum_name);
16161507 const period_tok = try appendToken(c, .Period, ".");
1617 const field_ident = try transCreateNodeIdentifier(c, field_name, null);
1508 const field_ident = try transCreateNodeIdentifier(c, field_name);
16181509
16191510 const field_access_node = try c.a().create(ast.Node.InfixOp);
16201511 field_access_node.* = .{
......@@ -1780,11 +1671,11 @@ fn transCreateNodeAssign(
17801671 _ = try appendToken(rp.c, .Semicolon, ";");
17811672
17821673 const node = try rp.c.a().create(ast.Node.InfixOp);
1783 node.* = ast.Node.InfixOp{
1674 node.* = .{
17841675 .op_token = eq_token,
1785 .lhs = lhs_node.node,
1676 .lhs = lhs_node,
17861677 .op = .Assign,
1787 .rhs = rhs_node.node,
1678 .rhs = rhs_node,
17881679 };
17891680 return node;
17901681 }
......@@ -1864,9 +1755,9 @@ fn transCreateNodeInfixOp(
18641755 const node = try rp.c.a().create(ast.Node.InfixOp);
18651756 node.* = ast.Node.InfixOp{
18661757 .op_token = op_token,
1867 .lhs = lhs.node,
1758 .lhs = lhs,
18681759 .op = op,
1869 .rhs = rhs.node,
1760 .rhs = rhs,
18701761 };
18711762 if (!grouped) return &node.base;
18721763 const rparen = try appendToken(rp.c, .RParen, ")");
......@@ -1896,7 +1787,7 @@ fn transCreateNodePtrType(
18961787 .Identifier => blk: {
18971788 const lbracket = try appendToken(c, .LBracket, "["); // Rendering checks if this token + 2 == .Identifier, so needs to return this token
18981789 _ = try appendToken(c, .Asterisk, "*");
1899 _ = try appendIdentifier(c, "c", null); // not really an identifier
1790 _ = try appendIdentifier(c, "c");
19001791 _ = try appendToken(c, .RBracket, "]");
19011792 break :blk lbracket;
19021793 },
......@@ -2019,7 +1910,7 @@ fn transCreateNodeMacroFn(c: *Context, name: []const u8, ref: *ast.Node, proto_a
20191910 const pub_tok = try appendToken(c, .Keyword_pub, "pub");
20201911 const inline_tok = try appendToken(c, .Keyword_inline, "inline");
20211912 const fn_tok = try appendToken(c, .Keyword_fn, "fn");
2022 const name_tok = try appendIdentifier(c, name, null);
1913 const name_tok = try appendIdentifier(c, name);
20231914 _ = try appendToken(c, .LParen, "(");
20241915
20251916 const proto_alias = proto_alias_node.cast(ast.Node.FnProto).?;
......@@ -2068,7 +1959,7 @@ fn transCreateNodeMacroFn(c: *Context, name: []const u8, ref: *ast.Node, proto_a
20681959 .section_expr = null,
20691960 };
20701961
2071 const block = try transCreateNodeBlock(c, null, null);
1962 const block = try transCreateNodeBlock(c, null);
20721963
20731964 const return_expr = try transCreateNodeReturnExpr(c);
20741965 const unwrap_expr = try transCreateNodeUnwrapNull(c, ref.cast(ast.Node.VarDecl).?.init_node.?);
......@@ -2079,7 +1970,7 @@ fn transCreateNodeMacroFn(c: *Context, name: []const u8, ref: *ast.Node, proto_a
20791970 _ = try appendToken(c, .Comma, ",");
20801971 }
20811972 const param = pn.*.cast(ast.Node.ParamDecl).?;
2082 try call_expr.op.Call.params.push(try transCreateNodeIdentifier(c, tokenSlice(c, param.name_token.?), null));
1973 try call_expr.op.Call.params.push(try transCreateNodeIdentifier(c, tokenSlice(c, param.name_token.?)));
20831974 }
20841975 call_expr.rtoken = try appendToken(c, .RParen, ")");
20851976 return_expr.rhs = &call_expr.base;
......@@ -2107,7 +1998,7 @@ fn transCreateNodeEnumLiteral(c: *Context, name: []const u8) !*ast.Node {
21071998 const node = try c.a().create(ast.Node.EnumLiteral);
21081999 node.* = .{
21092000 .dot = try appendToken(c, .Period, "."),
2110 .name = try appendIdentifier(c, name, null), // scoped to an enum
2001 .name = try appendIdentifier(c, name),
21112002 };
21122003 return &node.base;
21132004}
......@@ -2136,9 +2027,9 @@ fn transCreateNodeElse(c: *Context) !*ast.Node.Else {
21362027 return node;
21372028}
21382029
2139fn transCreateNodeBlock(c: *Context, label: ?[]const u8, scope: ?*Scope) !*ast.Node.Block {
2030fn transCreateNodeBlock(c: *Context, label: ?[]const u8) !*ast.Node.Block {
21402031 const label_node = if (label) |l| blk: {
2141 const ll = try appendIdentifier(c, l, scope);
2032 const ll = try appendIdentifier(c, l);
21422033 _ = try appendToken(c, .Colon, ":");
21432034 break :blk ll;
21442035 } else null;
......@@ -2196,7 +2087,7 @@ fn transType(rp: RestorePoint, ty: *const ZigClangType, source_loc: ZigClangSour
21962087 .Float16 => "f16",
21972088 .LongDouble => "c_longdouble",
21982089 else => return revertAndWarn(rp, error.UnsupportedType, source_loc, "unsupported builtin type", .{}),
2199 }, null);
2090 });
22002091 },
22012092 .FunctionProto => {
22022093 const fn_proto_ty = @ptrCast(*const ZigClangFunctionProtoType, ty);
......@@ -2274,7 +2165,7 @@ fn transType(rp: RestorePoint, ty: *const ZigClangType, source_loc: ZigClangSour
22742165
22752166 const typedef_decl = ZigClangTypedefType_getDecl(typedef_ty);
22762167 const typedef_name = try rp.c.str(ZigClangDecl_getName_bytes_begin(@ptrCast(*const ZigClangDecl, typedef_decl)));
2277 return transCreateNodeIdentifier(rp.c, typedef_name, null);
2168 return transCreateNodeIdentifier(rp.c, typedef_name);
22782169 },
22792170 .Record => {
22802171 const record_ty = @ptrCast(*const ZigClangRecordType, ty);
......@@ -2288,7 +2179,7 @@ fn transType(rp: RestorePoint, ty: *const ZigClangType, source_loc: ZigClangSour
22882179 // };
22892180 const record_decl = ZigClangRecordType_getDecl(record_ty);
22902181 if (try getContainerName(rp, record_decl)) |name|
2291 return transCreateNodeIdentifier(rp.c, name, null)
2182 return transCreateNodeIdentifier(rp.c, name)
22922183 else
22932184 return transRecordDecl(rp.c, record_decl);
22942185 },
......@@ -2426,7 +2317,7 @@ fn finishTransFnProto(
24262317 else
24272318 null;
24282319 const fn_tok = try appendToken(rp.c, .Keyword_fn, "fn");
2429 const name_tok = if (fn_decl_context) |ctx| try appendIdentifier(rp.c, ctx.fn_name, null) else null;
2320 const name_tok = if (fn_decl_context) |ctx| try appendIdentifier(rp.c, ctx.fn_name) else null;
24302321 const lparen_tok = try appendToken(rp.c, .LParen, "(");
24312322
24322323 var fn_params = ast.Node.FnProto.ParamList.init(rp.c.a());
......@@ -2449,7 +2340,7 @@ fn finishTransFnProto(
24492340 break :blk a;
24502341 } else param_name;
24512342
2452 const result = try appendIdentifier(rp.c, checked_param_name, null);
2343 const result = try appendIdentifier(rp.c, checked_param_name);
24532344 _ = try appendToken(rp.c, .Colon, ":");
24542345 break :blk result;
24552346 }
......@@ -2497,12 +2388,12 @@ fn finishTransFnProto(
24972388
24982389 const return_type_node = blk: {
24992390 if (ZigClangFunctionType_getNoReturnAttr(fn_ty)) {
2500 break :blk try transCreateNodeIdentifier(rp.c, "noreturn", null);
2391 break :blk try transCreateNodeIdentifier(rp.c, "noreturn");
25012392 } else {
25022393 const return_qt = ZigClangFunctionType_getReturnType(fn_ty);
25032394 if (isCVoid(return_qt)) {
25042395 // convert primitive c_void to actual void (only for return type)
2505 break :blk try transCreateNodeIdentifier(rp.c, "void", null);
2396 break :blk try transCreateNodeIdentifier(rp.c, "void");
25062397 } else {
25072398 break :blk transQualType(rp, return_qt, source_loc) catch |err| switch (err) {
25082399 error.UnsupportedType => {
......@@ -2555,7 +2446,7 @@ fn emitWarning(c: *Context, loc: ZigClangSourceLocation, comptime format: []cons
25552446fn failDecl(c: *Context, loc: ZigClangSourceLocation, name: []const u8, comptime format: []const u8, args: var) !void {
25562447 // const name = @compileError(msg);
25572448 const const_tok = try appendToken(c, .Keyword_const, "const");
2558 const name_tok = try appendIdentifier(c, name, null);
2449 const name_tok = try appendIdentifier(c, name);
25592450 const eq_tok = try appendToken(c, .Equal, "=");
25602451 const builtin_tok = try appendToken(c, .Builtin, "@compileError");
25612452 const lparen_tok = try appendToken(c, .LParen, "(");
......@@ -2640,11 +2531,7 @@ fn isValidZigIdentifier(name: []const u8) bool {
26402531 return true;
26412532}
26422533
2643fn appendIdentifier(c: *Context, name: []const u8, scope: ?*Scope) !ast.TokenIndex {
2644 if (scope) |s|
2645 if (s.getAlias(name)) |alias| {
2646 return appendTokenFmt(c, .Identifier, "{}", .{alias});
2647 };
2534fn appendIdentifier(c: *Context, name: []const u8) !ast.TokenIndex {
26482535 if (!isValidZigIdentifier(name) or std.zig.Token.getKeyword(name) != null) {
26492536 return appendTokenFmt(c, .Identifier, "@\"{}\"", .{name});
26502537 } else {
......@@ -2652,8 +2539,8 @@ fn appendIdentifier(c: *Context, name: []const u8, scope: ?*Scope) !ast.TokenInd
26522539 }
26532540}
26542541
2655fn transCreateNodeIdentifier(c: *Context, name: []const u8, scope: ?*Scope) !*ast.Node {
2656 const token_index = try appendIdentifier(c, name, scope);
2542fn transCreateNodeIdentifier(c: *Context, name: []const u8) !*ast.Node {
2543 const token_index = try appendIdentifier(c, name);
26572544 const identifier = try c.a().create(ast.Node.Identifier);
26582545 identifier.* = ast.Node.Identifier{
26592546 .base = ast.Node{ .id = ast.Node.Id.Identifier },
......@@ -2740,7 +2627,7 @@ fn transMacroDefine(c: *Context, it: *ctok.TokenList.Iterator, name: []const u8,
27402627
27412628 const visib_tok = try appendToken(c, .Keyword_pub, "pub");
27422629 const mut_tok = try appendToken(c, .Keyword_const, "const");
2743 const name_tok = try appendIdentifier(c, name, null);
2630 const name_tok = try appendIdentifier(c, name);
27442631 const eq_tok = try appendToken(c, .Equal, "=");
27452632
27462633 const init_node = try parseCExpr(rp, it, source_loc, scope);
......@@ -2773,7 +2660,7 @@ fn transMacroFnDefine(c: *Context, it: *ctok.TokenList.Iterator, name: []const u
27732660 const pub_tok = try appendToken(c, .Keyword_pub, "pub");
27742661 const inline_tok = try appendToken(c, .Keyword_inline, "inline");
27752662 const fn_tok = try appendToken(c, .Keyword_fn, "fn");
2776 const name_tok = try appendIdentifier(c, name, null);
2663 const name_tok = try appendIdentifier(c, name);
27772664 _ = try appendToken(c, .LParen, "(");
27782665
27792666 if (it.next().?.id != .LParen) {
......@@ -2790,7 +2677,7 @@ fn transMacroFnDefine(c: *Context, it: *ctok.TokenList.Iterator, name: []const u
27902677 break :blk alias;
27912678 } else param_tok.bytes;
27922679
2793 const param_name_tok = try appendIdentifier(c, checked_name, null);
2680 const param_name_tok = try appendIdentifier(c, checked_name);
27942681 _ = try appendToken(c, .Colon, ":");
27952682
27962683 const token_index = try appendToken(c, .Keyword_var, "var");
......@@ -2843,7 +2730,7 @@ fn transMacroFnDefine(c: *Context, it: *ctok.TokenList.Iterator, name: []const u
28432730 .section_expr = null,
28442731 };
28452732
2846 const block = try transCreateNodeBlock(c, null, null);
2733 const block = try transCreateNodeBlock(c, null);
28472734
28482735 const return_expr = try transCreateNodeReturnExpr(c);
28492736 const expr = try parseCExpr(rp, it, source_loc, scope);
......@@ -2888,7 +2775,7 @@ fn parseCNumLit(rp: RestorePoint, tok: *CToken, source_loc: ZigClangSourceLocati
28882775 .LL => "c_longlong",
28892776 .LLU => "c_ulonglong",
28902777 else => unreachable,
2891 }, null));
2778 }));
28922779 _ = try appendToken(rp.c, .Comma, ",");
28932780 try cast_node.params.push(try transCreateNodeInt(rp.c, tok.bytes));
28942781 cast_node.rparen_token = try appendToken(rp.c, .RParen, ")");
......@@ -2902,7 +2789,7 @@ fn parseCNumLit(rp: RestorePoint, tok: *CToken, source_loc: ZigClangSourceLocati
29022789 .F => "f32",
29032790 .L => "f64",
29042791 else => unreachable,
2905 }, null));
2792 }));
29062793 _ = try appendToken(rp.c, .Comma, ",");
29072794 try cast_node.params.push(try transCreateNodeFloat(rp.c, tok.bytes));
29082795 cast_node.rparen_token = try appendToken(rp.c, .RParen, ")");
......@@ -2939,7 +2826,10 @@ fn parseCPrimaryExpr(rp: RestorePoint, it: *ctok.TokenList.Iterator, source_loc:
29392826 .NumLitInt, .NumLitFloat => {
29402827 return parseCNumLit(rp, tok, source_loc);
29412828 },
2942 .Identifier => return transCreateNodeIdentifier(rp.c, tok.bytes, scope),
2829 .Identifier => {
2830 const name = if (scope.getAlias(tok.bytes)) |a| a else tok.bytes;
2831 return transCreateNodeIdentifier(rp.c, name);
2832 },
29432833 .LParen => {
29442834 const inner_node = try parseCExpr(rp, it, source_loc, scope);
29452835
......@@ -3060,7 +2950,7 @@ fn parseCSuffixOpExpr(rp: RestorePoint, it: *ctok.TokenList.Iterator, source_loc
30602950 );
30612951
30622952 const op_token = try appendToken(rp.c, .Period, ".");
3063 const rhs = try transCreateNodeIdentifier(rp.c, name_tok.bytes, null); // TODO scope);
2953 const rhs = try transCreateNodeIdentifier(rp.c, name_tok.bytes);
30642954 const access_node = try rp.c.a().create(ast.Node.InfixOp);
30652955 access_node.* = .{
30662956 .op_token = op_token,
test/translate_c.zig+30-3
......@@ -637,11 +637,11 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
637637 \\pub extern var glProcs: union_OpenGLProcs;
638638 ,
639639 \\pub const glClearPFN = PFNGLCLEARPROC;
640 // , // TODO
640 // , // TODO
641641 // \\pub inline fn glClearUnion(arg_1: GLbitfield) void {
642642 // \\ return glProcs.gl.Clear.?(arg_1);
643643 // \\}
644 ,
644 ,
645645 \\pub const OpenGLProcs = union_OpenGLProcs;
646646 });
647647
......@@ -671,6 +671,34 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
671671 \\pub const FOO2 = "aoeu\x07 derp";
672672 });
673673
674 cases.add_2("variable aliasing",
675 \\static long a = 2;
676 \\static long b = 2;
677 \\static int c = 4;
678 \\void foo(char c) {
679 \\ int a;
680 \\ char b = 123;
681 \\ b = (char) a;
682 \\ {
683 \\ int d = 5;
684 \\ }
685 \\ unsigned d = 440;
686 \\}
687 , &[_][]const u8{
688 \\pub var a: c_long = @as(c_long, 2);
689 \\pub var b: c_long = @as(c_long, 2);
690 \\pub var c: c_int = 4;
691 \\pub export fn foo(c_1: u8) void {
692 \\ var a_2: c_int = undefined;
693 \\ var b_3: u8 = @as(u8, 123);
694 \\ b_3 = @as(u8, a_2);
695 \\ {
696 \\ var d: c_int = 5;
697 \\ }
698 \\ var d: c_uint = @as(c_uint, 440);
699 \\}
700 });
701
674702 /////////////// Cases for only stage1 which are TODO items for stage2 ////////////////
675703
676704 if (builtin.os != builtin.Os.windows) {
......@@ -2059,5 +2087,4 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
20592087 , &[_][]const u8{
20602088 \\pub const NRF_GPIO = if (@typeId(@TypeOf(NRF_GPIO_BASE)) == @import("builtin").TypeId.Pointer) @ptrCast([*c]NRF_GPIO_Type, NRF_GPIO_BASE) else if (@typeId(@TypeOf(NRF_GPIO_BASE)) == @import("builtin").TypeId.Int) @intToPtr([*c]NRF_GPIO_Type, NRF_GPIO_BASE) else @as([*c]NRF_GPIO_Type, NRF_GPIO_BASE);
20612089 });
2062
20632090}