authorgravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2019-12-16 09:55:37+02:00
committergravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2019-12-16 10:39:31+02:00
loga37caaa5285ed6c040675a94dbd639e881ad72b6
tree815bd1979e12a714b8911821ecfa3e4c165ae027
parent620bf695e8d595c67acbf1457a8a14a7013a8522
signature Commit is signed but in an unrecognized format.

translate-c-2 parameter name aliasing


4 files changed, 235 insertions(+), 140 deletions(-)

src-self-hosted/clang.zig+8-8
......@@ -764,14 +764,14 @@ pub extern fn ZigClangEnumDecl_enumerator_end(*const ZigClangEnumDecl) ZigClangE
764764pub extern fn ZigClangEnumDecl_enumerator_iterator_next(ZigClangEnumDecl_enumerator_iterator) ZigClangEnumDecl_enumerator_iterator;
765765pub extern fn ZigClangEnumDecl_enumerator_iterator_deref(ZigClangEnumDecl_enumerator_iterator) *const ZigClangEnumConstantDecl;
766766pub extern fn ZigClangEnumDecl_enumerator_iterator_neq(ZigClangEnumDecl_enumerator_iterator, ZigClangEnumDecl_enumerator_iterator) bool;
767pub extern fn ZigClangDecl_getName_bytes_begin(decl: ?*const struct_ZigClangDecl) [*c]const u8;
767pub extern fn ZigClangDecl_getName_bytes_begin(decl: ?*const struct_ZigClangDecl) [*:0]const u8;
768768pub extern fn ZigClangSourceLocation_eq(a: struct_ZigClangSourceLocation, b: struct_ZigClangSourceLocation) bool;
769769pub extern fn ZigClangTypedefType_getDecl(self: ?*const struct_ZigClangTypedefType) *const struct_ZigClangTypedefNameDecl;
770770pub extern fn ZigClangTypedefNameDecl_getUnderlyingType(self: ?*const struct_ZigClangTypedefNameDecl) struct_ZigClangQualType;
771771pub extern fn ZigClangQualType_getCanonicalType(self: struct_ZigClangQualType) struct_ZigClangQualType;
772772pub extern fn ZigClangQualType_getTypeClass(self: struct_ZigClangQualType) ZigClangTypeClass;
773773pub extern fn ZigClangQualType_getTypePtr(self: struct_ZigClangQualType) *const struct_ZigClangType;
774pub extern fn ZigClangQualType_addConst(self: [*c]struct_ZigClangQualType) void;
774pub extern fn ZigClangQualType_addConst(self: *struct_ZigClangQualType) void;
775775pub extern fn ZigClangQualType_eq(self: struct_ZigClangQualType, arg1: struct_ZigClangQualType) bool;
776776pub extern fn ZigClangQualType_isConstQualified(self: struct_ZigClangQualType) bool;
777777pub extern fn ZigClangQualType_isVolatileQualified(self: struct_ZigClangQualType) bool;
......@@ -799,7 +799,7 @@ pub extern fn ZigClangAPSInt_isSigned(self: ?*const struct_ZigClangAPSInt) bool;
799799pub extern fn ZigClangAPSInt_isNegative(self: ?*const struct_ZigClangAPSInt) bool;
800800pub extern fn ZigClangAPSInt_negate(self: ?*const struct_ZigClangAPSInt) ?*const struct_ZigClangAPSInt;
801801pub extern fn ZigClangAPSInt_free(self: ?*const struct_ZigClangAPSInt) void;
802pub extern fn ZigClangAPSInt_getRawData(self: ?*const struct_ZigClangAPSInt) [*c]const u64;
802pub extern fn ZigClangAPSInt_getRawData(self: ?*const struct_ZigClangAPSInt) [*:0]const u64;
803803pub extern fn ZigClangAPSInt_getNumWords(self: ?*const struct_ZigClangAPSInt) c_uint;
804804
805805pub extern fn ZigClangAPInt_getLimitedValue(self: *const struct_ZigClangAPInt, limit: u64) u64;
......@@ -931,25 +931,25 @@ pub const struct_ZigClangAPValueLValueBase = extern struct {
931931 Version: c_uint,
932932};
933933
934pub extern fn ZigClangErrorMsg_delete(ptr: [*c]Stage2ErrorMsg, len: usize) void;
934pub extern fn ZigClangErrorMsg_delete(ptr: [*]Stage2ErrorMsg, len: usize) void;
935935
936936pub extern fn ZigClangLoadFromCommandLine(
937937 args_begin: [*]?[*]const u8,
938938 args_end: [*]?[*]const u8,
939939 errors_ptr: *[*]Stage2ErrorMsg,
940940 errors_len: *usize,
941 resources_path: [*c]const u8,
941 resources_path: [*:0]const u8,
942942) ?*ZigClangASTUnit;
943943
944944pub extern fn ZigClangDecl_getKind(decl: *const ZigClangDecl) ZigClangDeclKind;
945945pub extern fn ZigClangDecl_getDeclKindName(decl: *const struct_ZigClangDecl) [*:0]const u8;
946946
947pub const ZigClangCompoundStmt_const_body_iterator = [*c]const *struct_ZigClangStmt;
947pub const ZigClangCompoundStmt_const_body_iterator = [*]const *struct_ZigClangStmt;
948948
949949pub extern fn ZigClangCompoundStmt_body_begin(self: *const ZigClangCompoundStmt) ZigClangCompoundStmt_const_body_iterator;
950950pub extern fn ZigClangCompoundStmt_body_end(self: *const ZigClangCompoundStmt) ZigClangCompoundStmt_const_body_iterator;
951951
952pub const ZigClangDeclStmt_const_decl_iterator = [*c]const *struct_ZigClangDecl;
952pub const ZigClangDeclStmt_const_decl_iterator = [*]const *struct_ZigClangDecl;
953953
954954pub extern fn ZigClangDeclStmt_decl_begin(self: *const ZigClangDeclStmt) ZigClangDeclStmt_const_decl_iterator;
955955pub extern fn ZigClangDeclStmt_decl_end(self: *const ZigClangDeclStmt) ZigClangDeclStmt_const_decl_iterator;
......@@ -1017,7 +1017,7 @@ pub extern fn ZigClangBinaryOperator_getType(*const ZigClangBinaryOperator) ZigC
10171017pub extern fn ZigClangDecayedType_getDecayedType(*const ZigClangDecayedType) ZigClangQualType;
10181018
10191019pub extern fn ZigClangStringLiteral_getKind(*const ZigClangStringLiteral) ZigClangStringLiteral_StringKind;
1020pub extern fn ZigClangStringLiteral_getString_bytes_begin_size(*const ZigClangStringLiteral, *usize) [*c]const u8;
1020pub extern fn ZigClangStringLiteral_getString_bytes_begin_size(*const ZigClangStringLiteral, *usize) [*]const u8;
10211021
10221022pub extern fn ZigClangParenExpr_getSubExpr(*const ZigClangParenExpr) *const ZigClangExpr;
10231023
src-self-hosted/stage1.zig+1-1
......@@ -93,7 +93,7 @@ export fn stage2_translate_c(
9393 out_errors_len: *usize,
9494 args_begin: [*]?[*]const u8,
9595 args_end: [*]?[*]const u8,
96 resources_path: [*]const u8,
96 resources_path: [*:0]const u8,
9797) Error {
9898 var errors: []translate_c.ClangErrMsg = undefined;
9999 out_ast.* = translate_c.translate(std.heap.c_allocator, args_begin, args_end, &errors, resources_path) catch |err| switch (err) {
src-self-hosted/translate_c.zig+221-129
......@@ -49,7 +49,9 @@ const Scope = struct {
4949 Block,
5050 Root,
5151 While,
52 FnDef,
5253 };
54
5355 const Switch = struct {
5456 base: Scope,
5557 };
......@@ -65,21 +67,14 @@ const Scope = struct {
6567 block_node: *ast.Node.Block,
6668
6769 /// Don't forget to set rbrace token later
68 fn create(c: *Context, parent: *Scope, lbrace_tok: ast.TokenIndex) !*Block {
70 fn init(c: *Context, parent: *Scope, block_node: *ast.Node.Block) !*Block {
6971 const block = try c.a().create(Block);
70 block.* = Block{
71 .base = Scope{
72 .id = Id.Block,
72 block.* = .{
73 .base = .{
74 .id = .Block,
7375 .parent = parent,
7476 },
75 .block_node = try c.a().create(ast.Node.Block),
76 };
77 block.block_node.* = ast.Node.Block{
78 .base = ast.Node{ .id = ast.Node.Id.Block },
79 .label = null,
80 .lbrace = lbrace_tok,
81 .statements = ast.Node.Block.StatementList.init(c.a()),
82 .rbrace = undefined,
77 .block_node = block_node,
8378 };
8479 return block;
8580 }
......@@ -87,11 +82,91 @@ const Scope = struct {
8782
8883 const Root = struct {
8984 base: Scope,
85 sym_table: SymbolTable,
86 macro_table: SymbolTable,
87
88 fn init(c: *Context) Root {
89 return .{
90 .base = .{
91 .id = .Root,
92 .parent = null,
93 },
94 .sym_table = SymbolTable.init(c.a()),
95 .macro_table = SymbolTable.init(c.a()),
96 };
97 }
98
99 fn contains(scope: *Root, name: []const u8) bool {
100 return scope.sym_table.contains(name) or scope.macro_table.contains(name);
101 }
90102 };
91103
92104 const While = struct {
93105 base: Scope,
94106 };
107
108 const FnDef = struct {
109 base: Scope,
110 params: AliasList,
111
112 fn init(c: *Context) FnDef {
113 return .{
114 .base = .{
115 .id = .FnDef,
116 .parent = &c.global_scope.base,
117 },
118 .params = AliasList.init(c.a()),
119 };
120 }
121
122 fn getAlias(scope: *FnDef, name: []const u8) ?[]const u8 {
123 var it = scope.params.iterator(0);
124 while (it.next()) |p| {
125 if (std.mem.eql(u8, p.name, name))
126 return p.alias;
127 }
128 return scope.base.parent.?.getAlias(name);
129 }
130
131 fn contains(scope: *FnDef, name: []const u8) bool {
132 var it = scope.params.iterator(0);
133 while (it.next()) |p| {
134 if (std.mem.eql(u8, p.name, name))
135 return true;
136 }
137 return scope.base.parent.?.contains(name);
138 }
139 };
140
141 fn findBlockScope(inner: *Scope) *Scope.Block {
142 var scope = inner;
143 while (true) : (scope = scope.parent orelse unreachable) {
144 if (scope.id == .Block) return @fieldParentPtr(Scope.Block, "base", scope);
145 }
146 }
147
148 fn createAlias(scope: *Scope, c: *Context, name: []const u8) !?[]const u8 {
149 if (scope.contains(name)) {
150 return try std.fmt.allocPrint(c.a(), "{}_{}", .{ name, c.getMangle() });
151 }
152 return null;
153 }
154
155 fn getAlias(scope: *Scope, name: []const u8) ?[]const u8 {
156 return switch (scope.id) {
157 .Root => null,
158 .FnDef => @fieldParentPtr(FnDef, "base", scope).getAlias(name),
159 else => @panic("TODO Scope.getAlias"),
160 };
161 }
162
163 fn contains(scope: *Scope, name: []const u8) bool {
164 return switch (scope.id) {
165 .Root => @fieldParentPtr(Root, "base", scope).contains(name),
166 .FnDef => @fieldParentPtr(FnDef, "base", scope).contains(name),
167 else => @panic("TODO Scope.contains"),
168 };
169 }
95170};
96171
97172const TransResult = struct {
......@@ -107,8 +182,6 @@ const Context = struct {
107182 source_manager: *ZigClangSourceManager,
108183 decl_table: DeclTable,
109184 alias_list: AliasList,
110 sym_table: SymbolTable,
111 macro_table: SymbolTable,
112185 global_scope: *Scope.Root,
113186 ptr_params: std.BufSet,
114187 clang_context: *ZigClangASTContext,
......@@ -145,7 +218,7 @@ pub fn translate(
145218 args_begin: [*]?[*]const u8,
146219 args_end: [*]?[*]const u8,
147220 errors: *[]ClangErrMsg,
148 resources_path: [*]const u8,
221 resources_path: [*:0]const u8,
149222) !*ast.Tree {
150223 const ast_unit = ZigClangLoadFromCommandLine(
151224 args_begin,
......@@ -195,18 +268,11 @@ pub fn translate(
195268 .err = undefined,
196269 .decl_table = DeclTable.init(arena),
197270 .alias_list = AliasList.init(arena),
198 .sym_table = SymbolTable.init(arena),
199 .macro_table = SymbolTable.init(arena),
200271 .global_scope = try arena.create(Scope.Root),
201272 .ptr_params = std.BufSet.init(arena),
202273 .clang_context = ZigClangASTUnit_getASTContext(ast_unit).?,
203274 };
204 context.global_scope.* = Scope.Root{
205 .base = Scope{
206 .id = Scope.Id.Root,
207 .parent = null,
208 },
209 };
275 context.global_scope.* = Scope.Root.init(&context);
210276
211277 if (!ZigClangASTUnit_visitLocalTopLevelDecls(ast_unit, &context, declVisitorC)) {
212278 return context.err;
......@@ -217,7 +283,7 @@ pub fn translate(
217283 try addMacros(&context);
218284 var it = context.alias_list.iterator(0);
219285 while (it.next()) |alias| {
220 if (!context.sym_table.contains(alias.alias)) {
286 if (!context.global_scope.sym_table.contains(alias.alias)) {
221287 try createAlias(&context, alias);
222288 }
223289 }
......@@ -276,7 +342,8 @@ fn visitFnDecl(c: *Context, fn_decl: *const ZigClangFunctionDecl) Error!void {
276342 const fn_decl_loc = ZigClangFunctionDecl_getLocation(fn_decl);
277343 const fn_qt = ZigClangFunctionDecl_getType(fn_decl);
278344 const fn_type = ZigClangQualType_getTypePtr(fn_qt);
279 var scope = &c.global_scope.base;
345 var fndef_scope = Scope.FnDef.init(c);
346 var scope = &fndef_scope.base;
280347 const has_body = ZigClangFunctionDecl_hasBody(fn_decl);
281348 const storage_class = ZigClangFunctionDecl_getStorageClass(fn_decl);
282349 const decl_ctx = FnDeclContext{
......@@ -343,7 +410,7 @@ fn visitVarDecl(c: *Context, var_decl: *const ZigClangVarDecl) Error!void {
343410 else
344411 try appendToken(c, .Keyword_threadlocal, "threadlocal");
345412
346 var scope = &c.global_scope.base;
413 const scope = &c.global_scope.base;
347414 const var_name = try c.str(ZigClangDecl_getName_bytes_begin(@ptrCast(*const ZigClangDecl, var_decl)));
348415 _ = try c.decl_table.put(@ptrToInt(var_decl), var_name);
349416 const var_decl_loc = ZigClangVarDecl_getLocation(var_decl);
......@@ -364,7 +431,7 @@ fn visitVarDecl(c: *Context, var_decl: *const ZigClangVarDecl) Error!void {
364431 else
365432 try appendToken(c, .Keyword_var, "var");
366433
367 const name_tok = try appendIdentifier(c, var_name);
434 const name_tok = try appendIdentifier(c, var_name, null);
368435
369436 _ = try appendToken(c, .Colon, ":");
370437 const type_node = transQualType(rp, qual_type, var_decl_loc) catch |err| switch (err) {
......@@ -425,7 +492,7 @@ fn resolveTypeDef(c: *Context, typedef_decl: *const ZigClangTypedefNameDecl) Err
425492
426493 const typedef_name = try c.str(ZigClangDecl_getName_bytes_begin(@ptrCast(*const ZigClangDecl, typedef_decl)));
427494 _ = try c.decl_table.put(@ptrToInt(ZigClangTypedefNameDecl_getCanonicalDecl(typedef_decl)), typedef_name);
428 const name_tok = try appendIdentifier(c, typedef_name);
495 const name_tok = try appendIdentifier(c, typedef_name, null);
429496 const eq_tok = try appendToken(c, .Equal, "=");
430497
431498 const child_qt = ZigClangTypedefNameDecl_getUnderlyingType(typedef_decl);
......@@ -478,7 +545,7 @@ fn resolveRecordDecl(c: *Context, record_decl: *const ZigClangRecordDecl) Error!
478545
479546 const name = try std.fmt.allocPrint(c.a(), "{}_{}", .{ container_kind_name, bare_name });
480547 _ = try c.decl_table.put(@ptrToInt(ZigClangRecordDecl_getCanonicalDecl(record_decl)), name);
481 const name_tok = try appendIdentifier(c, name);
548 const name_tok = try appendIdentifier(c, name, null);
482549
483550 const eq_tok = try appendToken(c, .Equal, "=");
484551 const init_node = transRecordDecl(c, record_decl) catch |err| switch (err) {
......@@ -514,10 +581,10 @@ fn resolveRecordDecl(c: *Context, record_decl: *const ZigClangRecordDecl) Error!
514581fn createAlias(c: *Context, alias: var) !void {
515582 const visib_tok = try appendToken(c, .Keyword_pub, "pub");
516583 const mut_tok = try appendToken(c, .Keyword_const, "const");
517 const name_tok = try appendIdentifier(c, alias.alias);
584 const name_tok = try appendIdentifier(c, alias.alias, null);
518585
519586 const eq_tok = try appendToken(c, .Equal, "=");
520 const init_node = try transCreateNodeIdentifier(c, alias.name);
587 const init_node = try transCreateNodeIdentifier(c, alias.name, null);
521588
522589 const node = try c.a().create(ast.Node.VarDecl);
523590 node.* = ast.Node.VarDecl{
......@@ -731,7 +798,7 @@ fn transCompoundStmtInline(
731798 const end_it = ZigClangCompoundStmt_body_end(stmt);
732799 var scope = parent_scope;
733800 while (it != end_it) : (it += 1) {
734 const result = try transStmt(rp, parent_scope, it.*, .unused, .r_value);
801 const result = try transStmt(rp, parent_scope, it[0], .unused, .r_value);
735802 scope = result.child_scope;
736803 if (result.node != &block_node.base)
737804 try block_node.statements.push(result.node);
......@@ -743,13 +810,13 @@ fn transCompoundStmtInline(
743810 };
744811}
745812
746fn transCompoundStmt(rp: RestorePoint, scope: *Scope, stmt: *const ZigClangCompoundStmt) !TransResult {
747 const lbrace_tok = try appendToken(rp.c, .LBrace, "{");
748 const block_scope = try Scope.Block.create(rp.c, scope, lbrace_tok);
749 const inline_result = try transCompoundStmtInline(rp, &block_scope.base, stmt, block_scope.block_node);
750 block_scope.block_node.rbrace = try appendToken(rp.c, .RBrace, "}");
813fn transCompoundStmt(rp: RestorePoint, scope: *Scope, stmt: *const ZigClangCompoundStmt) TransError!TransResult {
814 const block_node = try transCreateNodeBlock(rp.c, null, null);
815 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);
817 block_node.rbrace = try appendToken(rp.c, .RBrace, "}");
751818 return TransResult{
752 .node = &block_scope.block_node.base,
819 .node = &block_node.base,
753820 .node_scope = inline_result.node_scope,
754821 .child_scope = inline_result.child_scope,
755822 };
......@@ -779,17 +846,17 @@ fn transCStyleCastExprClass(
779846 return maybeSuppressResult(rp, scope, result_used, cast_res);
780847}
781848
782fn transDeclStmt(rp: RestorePoint, parent_scope: *Scope, stmt: *const ZigClangDeclStmt) !TransResult {
849fn transDeclStmt(rp: RestorePoint, parent_scope: *Scope, stmt: *const ZigClangDeclStmt) TransError!TransResult {
783850 const c = rp.c;
784 const block_scope = findBlockScope(parent_scope);
851 const block_scope = parent_scope.findBlockScope();
785852 var scope = parent_scope;
786853
787854 var it = ZigClangDeclStmt_decl_begin(stmt);
788855 const end_it = ZigClangDeclStmt_decl_end(stmt);
789856 while (it != end_it) : (it += 1) {
790 switch (ZigClangDecl_getKind(it.*)) {
857 switch (ZigClangDecl_getKind(it[0])) {
791858 .Var => {
792 const var_decl = @ptrCast(*const ZigClangVarDecl, it.*);
859 const var_decl = @ptrCast(*const ZigClangVarDecl, it[0]);
793860
794861 const thread_local_token = if (ZigClangVarDecl_getTLSKind(var_decl) == .None)
795862 null
......@@ -803,7 +870,7 @@ fn transDeclStmt(rp: RestorePoint, parent_scope: *Scope, stmt: *const ZigClangDe
803870 const c_name = try c.str(ZigClangDecl_getName_bytes_begin(
804871 @ptrCast(*const ZigClangDecl, var_decl),
805872 ));
806 const name_token = try appendIdentifier(c, c_name);
873 const name_token = try appendIdentifier(c, c_name, null); // TODO parent_scope);
807874
808875 const var_scope = try c.a().create(Scope.Var);
809876 var_scope.* = Scope.Var{
......@@ -871,7 +938,7 @@ fn transDeclRefExpr(
871938 const c_name = try rp.c.str(ZigClangDecl_getName_bytes_begin(@ptrCast(*const ZigClangDecl, value_decl)));
872939 const zig_name = transLookupZigIdentifier(scope, c_name);
873940 if (lrvalue == .l_value) try rp.c.ptr_params.put(zig_name);
874 const node = try transCreateNodeIdentifier(rp.c, zig_name);
941 const node = try transCreateNodeIdentifier(rp.c, zig_name, null); // TODO scope);
875942 return TransResult{
876943 .node = node,
877944 .node_scope = scope,
......@@ -1240,13 +1307,6 @@ fn transImplicitValueInitExpr(
12401307 };
12411308}
12421309
1243fn findBlockScope(inner: *Scope) *Scope.Block {
1244 var scope = inner;
1245 while (true) : (scope = scope.parent orelse unreachable) {
1246 if (scope.id == .Block) return @fieldParentPtr(Scope.Block, "base", scope);
1247 }
1248}
1249
12501310fn transLookupZigIdentifier(inner: *Scope, c_name: []const u8) []const u8 {
12511311 var scope = inner;
12521312 while (true) : (scope = scope.parent orelse return c_name) {
......@@ -1303,7 +1363,7 @@ fn maybeSuppressResult(
13031363 if (used == .used) return result;
13041364 // NOTE: This is backwards, but the semicolon must immediately follow the node.
13051365 _ = try appendToken(rp.c, .Semicolon, ";");
1306 const lhs = try transCreateNodeIdentifier(rp.c, "_");
1366 const lhs = try transCreateNodeIdentifier(rp.c, "_", null);
13071367 const op_token = try appendToken(rp.c, .Equal, "=");
13081368 const op_node = try rp.c.a().create(ast.Node.InfixOp);
13091369 op_node.* = ast.Node.InfixOp{
......@@ -1321,7 +1381,7 @@ fn maybeSuppressResult(
13211381
13221382fn addTopLevelDecl(c: *Context, name: []const u8, decl_node: *ast.Node) !void {
13231383 try c.tree.root_node.decls.push(decl_node);
1324 _ = try c.sym_table.put(name, decl_node);
1384 _ = try c.global_scope.sym_table.put(name, decl_node);
13251385}
13261386
13271387fn transQualType(rp: RestorePoint, qt: ZigClangQualType, source_loc: ZigClangSourceLocation) TypeError!*ast.Node {
......@@ -1383,7 +1443,7 @@ fn transRecordDecl(c: *Context, record_decl: *const ZigClangRecordDecl) TypeErro
13831443 return node;
13841444 }
13851445
1386 const field_name = try appendIdentifier(c, try c.str(ZigClangDecl_getName_bytes_begin(@ptrCast(*const ZigClangDecl, field_decl))));
1446 const field_name = try appendIdentifier(c, try c.str(ZigClangDecl_getName_bytes_begin(@ptrCast(*const ZigClangDecl, field_decl))), null);
13871447 _ = try appendToken(c, .Colon, ":");
13881448 const field_type = try transQualType(rp, ZigClangFieldDecl_getType(field_decl), field_loc);
13891449
......@@ -1407,7 +1467,7 @@ fn transRecordDecl(c: *Context, record_decl: *const ZigClangRecordDecl) TypeErro
14071467
14081468fn transEnumDecl(c: *Context, enum_decl: *const ZigClangEnumDecl) Error!?*ast.Node {
14091469 if (c.decl_table.get(@ptrToInt(ZigClangEnumDecl_getCanonicalDecl(enum_decl)))) |name|
1410 return try transCreateNodeIdentifier(c, name.value); // Avoid processing this decl twice
1470 return try transCreateNodeIdentifier(c, name.value, null); // Avoid processing this decl twice
14111471 const rp = makeRestorePoint(c);
14121472 const enum_loc = ZigClangEnumDecl_getLocation(enum_decl);
14131473
......@@ -1423,7 +1483,7 @@ fn transEnumDecl(c: *Context, enum_decl: *const ZigClangEnumDecl) Error!?*ast.No
14231483
14241484 const name = try std.fmt.allocPrint(c.a(), "enum_{}", .{bare_name});
14251485 _ = try c.decl_table.put(@ptrToInt(ZigClangEnumDecl_getCanonicalDecl(enum_decl)), name);
1426 const name_tok = try appendIdentifier(c, name);
1486 const name_tok = try appendIdentifier(c, name, null);
14271487 const eq_tok = try appendToken(c, .Equal, "=");
14281488
14291489 const init_node = if (ZigClangEnumDecl_getDefinition(enum_decl)) |enum_def| blk: {
......@@ -1490,7 +1550,7 @@ fn transEnumDecl(c: *Context, enum_decl: *const ZigClangEnumDecl) Error!?*ast.No
14901550 else
14911551 enum_val_name;
14921552
1493 const field_name_tok = try appendIdentifier(c, field_name);
1553 const field_name_tok = try appendIdentifier(c, field_name, null);
14941554
14951555 const int_node = if (!pure_enum) blk: {
14961556 _ = try appendToken(c, .Colon, "=");
......@@ -1543,18 +1603,18 @@ fn transEnumDecl(c: *Context, enum_decl: *const ZigClangEnumDecl) Error!?*ast.No
15431603 try addTopLevelDecl(c, name, &node.base);
15441604 if (!is_unnamed)
15451605 try c.alias_list.push(.{ .alias = bare_name, .name = name });
1546 return transCreateNodeIdentifier(c, name);
1606 return transCreateNodeIdentifier(c, name, null);
15471607}
15481608
15491609fn addEnumTopLevel(c: *Context, enum_name: []const u8, field_name: []const u8, enum_val_name: []const u8) !void {
15501610 const visib_tok = try appendToken(c, .Keyword_pub, "pub");
15511611 const const_tok = try appendToken(c, .Keyword_const, "const");
1552 const name_tok = try appendIdentifier(c, enum_val_name);
1612 const name_tok = try appendIdentifier(c, enum_val_name, null);
15531613 const eq_tok = try appendToken(c, .Equal, "=");
15541614
1555 const enum_ident = try transCreateNodeIdentifier(c, enum_name);
1615 const enum_ident = try transCreateNodeIdentifier(c, enum_name, null);
15561616 const period_tok = try appendToken(c, .Period, ".");
1557 const field_ident = try transCreateNodeIdentifier(c, field_name);
1617 const field_ident = try transCreateNodeIdentifier(c, field_name, null);
15581618
15591619 const field_access_node = try c.a().create(ast.Node.InfixOp);
15601620 field_access_node.* = .{
......@@ -1836,7 +1896,7 @@ fn transCreateNodePtrType(
18361896 .Identifier => blk: {
18371897 const lbracket = try appendToken(c, .LBracket, "["); // Rendering checks if this token + 2 == .Identifier, so needs to return this token
18381898 _ = try appendToken(c, .Asterisk, "*");
1839 _ = try appendIdentifier(c, "c");
1899 _ = try appendIdentifier(c, "c", null); // not really an identifier
18401900 _ = try appendToken(c, .RBracket, "]");
18411901 break :blk lbracket;
18421902 },
......@@ -1954,10 +2014,12 @@ fn transCreateNodeOpaqueType(c: *Context) !*ast.Node {
19542014}
19552015
19562016fn transCreateNodeMacroFn(c: *Context, name: []const u8, ref: *ast.Node, proto_alias_node: *ast.Node) !*ast.Node {
2017 const scope = &c.global_scope.base;
2018
19572019 const pub_tok = try appendToken(c, .Keyword_pub, "pub");
19582020 const inline_tok = try appendToken(c, .Keyword_inline, "inline");
19592021 const fn_tok = try appendToken(c, .Keyword_fn, "fn");
1960 const name_tok = try appendIdentifier(c, name);
2022 const name_tok = try appendIdentifier(c, name, null);
19612023 _ = try appendToken(c, .LParen, "(");
19622024
19632025 const proto_alias = proto_alias_node.cast(ast.Node.FnProto).?;
......@@ -2006,13 +2068,7 @@ fn transCreateNodeMacroFn(c: *Context, name: []const u8, ref: *ast.Node, proto_a
20062068 .section_expr = null,
20072069 };
20082070
2009 const block = try c.a().create(ast.Node.Block);
2010 block.* = .{
2011 .label = null,
2012 .lbrace = try appendToken(c, .LBrace, "{"),
2013 .statements = ast.Node.Block.StatementList.init(c.a()),
2014 .rbrace = undefined,
2015 };
2071 const block = try transCreateNodeBlock(c, null, null);
20162072
20172073 const return_expr = try transCreateNodeReturnExpr(c);
20182074 const unwrap_expr = try transCreateNodeUnwrapNull(c, ref.cast(ast.Node.VarDecl).?.init_node.?);
......@@ -2023,7 +2079,7 @@ fn transCreateNodeMacroFn(c: *Context, name: []const u8, ref: *ast.Node, proto_a
20232079 _ = try appendToken(c, .Comma, ",");
20242080 }
20252081 const param = pn.*.cast(ast.Node.ParamDecl).?;
2026 try call_expr.op.Call.params.push(try transCreateNodeIdentifier(c, tokenSlice(c, param.name_token.?)));
2082 try call_expr.op.Call.params.push(try transCreateNodeIdentifier(c, tokenSlice(c, param.name_token.?), null));
20272083 }
20282084 call_expr.rtoken = try appendToken(c, .RParen, ")");
20292085 return_expr.rhs = &call_expr.base;
......@@ -2051,7 +2107,7 @@ fn transCreateNodeEnumLiteral(c: *Context, name: []const u8) !*ast.Node {
20512107 const node = try c.a().create(ast.Node.EnumLiteral);
20522108 node.* = .{
20532109 .dot = try appendToken(c, .Period, "."),
2054 .name = try appendIdentifier(c, name),
2110 .name = try appendIdentifier(c, name, null), // scoped to an enum
20552111 };
20562112 return &node.base;
20572113}
......@@ -2080,6 +2136,22 @@ fn transCreateNodeElse(c: *Context) !*ast.Node.Else {
20802136 return node;
20812137}
20822138
2139fn transCreateNodeBlock(c: *Context, label: ?[]const u8, scope: ?*Scope) !*ast.Node.Block {
2140 const label_node = if (label) |l| blk: {
2141 const ll = try appendIdentifier(c, l, scope);
2142 _ = try appendToken(c, .Colon, ":");
2143 break :blk ll;
2144 } else null;
2145 const block_node = try c.a().create(ast.Node.Block);
2146 block_node.* = .{
2147 .label = label_node,
2148 .lbrace = try appendToken(c, .LBrace, "{"),
2149 .statements = ast.Node.Block.StatementList.init(c.a()),
2150 .rbrace = undefined,
2151 };
2152 return block_node;
2153}
2154
20832155const RestorePoint = struct {
20842156 c: *Context,
20852157 token_index: ast.TokenIndex,
......@@ -2124,7 +2196,7 @@ fn transType(rp: RestorePoint, ty: *const ZigClangType, source_loc: ZigClangSour
21242196 .Float16 => "f16",
21252197 .LongDouble => "c_longdouble",
21262198 else => return revertAndWarn(rp, error.UnsupportedType, source_loc, "unsupported builtin type", .{}),
2127 });
2199 }, null);
21282200 },
21292201 .FunctionProto => {
21302202 const fn_proto_ty = @ptrCast(*const ZigClangFunctionProtoType, ty);
......@@ -2202,14 +2274,21 @@ fn transType(rp: RestorePoint, ty: *const ZigClangType, source_loc: ZigClangSour
22022274
22032275 const typedef_decl = ZigClangTypedefType_getDecl(typedef_ty);
22042276 const typedef_name = try rp.c.str(ZigClangDecl_getName_bytes_begin(@ptrCast(*const ZigClangDecl, typedef_decl)));
2205 return transCreateNodeIdentifier(rp.c, typedef_name);
2277 return transCreateNodeIdentifier(rp.c, typedef_name, null);
22062278 },
22072279 .Record => {
22082280 const record_ty = @ptrCast(*const ZigClangRecordType, ty);
22092281
2282 // TODO this sould get the name from decl_table
2283 // struct Foo {
2284 // struct Bar{
2285 // int b;
2286 // };
2287 // struct Bar c;
2288 // };
22102289 const record_decl = ZigClangRecordType_getDecl(record_ty);
22112290 if (try getContainerName(rp, record_decl)) |name|
2212 return transCreateNodeIdentifier(rp.c, name)
2291 return transCreateNodeIdentifier(rp.c, name, null)
22132292 else
22142293 return transRecordDecl(rp.c, record_decl);
22152294 },
......@@ -2334,6 +2413,9 @@ fn finishTransFnProto(
23342413 // TODO check for always_inline attribute
23352414 // TODO check for align attribute
23362415
2416 var fndef_scope = Scope.FnDef.init(rp.c);
2417 const scope = &fndef_scope.base;
2418
23372419 // pub extern fn name(...) T
23382420 const pub_tok = if (is_pub) try appendToken(rp.c, .Keyword_pub, "pub") else null;
23392421 const cc_tok = if (cc == .Stdcall) try appendToken(rp.c, .Keyword_stdcallcc, "stdcallcc") else null;
......@@ -2344,7 +2426,7 @@ fn finishTransFnProto(
23442426 else
23452427 null;
23462428 const fn_tok = try appendToken(rp.c, .Keyword_fn, "fn");
2347 const name_tok = if (fn_decl_context) |ctx| try appendIdentifier(rp.c, ctx.fn_name) else null;
2429 const name_tok = if (fn_decl_context) |ctx| try appendIdentifier(rp.c, ctx.fn_name, null) else null;
23482430 const lparen_tok = try appendToken(rp.c, .LParen, "(");
23492431
23502432 var fn_params = ast.Node.FnProto.ParamList.init(rp.c.a());
......@@ -2359,13 +2441,17 @@ fn finishTransFnProto(
23592441 const param_name_tok: ?ast.TokenIndex = blk: {
23602442 if (fn_decl != null) {
23612443 const param = ZigClangFunctionDecl_getParamDecl(fn_decl.?, @intCast(c_uint, i));
2362 const param_name = try rp.c.str(ZigClangDecl_getName_bytes_begin(@ptrCast(*const ZigClangDecl, param)));
2363 if (param_name.len > 0) {
2364 // TODO: If len == 0, auto-generate arg1, arg2, etc? Or leave the name blank?
2365 const result = try appendIdentifier(rp.c, param_name);
2366 _ = try appendToken(rp.c, .Colon, ":");
2367 break :blk result;
2368 }
2444 var param_name: []const u8 = try rp.c.str(ZigClangDecl_getName_bytes_begin(@ptrCast(*const ZigClangDecl, param)));
2445 if (param_name.len < 1)
2446 param_name = "arg"[0..];
2447 const checked_param_name = if (try scope.createAlias(rp.c, param_name)) |a| blk: {
2448 try fndef_scope.params.push(.{ .name = param_name, .alias = a });
2449 break :blk a;
2450 } else param_name;
2451
2452 const result = try appendIdentifier(rp.c, checked_param_name, null);
2453 _ = try appendToken(rp.c, .Colon, ":");
2454 break :blk result;
23692455 }
23702456 break :blk null;
23712457 };
......@@ -2411,12 +2497,12 @@ fn finishTransFnProto(
24112497
24122498 const return_type_node = blk: {
24132499 if (ZigClangFunctionType_getNoReturnAttr(fn_ty)) {
2414 break :blk try transCreateNodeIdentifier(rp.c, "noreturn");
2500 break :blk try transCreateNodeIdentifier(rp.c, "noreturn", null);
24152501 } else {
24162502 const return_qt = ZigClangFunctionType_getReturnType(fn_ty);
24172503 if (isCVoid(return_qt)) {
24182504 // convert primitive c_void to actual void (only for return type)
2419 break :blk try transCreateNodeIdentifier(rp.c, "void");
2505 break :blk try transCreateNodeIdentifier(rp.c, "void", null);
24202506 } else {
24212507 break :blk transQualType(rp, return_qt, source_loc) catch |err| switch (err) {
24222508 error.UnsupportedType => {
......@@ -2469,7 +2555,7 @@ fn emitWarning(c: *Context, loc: ZigClangSourceLocation, comptime format: []cons
24692555fn failDecl(c: *Context, loc: ZigClangSourceLocation, name: []const u8, comptime format: []const u8, args: var) !void {
24702556 // const name = @compileError(msg);
24712557 const const_tok = try appendToken(c, .Keyword_const, "const");
2472 const name_tok = try appendIdentifier(c, name);
2558 const name_tok = try appendIdentifier(c, name, null);
24732559 const eq_tok = try appendToken(c, .Equal, "=");
24742560 const builtin_tok = try appendToken(c, .Builtin, "@compileError");
24752561 const lparen_tok = try appendToken(c, .LParen, "(");
......@@ -2554,7 +2640,11 @@ fn isValidZigIdentifier(name: []const u8) bool {
25542640 return true;
25552641}
25562642
2557fn appendIdentifier(c: *Context, name: []const u8) !ast.TokenIndex {
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 };
25582648 if (!isValidZigIdentifier(name) or std.zig.Token.getKeyword(name) != null) {
25592649 return appendTokenFmt(c, .Identifier, "@\"{}\"", .{name});
25602650 } else {
......@@ -2562,8 +2652,8 @@ fn appendIdentifier(c: *Context, name: []const u8) !ast.TokenIndex {
25622652 }
25632653}
25642654
2565fn transCreateNodeIdentifier(c: *Context, name: []const u8) !*ast.Node {
2566 const token_index = try appendIdentifier(c, name);
2655fn transCreateNodeIdentifier(c: *Context, name: []const u8, scope: ?*Scope) !*ast.Node {
2656 const token_index = try appendIdentifier(c, name, scope);
25672657 const identifier = try c.a().create(ast.Node.Identifier);
25682658 identifier.* = ast.Node.Identifier{
25692659 .base = ast.Node{ .id = ast.Node.Id.Identifier },
......@@ -2581,6 +2671,7 @@ fn transPreprocessorEntities(c: *Context, unit: *ZigClangASTUnit) Error!void {
25812671 var it = ZigClangASTUnit_getLocalPreprocessingEntities_begin(unit);
25822672 const it_end = ZigClangASTUnit_getLocalPreprocessingEntities_end(unit);
25832673 var tok_list = ctok.TokenList.init(c.a());
2674 const scope = &c.global_scope.base;
25842675
25852676 while (it.I != it_end.I) : (it.I += 1) {
25862677 const entity = ZigClangPreprocessingRecord_iterator_deref(it);
......@@ -2592,9 +2683,9 @@ fn transPreprocessorEntities(c: *Context, unit: *ZigClangASTUnit) Error!void {
25922683 const begin_loc = ZigClangMacroDefinitionRecord_getSourceRange_getBegin(macro);
25932684
25942685 const name = try c.str(raw_name);
2595 // if (name_exists_global(c, name)) { // TODO
2596 // continue;
2597 // }
2686 if (scope.contains(name)) {
2687 continue;
2688 }
25982689 const begin_c = ZigClangSourceManager_getCharacterData(c.source_manager, begin_loc);
25992690 ctok.tokenizeCMacro(&tok_list, begin_c) catch |err| switch (err) {
26002691 error.OutOfMemory => |e| return e,
......@@ -2645,14 +2736,14 @@ fn transPreprocessorEntities(c: *Context, unit: *ZigClangASTUnit) Error!void {
26452736
26462737fn transMacroDefine(c: *Context, it: *ctok.TokenList.Iterator, name: []const u8, source_loc: ZigClangSourceLocation) ParseError!void {
26472738 const rp = makeRestorePoint(c);
2739 const scope = &c.global_scope.base;
26482740
26492741 const visib_tok = try appendToken(c, .Keyword_pub, "pub");
26502742 const mut_tok = try appendToken(c, .Keyword_const, "const");
2651 const name_tok = try appendIdentifier(c, name);
2652
2743 const name_tok = try appendIdentifier(c, name, null);
26532744 const eq_tok = try appendToken(c, .Equal, "=");
26542745
2655 const init_node = try parseCExpr(rp, it, source_loc);
2746 const init_node = try parseCExpr(rp, it, source_loc, scope);
26562747
26572748 const node = try c.a().create(ast.Node.VarDecl);
26582749 node.* = ast.Node.VarDecl{
......@@ -2671,15 +2762,18 @@ fn transMacroDefine(c: *Context, it: *ctok.TokenList.Iterator, name: []const u8,
26712762 .init_node = init_node,
26722763 .semicolon_token = try appendToken(c, .Semicolon, ";"),
26732764 };
2674 _ = try c.macro_table.put(name, &node.base);
2765 _ = try c.global_scope.macro_table.put(name, &node.base);
26752766}
26762767
26772768fn transMacroFnDefine(c: *Context, it: *ctok.TokenList.Iterator, name: []const u8, source_loc: ZigClangSourceLocation) ParseError!void {
26782769 const rp = makeRestorePoint(c);
2770 var fndef_scope = Scope.FnDef.init(c);
2771 const scope = &fndef_scope.base;
2772
26792773 const pub_tok = try appendToken(c, .Keyword_pub, "pub");
26802774 const inline_tok = try appendToken(c, .Keyword_inline, "inline");
26812775 const fn_tok = try appendToken(c, .Keyword_fn, "fn");
2682 const name_tok = try appendIdentifier(c, name);
2776 const name_tok = try appendIdentifier(c, name, null);
26832777 _ = try appendToken(c, .LParen, "(");
26842778
26852779 if (it.next().?.id != .LParen) {
......@@ -2691,8 +2785,12 @@ fn transMacroFnDefine(c: *Context, it: *ctok.TokenList.Iterator, name: []const u
26912785 if (param_tok.id != .Identifier)
26922786 return error.ParseError;
26932787
2694 // TODO avoid name collisions
2695 const param_name_tok = try appendIdentifier(c, param_tok.bytes);
2788 const checked_name = if (try scope.createAlias(c, param_tok.bytes)) |alias| blk: {
2789 try fndef_scope.params.push(.{ .name = param_tok.bytes, .alias = alias });
2790 break :blk alias;
2791 } else param_tok.bytes;
2792
2793 const param_name_tok = try appendIdentifier(c, checked_name, null);
26962794 _ = try appendToken(c, .Colon, ":");
26972795
26982796 const token_index = try appendToken(c, .Keyword_var, "var");
......@@ -2745,16 +2843,10 @@ fn transMacroFnDefine(c: *Context, it: *ctok.TokenList.Iterator, name: []const u
27452843 .section_expr = null,
27462844 };
27472845
2748 const block = try c.a().create(ast.Node.Block);
2749 block.* = .{
2750 .label = null,
2751 .lbrace = try appendToken(c, .LBrace, "{"),
2752 .statements = ast.Node.Block.StatementList.init(c.a()),
2753 .rbrace = undefined,
2754 };
2846 const block = try transCreateNodeBlock(c, null, null);
27552847
27562848 const return_expr = try transCreateNodeReturnExpr(c);
2757 const expr = try parseCExpr(rp, it, source_loc);
2849 const expr = try parseCExpr(rp, it, source_loc, scope);
27582850 _ = try appendToken(c, .Semicolon, ";");
27592851 try type_of.params.push(expr);
27602852 return_expr.rhs = expr;
......@@ -2762,7 +2854,7 @@ fn transMacroFnDefine(c: *Context, it: *ctok.TokenList.Iterator, name: []const u
27622854 block.rbrace = try appendToken(c, .RBrace, "}");
27632855 try block.statements.push(&return_expr.base);
27642856 fn_proto.body_node = &block.base;
2765 _ = try c.macro_table.put(name, &fn_proto.base);
2857 _ = try c.global_scope.macro_table.put(name, &fn_proto.base);
27662858}
27672859
27682860const ParseError = Error || error{
......@@ -2770,8 +2862,8 @@ const ParseError = Error || error{
27702862 UnsupportedTranslation,
27712863};
27722864
2773fn parseCExpr(rp: RestorePoint, it: *ctok.TokenList.Iterator, source_loc: ZigClangSourceLocation) ParseError!*ast.Node {
2774 return parseCPrefixOpExpr(rp, it, source_loc);
2865fn parseCExpr(rp: RestorePoint, it: *ctok.TokenList.Iterator, source_loc: ZigClangSourceLocation, scope: *Scope) ParseError!*ast.Node {
2866 return parseCPrefixOpExpr(rp, it, source_loc, scope);
27752867}
27762868
27772869fn parseCNumLit(rp: RestorePoint, tok: *CToken, source_loc: ZigClangSourceLocation) ParseError!*ast.Node {
......@@ -2796,7 +2888,7 @@ fn parseCNumLit(rp: RestorePoint, tok: *CToken, source_loc: ZigClangSourceLocati
27962888 .LL => "c_longlong",
27972889 .LLU => "c_ulonglong",
27982890 else => unreachable,
2799 }));
2891 }, null));
28002892 _ = try appendToken(rp.c, .Comma, ",");
28012893 try cast_node.params.push(try transCreateNodeInt(rp.c, tok.bytes));
28022894 cast_node.rparen_token = try appendToken(rp.c, .RParen, ")");
......@@ -2810,7 +2902,7 @@ fn parseCNumLit(rp: RestorePoint, tok: *CToken, source_loc: ZigClangSourceLocati
28102902 .F => "f32",
28112903 .L => "f64",
28122904 else => unreachable,
2813 }));
2905 }, null));
28142906 _ = try appendToken(rp.c, .Comma, ",");
28152907 try cast_node.params.push(try transCreateNodeFloat(rp.c, tok.bytes));
28162908 cast_node.rparen_token = try appendToken(rp.c, .RParen, ")");
......@@ -2825,7 +2917,7 @@ fn parseCNumLit(rp: RestorePoint, tok: *CToken, source_loc: ZigClangSourceLocati
28252917 );
28262918}
28272919
2828fn parseCPrimaryExpr(rp: RestorePoint, it: *ctok.TokenList.Iterator, source_loc: ZigClangSourceLocation) ParseError!*ast.Node {
2920fn parseCPrimaryExpr(rp: RestorePoint, it: *ctok.TokenList.Iterator, source_loc: ZigClangSourceLocation, scope: *Scope) ParseError!*ast.Node {
28292921 const tok = it.next().?;
28302922 switch (tok.id) {
28312923 .CharLit => {
......@@ -2847,9 +2939,9 @@ fn parseCPrimaryExpr(rp: RestorePoint, it: *ctok.TokenList.Iterator, source_loc:
28472939 .NumLitInt, .NumLitFloat => {
28482940 return parseCNumLit(rp, tok, source_loc);
28492941 },
2850 .Identifier => return transCreateNodeIdentifier(rp.c, tok.bytes),
2942 .Identifier => return transCreateNodeIdentifier(rp.c, tok.bytes, scope),
28512943 .LParen => {
2852 const inner_node = try parseCExpr(rp, it, source_loc);
2944 const inner_node = try parseCExpr(rp, it, source_loc, scope);
28532945
28542946 if (it.peek().?.id == .RParen) {
28552947 _ = it.next();
......@@ -2859,7 +2951,7 @@ fn parseCPrimaryExpr(rp: RestorePoint, it: *ctok.TokenList.Iterator, source_loc:
28592951 // hack to get zig fmt to render a comma in builtin calls
28602952 _ = try appendToken(rp.c, .Comma, ",");
28612953
2862 const node_to_cast = try parseCExpr(rp, it, source_loc);
2954 const node_to_cast = try parseCExpr(rp, it, source_loc, scope);
28632955
28642956 if (it.next().?.id != .RParen) {
28652957 return revertAndWarn(
......@@ -2951,8 +3043,8 @@ fn parseCPrimaryExpr(rp: RestorePoint, it: *ctok.TokenList.Iterator, source_loc:
29513043 }
29523044}
29533045
2954fn parseCSuffixOpExpr(rp: RestorePoint, it: *ctok.TokenList.Iterator, source_loc: ZigClangSourceLocation) ParseError!*ast.Node {
2955 var node = try parseCPrimaryExpr(rp, it, source_loc);
3046fn parseCSuffixOpExpr(rp: RestorePoint, it: *ctok.TokenList.Iterator, source_loc: ZigClangSourceLocation, scope: *Scope) ParseError!*ast.Node {
3047 var node = try parseCPrimaryExpr(rp, it, source_loc, scope);
29563048 while (true) {
29573049 const tok = it.next().?;
29583050 switch (tok.id) {
......@@ -2968,7 +3060,7 @@ fn parseCSuffixOpExpr(rp: RestorePoint, it: *ctok.TokenList.Iterator, source_loc
29683060 );
29693061
29703062 const op_token = try appendToken(rp.c, .Period, ".");
2971 const rhs = try transCreateNodeIdentifier(rp.c, name_tok.bytes);
3063 const rhs = try transCreateNodeIdentifier(rp.c, name_tok.bytes, null); // TODO scope);
29723064 const access_node = try rp.c.a().create(ast.Node.InfixOp);
29733065 access_node.* = .{
29743066 .op_token = op_token,
......@@ -2991,7 +3083,7 @@ fn parseCSuffixOpExpr(rp: RestorePoint, it: *ctok.TokenList.Iterator, source_loc
29913083 } else {
29923084 // expr * expr
29933085 const op_token = try appendToken(rp.c, .Asterisk, "*");
2994 const rhs = try parseCPrimaryExpr(rp, it, source_loc);
3086 const rhs = try parseCPrimaryExpr(rp, it, source_loc, scope);
29953087 const bitshift_node = try rp.c.a().create(ast.Node.InfixOp);
29963088 bitshift_node.* = .{
29973089 .op_token = op_token,
......@@ -3004,7 +3096,7 @@ fn parseCSuffixOpExpr(rp: RestorePoint, it: *ctok.TokenList.Iterator, source_loc
30043096 },
30053097 .Shl => {
30063098 const op_token = try appendToken(rp.c, .AngleBracketAngleBracketLeft, "<<");
3007 const rhs = try parseCPrimaryExpr(rp, it, source_loc);
3099 const rhs = try parseCPrimaryExpr(rp, it, source_loc, scope);
30083100 const bitshift_node = try rp.c.a().create(ast.Node.InfixOp);
30093101 bitshift_node.* = .{
30103102 .op_token = op_token,
......@@ -3022,27 +3114,27 @@ fn parseCSuffixOpExpr(rp: RestorePoint, it: *ctok.TokenList.Iterator, source_loc
30223114 }
30233115}
30243116
3025fn parseCPrefixOpExpr(rp: RestorePoint, it: *ctok.TokenList.Iterator, source_loc: ZigClangSourceLocation) ParseError!*ast.Node {
3117fn parseCPrefixOpExpr(rp: RestorePoint, it: *ctok.TokenList.Iterator, source_loc: ZigClangSourceLocation, scope: *Scope) ParseError!*ast.Node {
30263118 const op_tok = it.next().?;
30273119
30283120 switch (op_tok.id) {
30293121 .Bang => {
30303122 const node = try transCreateNodePrefixOp(rp.c, .BoolNot, .Bang, "!");
3031 node.rhs = try parseCPrefixOpExpr(rp, it, source_loc);
3123 node.rhs = try parseCPrefixOpExpr(rp, it, source_loc, scope);
30323124 return &node.base;
30333125 },
30343126 .Minus => {
30353127 const node = try transCreateNodePrefixOp(rp.c, .Negation, .Minus, "-");
3036 node.rhs = try parseCPrefixOpExpr(rp, it, source_loc);
3128 node.rhs = try parseCPrefixOpExpr(rp, it, source_loc, scope);
30373129 return &node.base;
30383130 },
30393131 .Tilde => {
30403132 const node = try transCreateNodePrefixOp(rp.c, .BitNot, .Tilde, "~");
3041 node.rhs = try parseCPrefixOpExpr(rp, it, source_loc);
3133 node.rhs = try parseCPrefixOpExpr(rp, it, source_loc, scope);
30423134 return &node.base;
30433135 },
30443136 .Asterisk => {
3045 const prefix_op_expr = try parseCPrefixOpExpr(rp, it, source_loc);
3137 const prefix_op_expr = try parseCPrefixOpExpr(rp, it, source_loc, scope);
30463138 const node = try rp.c.a().create(ast.Node.SuffixOp);
30473139 node.* = .{
30483140 .lhs = .{ .node = prefix_op_expr },
......@@ -3053,7 +3145,7 @@ fn parseCPrefixOpExpr(rp: RestorePoint, it: *ctok.TokenList.Iterator, source_loc
30533145 },
30543146 else => {
30553147 _ = it.prev();
3056 return try parseCSuffixOpExpr(rp, it, source_loc);
3148 return try parseCSuffixOpExpr(rp, it, source_loc, scope);
30573149 },
30583150 }
30593151}
......@@ -3070,7 +3162,7 @@ fn getFnDecl(c: *Context, ref: *ast.Node) ?*ast.Node {
30703162 else
30713163 return null;
30723164 // TODO a.b.c
3073 if (c.sym_table.get(name)) |kv| {
3165 if (c.global_scope.sym_table.get(name)) |kv| {
30743166 if (kv.value.cast(ast.Node.VarDecl)) |val| {
30753167 if (val.type_node) |type_node| {
30763168 if (type_node.cast(ast.Node.PrefixOp)) |casted| {
......@@ -3085,7 +3177,7 @@ fn getFnDecl(c: *Context, ref: *ast.Node) ?*ast.Node {
30853177}
30863178
30873179fn addMacros(c: *Context) !void {
3088 var macro_it = c.macro_table.iterator();
3180 var macro_it = c.global_scope.macro_table.iterator();
30893181 while (macro_it.next()) |kv| {
30903182 if (getFnDecl(c, kv.value)) |proto_node| {
30913183 // If a macro aliases a global variable which is a function pointer, we conclude that
test/translate_c.zig+5-2
......@@ -652,10 +652,13 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
652652 });
653653
654654 cases.add_2("basic macro function",
655 \\extern int c;
655656 \\#define BASIC(c) (c*2)
656657 , &[_][]const u8{
657 \\pub inline fn BASIC(c: var) @TypeOf(c * 2) {
658 \\ return c * 2;
658 \\pub extern var c: c_int;
659 ,
660 \\pub inline fn BASIC(c_1: var) @TypeOf(c_1 * 2) {
661 \\ return c_1 * 2;
659662 \\}
660663 });
661664