diff --git a/src-self-hosted/translate_c.zig b/src-self-hosted/translate_c.zig index 1c689e9f76..a204469b83 100644 --- a/src-self-hosted/translate_c.zig +++ b/src-self-hosted/translate_c.zig @@ -1394,6 +1394,24 @@ fn transDeclStmt(rp: RestorePoint, scope: *Scope, stmt: *const ZigClangDeclStmt) node.semicolon_token = try appendToken(c, .Semicolon, ";"); try block_scope.block_node.statements.push(&node.base); }, + .Typedef => { + const type_decl = @ptrCast(*const ZigClangTypedefNameDecl, it[0]); + const name = try c.str(ZigClangNamedDecl_getName_bytes_begin( + @ptrCast(*const ZigClangNamedDecl, type_decl), + )); + + const underlying_qual = ZigClangTypedefNameDecl_getUnderlyingType(type_decl); + const underlying_type = ZigClangQualType_getTypePtr(underlying_qual); + + const mangled_name = try block_scope.makeMangledName(c, name); + const node = try transCreateNodeVarDecl(c, false, true, mangled_name); + node.eq_token = try appendToken(c, .Equal, "="); + + const loc = ZigClangStmt_getBeginLoc(@ptrCast(*const ZigClangStmt, stmt)); + node.init_node = try transType(rp, underlying_type, loc); + node.semicolon_token = try appendToken(c, .Semicolon, ";"); + try block_scope.block_node.statements.push(&node.base); + }, else => |kind| return revertAndWarn( rp, error.UnsupportedTranslation, diff --git a/test/run_translated_c.zig b/test/run_translated_c.zig index ec6a11b9b4..a49fef76d1 100644 --- a/test/run_translated_c.zig +++ b/test/run_translated_c.zig @@ -243,4 +243,15 @@ pub fn addCases(cases: *tests.RunTranslatedCContext) void { \\ return 0; \\} , ""); + + cases.add("scoped typedef", + \\int main(int argc, char **argv) { + \\ typedef int Foo; + \\ typedef Foo Bar; + \\ typedef void (*func)(int); + \\ Foo i; + \\ Bar j; + \\ return 0; + \\} + , ""); }