From 32c27daae413b3348b5e25faf174651775e8bf4a Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Sat, 23 May 2020 17:50:35 -0400 Subject: [PATCH] translate-c: fix decl statement regression --- src-self-hosted/clang.zig | 11 ++- src-self-hosted/translate_c.zig | 147 +++++++++++++++++--------------- 2 files changed, 85 insertions(+), 73 deletions(-) diff --git a/src-self-hosted/clang.zig b/src-self-hosted/clang.zig index 72818d4ccc..624dbe1dad 100644 --- a/src-self-hosted/clang.zig +++ b/src-self-hosted/clang.zig @@ -22,7 +22,7 @@ pub const struct_ZigClangCompoundStmt = @Type(.Opaque); pub const struct_ZigClangConstantArrayType = @Type(.Opaque); pub const struct_ZigClangContinueStmt = @Type(.Opaque); pub const struct_ZigClangDecayedType = @Type(.Opaque); -pub const struct_ZigClangDecl = @Type(.Opaque); +pub const ZigClangDecl = @Type(.Opaque); pub const struct_ZigClangDeclRefExpr = @Type(.Opaque); pub const struct_ZigClangDeclStmt = @Type(.Opaque); pub const struct_ZigClangDefaultStmt = @Type(.Opaque); @@ -781,7 +781,7 @@ pub extern fn ZigClangSourceManager_getCharacterData(self: ?*const struct_ZigCla pub extern fn ZigClangASTContext_getPointerType(self: ?*const struct_ZigClangASTContext, T: struct_ZigClangQualType) struct_ZigClangQualType; pub extern fn ZigClangASTUnit_getASTContext(self: ?*struct_ZigClangASTUnit) ?*struct_ZigClangASTContext; pub extern fn ZigClangASTUnit_getSourceManager(self: *struct_ZigClangASTUnit) *struct_ZigClangSourceManager; -pub extern fn ZigClangASTUnit_visitLocalTopLevelDecls(self: *struct_ZigClangASTUnit, context: ?*c_void, Fn: ?fn (?*c_void, *const struct_ZigClangDecl) callconv(.C) bool) bool; +pub extern fn ZigClangASTUnit_visitLocalTopLevelDecls(self: *struct_ZigClangASTUnit, context: ?*c_void, Fn: ?fn (?*c_void, *const ZigClangDecl) callconv(.C) bool) bool; pub extern fn ZigClangRecordType_getDecl(record_ty: ?*const struct_ZigClangRecordType) *const struct_ZigClangRecordDecl; pub extern fn ZigClangTagDecl_isThisDeclarationADefinition(self: *const ZigClangTagDecl) bool; pub extern fn ZigClangEnumType_getDecl(record_ty: ?*const struct_ZigClangEnumType) *const struct_ZigClangEnumDecl; @@ -817,7 +817,7 @@ pub extern fn ZigClangEnumDecl_enumerator_end(*const ZigClangEnumDecl) ZigClangE pub extern fn ZigClangEnumDecl_enumerator_iterator_next(ZigClangEnumDecl_enumerator_iterator) ZigClangEnumDecl_enumerator_iterator; pub extern fn ZigClangEnumDecl_enumerator_iterator_deref(ZigClangEnumDecl_enumerator_iterator) *const ZigClangEnumConstantDecl; pub extern fn ZigClangEnumDecl_enumerator_iterator_neq(ZigClangEnumDecl_enumerator_iterator, ZigClangEnumDecl_enumerator_iterator) bool; -pub extern fn ZigClangDecl_castToNamedDecl(decl: *const struct_ZigClangDecl) ?*const ZigClangNamedDecl; +pub extern fn ZigClangDecl_castToNamedDecl(decl: *const ZigClangDecl) ?*const ZigClangNamedDecl; pub extern fn ZigClangNamedDecl_getName_bytes_begin(decl: ?*const struct_ZigClangNamedDecl) [*:0]const u8; pub extern fn ZigClangSourceLocation_eq(a: struct_ZigClangSourceLocation, b: struct_ZigClangSourceLocation) bool; pub extern fn ZigClangTypedefType_getDecl(self: ?*const struct_ZigClangTypedefType) *const struct_ZigClangTypedefNameDecl; @@ -918,7 +918,6 @@ pub const ZigClangCompoundStmt = struct_ZigClangCompoundStmt; pub const ZigClangConstantArrayType = struct_ZigClangConstantArrayType; pub const ZigClangContinueStmt = struct_ZigClangContinueStmt; pub const ZigClangDecayedType = struct_ZigClangDecayedType; -pub const ZigClangDecl = struct_ZigClangDecl; pub const ZigClangDeclRefExpr = struct_ZigClangDeclRefExpr; pub const ZigClangDeclStmt = struct_ZigClangDeclStmt; pub const ZigClangDefaultStmt = struct_ZigClangDefaultStmt; @@ -1015,14 +1014,14 @@ pub extern fn ZigClangLoadFromCommandLine( ) ?*ZigClangASTUnit; pub extern fn ZigClangDecl_getKind(decl: *const ZigClangDecl) ZigClangDeclKind; -pub extern fn ZigClangDecl_getDeclKindName(decl: *const struct_ZigClangDecl) [*:0]const u8; +pub extern fn ZigClangDecl_getDeclKindName(decl: *const ZigClangDecl) [*:0]const u8; pub const ZigClangCompoundStmt_const_body_iterator = [*]const *ZigClangStmt; pub extern fn ZigClangCompoundStmt_body_begin(self: *const ZigClangCompoundStmt) ZigClangCompoundStmt_const_body_iterator; pub extern fn ZigClangCompoundStmt_body_end(self: *const ZigClangCompoundStmt) ZigClangCompoundStmt_const_body_iterator; -pub const ZigClangDeclStmt_const_decl_iterator = [*]const *struct_ZigClangDecl; +pub const ZigClangDeclStmt_const_decl_iterator = [*]const *ZigClangDecl; pub extern fn ZigClangDeclStmt_decl_begin(self: *const ZigClangDeclStmt) ZigClangDeclStmt_const_decl_iterator; pub extern fn ZigClangDeclStmt_decl_end(self: *const ZigClangDeclStmt) ZigClangDeclStmt_const_decl_iterator; diff --git a/src-self-hosted/translate_c.zig b/src-self-hosted/translate_c.zig index 428b8e11c1..365295264b 100644 --- a/src-self-hosted/translate_c.zig +++ b/src-self-hosted/translate_c.zig @@ -1443,78 +1443,91 @@ fn transCStyleCastExprClass( return maybeSuppressResult(rp, scope, result_used, cast_node); } -fn transDeclStmt(rp: RestorePoint, scope: *Scope, stmt: *const ZigClangDeclStmt) TransError!*ast.Node { +fn transDeclStmtOne(rp: RestorePoint, scope: *Scope, decl: *const ZigClangDecl, block_scope: *Scope.Block,) TransError!*ast.Node { const c = rp.c; - const block_scope = scope.findBlockScope(c) catch unreachable; + + switch (ZigClangDecl_getKind(decl)) { + .Var => { + const var_decl = @ptrCast(*const ZigClangVarDecl, decl); + + const thread_local_token = if (ZigClangVarDecl_getTLSKind(var_decl) == .None) + null + else + try appendToken(c, .Keyword_threadlocal, "threadlocal"); + const qual_type = ZigClangVarDecl_getTypeSourceInfo_getType(var_decl); + const name = try c.str(ZigClangNamedDecl_getName_bytes_begin( + @ptrCast(*const ZigClangNamedDecl, var_decl), + )); + const mangled_name = try block_scope.makeMangledName(c, name); + const node = try transCreateNodeVarDecl(c, false, ZigClangQualType_isConstQualified(qual_type), mangled_name); + + _ = try appendToken(c, .Colon, ":"); + const loc = ZigClangDecl_getLocation(decl); + node.type_node = try transQualType(rp, qual_type, loc); + + node.eq_token = try appendToken(c, .Equal, "="); + var init_node = if (ZigClangVarDecl_getInit(var_decl)) |expr| + try transExprCoercing(rp, scope, expr, .used, .r_value) + else + try transCreateNodeUndefinedLiteral(c); + if (!qualTypeIsBoolean(qual_type) and isBoolRes(init_node)) { + const builtin_node = try rp.c.createBuiltinCall("@boolToInt", 1); + builtin_node.params()[0] = init_node; + builtin_node.rparen_token = try appendToken(rp.c, .RParen, ")"); + init_node = &builtin_node.base; + } + node.init_node = init_node; + node.semicolon_token = try appendToken(c, .Semicolon, ";"); + return &node.base; + }, + .Typedef => { + const typedef_decl = @ptrCast(*const ZigClangTypedefNameDecl, decl); + const name = try c.str(ZigClangNamedDecl_getName_bytes_begin( + @ptrCast(*const ZigClangNamedDecl, typedef_decl), + )); + + const underlying_qual = ZigClangTypedefNameDecl_getUnderlyingType(typedef_decl); + const underlying_type = ZigClangQualType_getTypePtr(underlying_qual); + + const mangled_name = try block_scope.makeMangledName(c, name); + if (checkForBuiltinTypedef(name)) |builtin| { + try block_scope.variables.append(.{ + .alias = builtin, + .name = mangled_name, + }); + @panic("what are we supposed to return here?"); + } else { + const node = (try transCreateNodeTypedef(rp, typedef_decl, false, mangled_name)) orelse + return error.UnsupportedTranslation; + return &node.base; + } + }, + else => |kind| return revertAndWarn( + rp, + error.UnsupportedTranslation, + ZigClangDecl_getLocation(decl), + "TODO implement translation of DeclStmt kind {}", + .{@tagName(kind)}, + ), + } +} + +fn transDeclStmt(rp: RestorePoint, scope: *Scope, stmt: *const ZigClangDeclStmt) TransError!*ast.Node { + const block_scope = scope.findBlockScope(rp.c) catch unreachable; var it = ZigClangDeclStmt_decl_begin(stmt); const end_it = ZigClangDeclStmt_decl_end(stmt); - while (it != end_it) : (it += 1) { - switch (ZigClangDecl_getKind(it[0])) { - .Var => { - const var_decl = @ptrCast(*const ZigClangVarDecl, it[0]); + assert(it != end_it); + while (true) : (it += 1) { + const node = try transDeclStmtOne(rp, scope, it[0], block_scope); - const thread_local_token = if (ZigClangVarDecl_getTLSKind(var_decl) == .None) - null - else - try appendToken(c, .Keyword_threadlocal, "threadlocal"); - const qual_type = ZigClangVarDecl_getTypeSourceInfo_getType(var_decl); - const name = try c.str(ZigClangNamedDecl_getName_bytes_begin( - @ptrCast(*const ZigClangNamedDecl, var_decl), - )); - const mangled_name = try block_scope.makeMangledName(c, name); - const node = try transCreateNodeVarDecl(c, false, ZigClangQualType_isConstQualified(qual_type), mangled_name); - - _ = try appendToken(c, .Colon, ":"); - const loc = ZigClangStmt_getBeginLoc(@ptrCast(*const ZigClangStmt, stmt)); - node.type_node = try transQualType(rp, qual_type, loc); - - node.eq_token = try appendToken(c, .Equal, "="); - var init_node = if (ZigClangVarDecl_getInit(var_decl)) |expr| - try transExprCoercing(rp, scope, expr, .used, .r_value) - else - try transCreateNodeUndefinedLiteral(c); - if (!qualTypeIsBoolean(qual_type) and isBoolRes(init_node)) { - const builtin_node = try rp.c.createBuiltinCall("@boolToInt", 1); - builtin_node.params()[0] = init_node; - builtin_node.rparen_token = try appendToken(rp.c, .RParen, ")"); - init_node = &builtin_node.base; - } - node.init_node = init_node; - node.semicolon_token = try appendToken(c, .Semicolon, ";"); - try block_scope.statements.append(&node.base); - }, - .Typedef => { - const typedef_decl = @ptrCast(*const ZigClangTypedefNameDecl, it[0]); - const name = try c.str(ZigClangNamedDecl_getName_bytes_begin( - @ptrCast(*const ZigClangNamedDecl, typedef_decl), - )); - - const underlying_qual = ZigClangTypedefNameDecl_getUnderlyingType(typedef_decl); - const underlying_type = ZigClangQualType_getTypePtr(underlying_qual); - - const mangled_name = try block_scope.makeMangledName(c, name); - if (checkForBuiltinTypedef(name)) |builtin| { - try block_scope.variables.append(.{ - .alias = builtin, - .name = mangled_name, - }); - } else { - const node = (try transCreateNodeTypedef(rp, typedef_decl, false, mangled_name)) orelse return error.UnsupportedTranslation; - try block_scope.statements.append(&node.base); - } - }, - else => |kind| return revertAndWarn( - rp, - error.UnsupportedTranslation, - ZigClangStmt_getBeginLoc(@ptrCast(*const ZigClangStmt, stmt)), - "TODO implement translation of DeclStmt kind {}", - .{@tagName(kind)}, - ), + if (it + 1 == end_it) { + return node; + } else { + try block_scope.statements.append(node); } } - - @panic("previously the code was returning the containing block scope node here and I do not understand why it would do that"); + unreachable; } fn transDeclRefExpr( @@ -2099,6 +2112,8 @@ fn transInitListExprRecord( var field_inits = std.ArrayList(*ast.Node).init(rp.c.gpa); defer field_inits.deinit(); + _ = try appendToken(rp.c, .LBrace, "{"); + var init_i: c_uint = 0; var it = ZigClangRecordDecl_field_begin(record_def); const end_it = ZigClangRecordDecl_field_end(record_def); @@ -2138,8 +2153,6 @@ fn transInitListExprRecord( _ = try appendToken(rp.c, .Comma, ","); } - _ = try appendToken(rp.c, .LBrace, "{"); - const node = try ast.Node.StructInitializer.alloc(rp.c.arena, field_inits.items.len); node.* = .{ .lhs = ty_node,