diff options
| author | Andrew Kelley <andrew@ziglang.org> | 2020-12-28 18:24:55 -0700 |
|---|---|---|
| committer | Andrew Kelley <andrew@ziglang.org> | 2020-12-28 18:24:55 -0700 |
| commit | 37f04d66be014291303b7d8ba49ff4232dbdb696 (patch) | |
| tree | c20d8d1848246a53e41e8e4b120d8b8f9bb2b66d /src | |
| parent | 52056b156b8e8ed848c909e527f0c89435e24deb (diff) | |
| download | zig-37f04d66be014291303b7d8ba49ff4232dbdb696.tar.gz zig-37f04d66be014291303b7d8ba49ff4232dbdb696.zip | |
stage2: C backend: properly render type of array decls
Diffstat (limited to 'src')
| -rw-r--r-- | src/codegen/c.zig | 21 |
1 files changed, 16 insertions, 5 deletions
diff --git a/src/codegen/c.zig b/src/codegen/c.zig index a568e4df45..3311a9a25e 100644 --- a/src/codegen/c.zig +++ b/src/codegen/c.zig @@ -86,9 +86,7 @@ fn renderType( }, .Array => { try renderType(ctx, writer, t.elemType()); - const sentinel_bit = @boolToInt(t.sentinel() != null); - const c_len = t.arrayLen() + sentinel_bit; - try writer.print("[{d}]", .{c_len}); + try writer.writeAll(" *"); }, else => |e| return ctx.fail(ctx.decl.src(), "TODO: C backend: implement type {s}", .{ @tagName(e), @@ -254,8 +252,21 @@ pub fn generate(file: *C, decl: *Decl) !void { // TODO ask the Decl if it is const // https://github.com/ziglang/zig/issues/7582 - try renderType(&ctx, writer, tv.ty); - try writer.print(" {s} = ", .{decl.name}); + var suffix = std.ArrayList(u8).init(file.base.allocator); + defer suffix.deinit(); + + var render_ty = tv.ty; + while (render_ty.zigTypeTag() == .Array) { + const sentinel_bit = @boolToInt(render_ty.sentinel() != null); + const c_len = render_ty.arrayLen() + sentinel_bit; + try suffix.writer().print("[{d}]", .{c_len}); + render_ty = render_ty.elemType(); + } + + try renderType(&ctx, writer, render_ty); + try writer.print(" {s}{s}", .{ decl.name, suffix.items }); + + try writer.writeAll(" = "); try renderValue(&ctx, writer, tv.ty, tv.val); try writer.writeAll(";\n"); } |
