authorgravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2019-12-14 13:09:35+02:00
committergravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2019-12-14 13:40:33+02:00
log4dae70e702f10c385be1dea552f3d6e815dc93c9
treeeb638d75d3f4934639e63c8d58c0bee83c626ce3
parenta4ac6d15c42a4a06eb5e2bfe73224384d3613bf6
signature Commit is signed but in an unrecognized format.

translate-c-2 container aliases


4 files changed, 107 insertions(+), 107 deletions(-)

lib/std/zig/render.zig+2-2
...@@ -193,7 +193,6 @@ fn renderRoot(...@@ -193,7 +193,6 @@ fn renderRoot(
193fn renderExtraNewline(tree: *ast.Tree, stream: var, start_col: *usize, node: *ast.Node) @TypeOf(stream).Child.Error!void {193fn renderExtraNewline(tree: *ast.Tree, stream: var, start_col: *usize, node: *ast.Node) @TypeOf(stream).Child.Error!void {
194 const first_token = node.firstToken();194 const first_token = node.firstToken();
195 var prev_token = first_token;195 var prev_token = first_token;
196 if (prev_token == 0) return;
197 while (tree.tokens.at(prev_token - 1).id == .DocComment) {196 while (tree.tokens.at(prev_token - 1).id == .DocComment) {
198 prev_token -= 1;197 prev_token -= 1;
199 }198 }
...@@ -2175,7 +2174,8 @@ fn renderTokenOffset(...@@ -2175,7 +2174,8 @@ fn renderTokenOffset(
2175 }2174 }
21762175
2177 while (true) {2176 while (true) {
2178 const newline_count = if (loc.line < 2) @as(u8, 1) else @as(u8, 2);2177 assert(loc.line != 0);
2178 const newline_count = if (loc.line == 1) @as(u8, 1) else @as(u8, 2);
2179 try stream.writeByteNTimes('\n', newline_count);2179 try stream.writeByteNTimes('\n', newline_count);
2180 try stream.writeByteNTimes(' ', indent);2180 try stream.writeByteNTimes(' ', indent);
2181 try stream.write(mem.trimRight(u8, tree.tokenSlicePtr(next_token), " "));2181 try stream.write(mem.trimRight(u8, tree.tokenSlicePtr(next_token), " "));
src-self-hosted/clang.zig-11
...@@ -713,16 +713,6 @@ pub const ZigClangRecordDecl_field_iterator = extern struct {...@@ -713,16 +713,6 @@ pub const ZigClangRecordDecl_field_iterator = extern struct {
713 opaque: *c_void,713 opaque: *c_void,
714};714};
715715
716pub const ZigClangElaboratedTypeKeyword = extern enum {
717 Struct,
718 Interface,
719 Union,
720 Class,
721 Enum,
722 Typename,
723 None,
724};
725
726pub extern fn ZigClangSourceManager_getSpellingLoc(self: ?*const struct_ZigClangSourceManager, Loc: struct_ZigClangSourceLocation) struct_ZigClangSourceLocation;716pub extern fn ZigClangSourceManager_getSpellingLoc(self: ?*const struct_ZigClangSourceManager, Loc: struct_ZigClangSourceLocation) struct_ZigClangSourceLocation;
727pub extern fn ZigClangSourceManager_getFilename(self: *const struct_ZigClangSourceManager, SpellingLoc: struct_ZigClangSourceLocation) ?[*:0]const u8;717pub extern fn ZigClangSourceManager_getFilename(self: *const struct_ZigClangSourceManager, SpellingLoc: struct_ZigClangSourceLocation) ?[*:0]const u8;
728pub extern fn ZigClangSourceManager_getSpellingLineNumber(self: ?*const struct_ZigClangSourceManager, Loc: struct_ZigClangSourceLocation) c_uint;718pub extern fn ZigClangSourceManager_getSpellingLineNumber(self: ?*const struct_ZigClangSourceManager, Loc: struct_ZigClangSourceLocation) c_uint;
...@@ -967,7 +957,6 @@ pub extern fn ZigClangDeclRefExpr_getDecl(*const ZigClangDeclRefExpr) *const Zig...@@ -967,7 +957,6 @@ pub extern fn ZigClangDeclRefExpr_getDecl(*const ZigClangDeclRefExpr) *const Zig
967957
968pub extern fn ZigClangParenType_getInnerType(*const ZigClangParenType) ZigClangQualType;958pub extern fn ZigClangParenType_getInnerType(*const ZigClangParenType) ZigClangQualType;
969959
970pub extern fn ZigClangElaboratedType_getKeyword(*const struct_ZigClangElaboratedType) ZigClangElaboratedTypeKeyword;
971pub extern fn ZigClangElaboratedType_getNamedType(*const ZigClangElaboratedType) ZigClangQualType;960pub extern fn ZigClangElaboratedType_getNamedType(*const ZigClangElaboratedType) ZigClangQualType;
972961
973pub extern fn ZigClangAttributedType_getEquivalentType(*const ZigClangAttributedType) ZigClangQualType;962pub extern fn ZigClangAttributedType_getEquivalentType(*const ZigClangAttributedType) ZigClangQualType;
src-self-hosted/translate_c.zig+78-21
...@@ -15,7 +15,7 @@ pub const Error = error{OutOfMemory};...@@ -15,7 +15,7 @@ pub const Error = error{OutOfMemory};
15const TypeError = Error || error{UnsupportedType};15const TypeError = Error || error{UnsupportedType};
16const TransError = TypeError || error{UnsupportedTranslation};16const TransError = TypeError || error{UnsupportedTranslation};
1717
18const DeclTable = std.HashMap(usize, []const u8, addrHash, addrEql);18const DeclTable = std.HashMap(usize, void, addrHash, addrEql);
1919
20fn addrHash(x: usize) u32 {20fn addrHash(x: usize) u32 {
21 switch (@typeInfo(usize).Int.bits) {21 switch (@typeInfo(usize).Int.bits) {
...@@ -31,6 +31,12 @@ fn addrEql(a: usize, b: usize) bool {...@@ -31,6 +31,12 @@ fn addrEql(a: usize, b: usize) bool {
31 return a == b;31 return a == b;
32}32}
3333
34const SymbolTable = std.StringHashMap(void);
35const AliasList = std.SegmentedList(struct {
36 alias: []const u8,
37 name: []const u8,
38}, 4);
39
34const Scope = struct {40const Scope = struct {
35 id: Id,41 id: Id,
36 parent: ?*Scope,42 parent: ?*Scope,
...@@ -98,6 +104,8 @@ const Context = struct {...@@ -98,6 +104,8 @@ const Context = struct {
98 err: Error,104 err: Error,
99 source_manager: *ZigClangSourceManager,105 source_manager: *ZigClangSourceManager,
100 decl_table: DeclTable,106 decl_table: DeclTable,
107 alias_list: AliasList,
108 sym_table: SymbolTable,
101 global_scope: *Scope.Root,109 global_scope: *Scope.Root,
102 ptr_params: std.BufSet,110 ptr_params: std.BufSet,
103 clang_context: *ZigClangASTContext,111 clang_context: *ZigClangASTContext,
...@@ -177,6 +185,8 @@ pub fn translate(...@@ -177,6 +185,8 @@ pub fn translate(
177 .source_manager = ZigClangASTUnit_getSourceManager(ast_unit),185 .source_manager = ZigClangASTUnit_getSourceManager(ast_unit),
178 .err = undefined,186 .err = undefined,
179 .decl_table = DeclTable.init(arena),187 .decl_table = DeclTable.init(arena),
188 .alias_list = AliasList.init(arena),
189 .sym_table = SymbolTable.init(arena),
180 .global_scope = try arena.create(Scope.Root),190 .global_scope = try arena.create(Scope.Root),
181 .ptr_params = std.BufSet.init(arena),191 .ptr_params = std.BufSet.init(arena),
182 .clang_context = ZigClangASTUnit_getASTContext(ast_unit).?,192 .clang_context = ZigClangASTUnit_getASTContext(ast_unit).?,
...@@ -191,10 +201,15 @@ pub fn translate(...@@ -191,10 +201,15 @@ pub fn translate(
191 if (!ZigClangASTUnit_visitLocalTopLevelDecls(ast_unit, &context, declVisitorC)) {201 if (!ZigClangASTUnit_visitLocalTopLevelDecls(ast_unit, &context, declVisitorC)) {
192 return context.err;202 return context.err;
193 }203 }
204 var it = context.alias_list.iterator(0);
205 while (it.next()) |alias| {
206 if (!context.sym_table.contains(alias.alias)) {
207 try createAlias(&context, alias);
208 }
209 }
194210
195 tree.root_node.eof_token = try appendToken(&context, .Eof, "");211 tree.root_node.eof_token = try appendToken(&context, .Eof, "");
196 tree.source = source_buffer.toOwnedSlice();212 tree.source = source_buffer.toOwnedSlice();
197
198 if (false) {213 if (false) {
199 std.debug.warn("debug source:\n{}\n==EOF==\ntokens:\n", tree.source);214 std.debug.warn("debug source:\n{}\n==EOF==\ntokens:\n", tree.source);
200 var i: usize = 0;215 var i: usize = 0;
...@@ -240,10 +255,9 @@ fn declVisitor(c: *Context, decl: *const ZigClangDecl) Error!void {...@@ -240,10 +255,9 @@ fn declVisitor(c: *Context, decl: *const ZigClangDecl) Error!void {
240}255}
241256
242fn visitFnDecl(c: *Context, fn_decl: *const ZigClangFunctionDecl) Error!void {257fn visitFnDecl(c: *Context, fn_decl: *const ZigClangFunctionDecl) Error!void {
243 if (c.decl_table.contains(@ptrToInt(fn_decl))) return; // Avoid processing this decl twice258 if (try c.decl_table.put(@ptrToInt(fn_decl), {})) |_| return; // Avoid processing this decl twice
244 const rp = makeRestorePoint(c);259 const rp = makeRestorePoint(c);
245 const fn_name = try c.str(ZigClangDecl_getName_bytes_begin(@ptrCast(*const ZigClangDecl, fn_decl)));260 const fn_name = try c.str(ZigClangDecl_getName_bytes_begin(@ptrCast(*const ZigClangDecl, fn_decl)));
246 _ = try c.decl_table.put(@ptrToInt(fn_decl), fn_name);
247 const fn_decl_loc = ZigClangFunctionDecl_getLocation(fn_decl);261 const fn_decl_loc = ZigClangFunctionDecl_getLocation(fn_decl);
248 const fn_qt = ZigClangFunctionDecl_getType(fn_decl);262 const fn_qt = ZigClangFunctionDecl_getType(fn_decl);
249 const fn_type = ZigClangQualType_getTypePtr(fn_qt);263 const fn_type = ZigClangQualType_getTypePtr(fn_qt);
...@@ -305,7 +319,7 @@ fn visitFnDecl(c: *Context, fn_decl: *const ZigClangFunctionDecl) Error!void {...@@ -305,7 +319,7 @@ fn visitFnDecl(c: *Context, fn_decl: *const ZigClangFunctionDecl) Error!void {
305}319}
306320
307fn visitVarDecl(c: *Context, var_decl: *const ZigClangVarDecl) Error!void {321fn visitVarDecl(c: *Context, var_decl: *const ZigClangVarDecl) Error!void {
308 if (c.decl_table.contains(@ptrToInt(var_decl))) return; // Avoid processing this decl twice322 if (try c.decl_table.put(@ptrToInt(var_decl), {})) |_| return; // Avoid processing this decl twice
309 const rp = makeRestorePoint(c);323 const rp = makeRestorePoint(c);
310 const visib_tok = try appendToken(c, .Keyword_pub, "pub");324 const visib_tok = try appendToken(c, .Keyword_pub, "pub");
311325
...@@ -316,7 +330,6 @@ fn visitVarDecl(c: *Context, var_decl: *const ZigClangVarDecl) Error!void {...@@ -316,7 +330,6 @@ fn visitVarDecl(c: *Context, var_decl: *const ZigClangVarDecl) Error!void {
316330
317 var scope = &c.global_scope.base;331 var scope = &c.global_scope.base;
318 const var_name = try c.str(ZigClangDecl_getName_bytes_begin(@ptrCast(*const ZigClangDecl, var_decl)));332 const var_name = try c.str(ZigClangDecl_getName_bytes_begin(@ptrCast(*const ZigClangDecl, var_decl)));
319 _ = try c.decl_table.put(@ptrToInt(var_decl), var_name);
320 const var_decl_loc = ZigClangVarDecl_getLocation(var_decl);333 const var_decl_loc = ZigClangVarDecl_getLocation(var_decl);
321334
322 const qual_type = ZigClangVarDecl_getTypeSourceInfo_getType(var_decl);335 const qual_type = ZigClangVarDecl_getTypeSourceInfo_getType(var_decl);
...@@ -388,13 +401,12 @@ fn visitVarDecl(c: *Context, var_decl: *const ZigClangVarDecl) Error!void {...@@ -388,13 +401,12 @@ fn visitVarDecl(c: *Context, var_decl: *const ZigClangVarDecl) Error!void {
388}401}
389402
390fn resolveTypeDef(c: *Context, typedef_decl: *const ZigClangTypedefNameDecl) Error!void {403fn resolveTypeDef(c: *Context, typedef_decl: *const ZigClangTypedefNameDecl) Error!void {
391 if (c.decl_table.contains(@ptrToInt(ZigClangTypedefNameDecl_getCanonicalDecl(typedef_decl)))) return; // Avoid processing this decl twice404 if (try c.decl_table.put(@ptrToInt(ZigClangTypedefNameDecl_getCanonicalDecl(typedef_decl)), {})) |_| return; // Avoid processing this decl twice
392 const rp = makeRestorePoint(c);405 const rp = makeRestorePoint(c);
393 const visib_tok = try appendToken(c, .Keyword_pub, "pub");406 const visib_tok = try appendToken(c, .Keyword_pub, "pub");
394 const const_tok = try appendToken(c, .Keyword_const, "const");407 const const_tok = try appendToken(c, .Keyword_const, "const");
395408
396 const typedef_name = try c.str(ZigClangDecl_getName_bytes_begin(@ptrCast(*const ZigClangDecl, typedef_decl)));409 const typedef_name = try c.str(ZigClangDecl_getName_bytes_begin(@ptrCast(*const ZigClangDecl, typedef_decl)));
397 _ = try c.decl_table.put(@ptrToInt(ZigClangTypedefNameDecl_getCanonicalDecl(typedef_decl)), typedef_name);
398 const name_tok = try appendToken(c, .Identifier, typedef_name);410 const name_tok = try appendToken(c, .Identifier, typedef_name);
399 const eq_tok = try appendToken(c, .Equal, "=");411 const eq_tok = try appendToken(c, .Equal, "=");
400412
...@@ -429,12 +441,9 @@ fn resolveTypeDef(c: *Context, typedef_decl: *const ZigClangTypedefNameDecl) Err...@@ -429,12 +441,9 @@ fn resolveTypeDef(c: *Context, typedef_decl: *const ZigClangTypedefNameDecl) Err
429}441}
430442
431fn resolveRecordDecl(c: *Context, record_decl: *const ZigClangRecordDecl) Error!void {443fn resolveRecordDecl(c: *Context, record_decl: *const ZigClangRecordDecl) Error!void {
432 if (c.decl_table.contains(@ptrToInt(ZigClangRecordDecl_getCanonicalDecl(record_decl)))) return; // Avoid processing this decl twice444 if (try c.decl_table.put(@ptrToInt(ZigClangRecordDecl_getCanonicalDecl(record_decl)), {})) |_| return; // Avoid processing this decl twice
433 const rp = makeRestorePoint(c);445 const rp = makeRestorePoint(c);
434446
435 const visib_tok = try appendToken(c, .Keyword_pub, "pub");
436 const const_tok = try appendToken(c, .Keyword_const, "const");
437
438 const bare_name = try c.str(ZigClangDecl_getName_bytes_begin(@ptrCast(*const ZigClangDecl, record_decl)));447 const bare_name = try c.str(ZigClangDecl_getName_bytes_begin(@ptrCast(*const ZigClangDecl, record_decl)));
439448
440 const container_kind_name = if (ZigClangRecordDecl_isUnion(record_decl))449 const container_kind_name = if (ZigClangRecordDecl_isUnion(record_decl))
...@@ -447,8 +456,10 @@ fn resolveRecordDecl(c: *Context, record_decl: *const ZigClangRecordDecl) Error!...@@ -447,8 +456,10 @@ fn resolveRecordDecl(c: *Context, record_decl: *const ZigClangRecordDecl) Error!
447 if (ZigClangRecordDecl_isAnonymousStructOrUnion(record_decl) or bare_name.len == 0)456 if (ZigClangRecordDecl_isAnonymousStructOrUnion(record_decl) or bare_name.len == 0)
448 return;457 return;
449458
459 const visib_tok = try appendToken(c, .Keyword_pub, "pub");
460 const const_tok = try appendToken(c, .Keyword_const, "const");
461
450 const name = try std.fmt.allocPrint(c.a(), "{}_{}", .{ container_kind_name, bare_name });462 const name = try std.fmt.allocPrint(c.a(), "{}_{}", .{ container_kind_name, bare_name });
451 _ = try c.decl_table.put(@ptrToInt(ZigClangRecordDecl_getCanonicalDecl(record_decl)), name);
452 const name_tok = try appendToken(c, .Identifier, name);463 const name_tok = try appendToken(c, .Identifier, name);
453464
454 const eq_tok = try appendToken(c, .Equal, "=");465 const eq_tok = try appendToken(c, .Equal, "=");
...@@ -480,6 +491,36 @@ fn resolveRecordDecl(c: *Context, record_decl: *const ZigClangRecordDecl) Error!...@@ -480,6 +491,36 @@ fn resolveRecordDecl(c: *Context, record_decl: *const ZigClangRecordDecl) Error!
480 };491 };
481492
482 try addTopLevelDecl(c, name, &node.base);493 try addTopLevelDecl(c, name, &node.base);
494 try c.alias_list.push(.{ .alias = bare_name, .name = name });
495}
496
497fn createAlias(c: *Context, alias: var) !void {
498 const visib_tok = try appendToken(c, .Keyword_pub, "pub");
499 const mut_tok = try appendToken(c, .Keyword_const, "const");
500 const name_tok = try appendToken(c, .Identifier, alias.alias);
501
502 const eq_tok = try appendToken(c, .Equal, "=");
503 const init_node = try appendIdentifier(c, alias.name);
504
505 const node = try c.a().create(ast.Node.VarDecl);
506 node.* = ast.Node.VarDecl{
507 .base = ast.Node{ .id = .VarDecl },
508 .doc_comments = null,
509 .visib_token = visib_tok,
510 .thread_local_token = null,
511 .name_token = name_tok,
512 .eq_token = eq_tok,
513 .mut_token = mut_tok,
514 .comptime_token = null,
515 .extern_export_token = null,
516 .lib_name = null,
517 .type_node = null,
518 .align_node = null,
519 .section_node = null,
520 .init_node = init_node,
521 .semicolon_token = try appendToken(c, .Semicolon, ";"),
522 };
523 return addTopLevelDecl(c, alias.alias, &node.base);
483}524}
484525
485const ResultUsed = enum {526const ResultUsed = enum {
...@@ -1063,9 +1104,9 @@ fn transInitListExpr(...@@ -1063,9 +1104,9 @@ fn transInitListExpr(
1063 }1104 }
10641105
1065 const arr_type = ZigClangType_getAsArrayTypeUnsafe(qual_type);1106 const arr_type = ZigClangType_getAsArrayTypeUnsafe(qual_type);
1066 const const_arr_ty = @ptrCast(*const ZigClangConstantArrayType, qual_type);
1067 const child_qt = ZigClangArrayType_getElementType(arr_type);1107 const child_qt = ZigClangArrayType_getElementType(arr_type);
1068 const init_count = ZigClangInitListExpr_getNumInits(expr);1108 const init_count = ZigClangInitListExpr_getNumInits(expr);
1109 const const_arr_ty = @ptrCast(*const ZigClangConstantArrayType, qual_type);
1069 const size_ap_int = ZigClangConstantArrayType_getSize(const_arr_ty);1110 const size_ap_int = ZigClangConstantArrayType_getSize(const_arr_ty);
1070 const all_count = ZigClangAPInt_getLimitedValue(size_ap_int, std.math.maxInt(usize));1111 const all_count = ZigClangAPInt_getLimitedValue(size_ap_int, std.math.maxInt(usize));
1071 const leftover_count = all_count - init_count;1112 const leftover_count = all_count - init_count;
...@@ -1270,6 +1311,7 @@ fn maybeSuppressResult(...@@ -1270,6 +1311,7 @@ fn maybeSuppressResult(
12701311
1271fn addTopLevelDecl(c: *Context, name: []const u8, decl_node: *ast.Node) !void {1312fn addTopLevelDecl(c: *Context, name: []const u8, decl_node: *ast.Node) !void {
1272 try c.tree.root_node.decls.push(decl_node);1313 try c.tree.root_node.decls.push(decl_node);
1314 _ = try c.sym_table.put(name, {});
1273}1315}
12741316
1275fn transQualType(rp: RestorePoint, qt: ZigClangQualType, source_loc: ZigClangSourceLocation) TypeError!*ast.Node {1317fn transQualType(rp: RestorePoint, qt: ZigClangQualType, source_loc: ZigClangSourceLocation) TypeError!*ast.Node {
...@@ -1316,7 +1358,7 @@ fn transRecordDecl(c: *Context, record_decl: *const ZigClangRecordDecl) TypeErro...@@ -1316,7 +1358,7 @@ fn transRecordDecl(c: *Context, record_decl: *const ZigClangRecordDecl) TypeErro
1316 .init_arg_expr = .None,1358 .init_arg_expr = .None,
1317 .fields_and_decls = ast.Node.ContainerDecl.DeclList.init(c.a()),1359 .fields_and_decls = ast.Node.ContainerDecl.DeclList.init(c.a()),
1318 .lbrace_token = lbrace_token,1360 .lbrace_token = lbrace_token,
1319 .rbrace_token = undefined, // TODO1361 .rbrace_token = undefined,
1320 };1362 };
13211363
1322 var it = ZigClangRecordDecl_field_begin(record_def);1364 var it = ZigClangRecordDecl_field_begin(record_def);
...@@ -1855,17 +1897,14 @@ fn transType(rp: RestorePoint, ty: *const ZigClangType, source_loc: ZigClangSour...@@ -1855,17 +1897,14 @@ fn transType(rp: RestorePoint, ty: *const ZigClangType, source_loc: ZigClangSour
1855 const record_ty = @ptrCast(*const ZigClangRecordType, ty);1897 const record_ty = @ptrCast(*const ZigClangRecordType, ty);
18561898
1857 const record_decl = ZigClangRecordType_getDecl(record_ty);1899 const record_decl = ZigClangRecordType_getDecl(record_ty);
1858 if (rp.c.decl_table.get(@ptrToInt(ZigClangRecordDecl_getCanonicalDecl(record_decl)))) |kv|1900 if (try getContainerName(rp.c, record_decl)) |name|
1859 return appendIdentifier(rp.c, kv.value)1901 return appendIdentifier(rp.c, name)
1860 else1902 else
1861 return transRecordDecl(rp.c, record_decl);1903 return transRecordDecl(rp.c, record_decl);
1862 },1904 },
1863 .Elaborated => {1905 .Elaborated => {
1864 const elaborated_ty = @ptrCast(*const ZigClangElaboratedType, ty);1906 const elaborated_ty = @ptrCast(*const ZigClangElaboratedType, ty);
1865 switch (ZigClangElaboratedType_getKeyword(elaborated_ty)) {1907 return transQualType(rp, ZigClangElaboratedType_getNamedType(elaborated_ty), source_loc);
1866 .Struct, .Enum, .Union => return try transQualType(rp, ZigClangElaboratedType_getNamedType(elaborated_ty), source_loc),
1867 else => return revertAndWarn(rp, error.UnsupportedType, source_loc, "unsupported elaborated type", .{}),
1868 }
1869 },1908 },
1870 else => {1909 else => {
1871 const type_name = rp.c.str(ZigClangType_getTypeClassName(ty));1910 const type_name = rp.c.str(ZigClangType_getTypeClassName(ty));
...@@ -1874,6 +1913,24 @@ fn transType(rp: RestorePoint, ty: *const ZigClangType, source_loc: ZigClangSour...@@ -1874,6 +1913,24 @@ fn transType(rp: RestorePoint, ty: *const ZigClangType, source_loc: ZigClangSour
1874 }1913 }
1875}1914}
18761915
1916fn getContainerName(c: *Context, record_decl: *const ZigClangRecordDecl) !?[]const u8 {
1917 const bare_name = try c.str(ZigClangDecl_getName_bytes_begin(@ptrCast(*const ZigClangDecl, record_decl)));
1918
1919 const container_kind_name = if (ZigClangRecordDecl_isUnion(record_decl))
1920 "union"
1921 else if (ZigClangRecordDecl_isStruct(record_decl))
1922 "struct"
1923 else {
1924 try emitWarning(c, ZigClangRecordDecl_getLocation(record_decl), "record {} is not a struct or union", .{bare_name});
1925 return null;
1926 };
1927
1928 if (ZigClangRecordDecl_isAnonymousStructOrUnion(record_decl) or bare_name.len == 0)
1929 return null;
1930
1931 return try std.fmt.allocPrint(c.a(), "{}_{}", .{ container_kind_name, bare_name });
1932}
1933
1877fn isCVoid(qt: ZigClangQualType) bool {1934fn isCVoid(qt: ZigClangQualType) bool {
1878 const ty = ZigClangQualType_getTypePtr(qt);1935 const ty = ZigClangQualType_getTypePtr(qt);
1879 if (ZigClangType_getTypeClass(ty) == .Builtin) {1936 if (ZigClangType_getTypeClass(ty) == .Builtin) {
test/translate_c.zig+27-73
...@@ -186,72 +186,6 @@ pub fn addCases(cases: *tests.TranslateCContext) void {...@@ -186,72 +186,6 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
186 \\pub export var arr2: [*c]u8 = "hello";186 \\pub export var arr2: [*c]u8 = "hello";
187 });187 });
188188
189 cases.add_2("pointer to struct demoted to opaque due to bit fields",
190 \\struct Foo {
191 \\ unsigned int: 1;
192 \\};
193 \\struct Bar {
194 \\ struct Foo *foo;
195 \\};
196 , &[_][]const u8{ // TODO that semicolon is hideous
197 \\pub const struct_Foo = @OpaqueType() // /home/vexu/Documents/zig/zig/zig-cache/source.h:2:5: warning: struct demoted to opaque type - has bitfield
198 \\ ;
199 \\pub const struct_Bar = extern struct {
200 \\ foo: ?*struct_Foo,
201 \\};
202 });
203
204 cases.add_2("double define struct",
205 \\typedef struct Bar Bar;
206 \\typedef struct Foo Foo;
207 \\
208 \\struct Foo {
209 \\ Foo *a;
210 \\};
211 \\
212 \\struct Bar {
213 \\ Foo *a;
214 \\};
215 , &[_][]const u8{
216 \\pub const struct_Bar = extern struct {
217 \\ a: [*c]Foo,
218 \\};
219 \\pub const Bar = struct_Bar;
220 \\pub const struct_Foo = extern struct {
221 \\ a: [*c]Foo,
222 \\};
223 \\pub const Foo = struct_Foo;
224 });
225
226 cases.add_2("simple struct",
227 \\struct Foo {
228 \\ int x;
229 \\ char *y;
230 \\};
231 , &[_][]const u8{
232 \\const struct_Foo = extern struct {
233 \\ x: c_int,
234 \\ y: [*c]u8,
235 \\};
236 });
237
238 cases.add_2("self referential struct with function pointer",
239 \\struct Foo {
240 \\ void (*derp)(struct Foo *foo);
241 \\};
242 , &[_][]const u8{
243 \\pub const struct_Foo = extern struct {
244 \\ derp: ?extern fn ([*c]struct_Foo) void,
245 \\};
246 });
247 cases.add_2("struct prototype used in func",
248 \\struct Foo;
249 \\struct Foo *some_func(struct Foo *foo, int x);
250 , &[_][]const u8{
251 \\pub const struct_Foo = @OpaqueType();
252 \\pub extern fn some_func(foo: ?*struct_Foo, x: c_int) ?*struct_Foo;
253 });
254
255 cases.add_2("array initializer expr",189 cases.add_2("array initializer expr",
256 \\static void foo(void){190 \\static void foo(void){
257 \\ char arr[10] ={1};191 \\ char arr[10] ={1};
...@@ -268,6 +202,21 @@ pub fn addCases(cases: *tests.TranslateCContext) void {...@@ -268,6 +202,21 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
268 \\}202 \\}
269 });203 });
270204
205 cases.add_2("field struct",
206 \\union OpenGLProcs {
207 \\ struct {
208 \\ int Clear;
209 \\ } gl;
210 \\};
211 , &[_][]const u8{
212 \\pub const union_OpenGLProcs = extern union {
213 \\ gl: extern struct {
214 \\ Clear: c_int,
215 \\ },
216 \\};
217 \\pub const OpenGLProcs = union_OpenGLProcs;
218 });
219
271 /////////////// Cases for only stage1 which are TODO items for stage2 ////////////////220 /////////////// Cases for only stage1 which are TODO items for stage2 ////////////////
272221
273 cases.add_both("typedef of function in struct field",222 cases.add_both("typedef of function in struct field",
...@@ -284,7 +233,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {...@@ -284,7 +233,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
284 \\};233 \\};
285 });234 });
286235
287 cases.add("pointer to struct demoted to opaque due to bit fields",236 cases.add_both("pointer to struct demoted to opaque due to bit fields",
288 \\struct Foo {237 \\struct Foo {
289 \\ unsigned int: 1;238 \\ unsigned int: 1;
290 \\};239 \\};
...@@ -292,7 +241,8 @@ pub fn addCases(cases: *tests.TranslateCContext) void {...@@ -292,7 +241,8 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
292 \\ struct Foo *foo;241 \\ struct Foo *foo;
293 \\};242 \\};
294 , &[_][]const u8{243 , &[_][]const u8{
295 \\pub const struct_Foo = @OpaqueType();244 \\pub const struct_Foo = @OpaqueType()
245 ,
296 \\pub const struct_Bar = extern struct {246 \\pub const struct_Bar = extern struct {
297 \\ foo: ?*struct_Foo,247 \\ foo: ?*struct_Foo,
298 \\};248 \\};
...@@ -441,7 +391,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {...@@ -441,7 +391,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
441 \\}391 \\}
442 });392 });
443393
444 cases.add("double define struct",394 cases.add_both("double define struct",
445 \\typedef struct Bar Bar;395 \\typedef struct Bar Bar;
446 \\typedef struct Foo Foo;396 \\typedef struct Foo Foo;
447 \\397 \\
...@@ -456,10 +406,14 @@ pub fn addCases(cases: *tests.TranslateCContext) void {...@@ -456,10 +406,14 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
456 \\pub const struct_Foo = extern struct {406 \\pub const struct_Foo = extern struct {
457 \\ a: [*c]Foo,407 \\ a: [*c]Foo,
458 \\};408 \\};
409 ,
459 \\pub const Foo = struct_Foo;410 \\pub const Foo = struct_Foo;
411 ,
460 \\pub const struct_Bar = extern struct {412 \\pub const struct_Bar = extern struct {
461 \\ a: [*c]Foo,413 \\ a: [*c]Foo,
462 \\};414 \\};
415 ,
416 \\pub const Bar = struct_Bar;
463 });417 });
464418
465 cases.addAllowWarnings("simple data types",419 cases.addAllowWarnings("simple data types",
...@@ -536,7 +490,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {...@@ -536,7 +490,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
536 \\pub extern fn foo(noalias bar: ?*c_void, noalias arg1: ?*c_void) void;490 \\pub extern fn foo(noalias bar: ?*c_void, noalias arg1: ?*c_void) void;
537 });491 });
538492
539 cases.add("simple struct",493 cases.add_both("simple struct",
540 \\struct Foo {494 \\struct Foo {
541 \\ int x;495 \\ int x;
542 \\ char *y;496 \\ char *y;
...@@ -588,7 +542,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {...@@ -588,7 +542,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
588 \\pub extern fn func(array: [*c]c_int) void;542 \\pub extern fn func(array: [*c]c_int) void;
589 });543 });
590544
591 cases.add("self referential struct with function pointer",545 cases.add_both("self referential struct with function pointer",
592 \\struct Foo {546 \\struct Foo {
593 \\ void (*derp)(struct Foo *foo);547 \\ void (*derp)(struct Foo *foo);
594 \\};548 \\};
...@@ -600,7 +554,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {...@@ -600,7 +554,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
600 \\pub const Foo = struct_Foo;554 \\pub const Foo = struct_Foo;
601 });555 });
602556
603 cases.add("struct prototype used in func",557 cases.add_both("struct prototype used in func",
604 \\struct Foo;558 \\struct Foo;
605 \\struct Foo *some_func(struct Foo *foo, int x);559 \\struct Foo *some_func(struct Foo *foo, int x);
606 , &[_][]const u8{560 , &[_][]const u8{
...@@ -632,7 +586,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {...@@ -632,7 +586,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
632 \\pub const THING2 = THING1;586 \\pub const THING2 = THING1;
633 });587 });
634588
635 cases.add("circular struct definitions",589 cases.add_both("circular struct definitions",
636 \\struct Bar;590 \\struct Bar;
637 \\591 \\
638 \\struct Foo {592 \\struct Foo {