zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

commit 37f04d66be014291303b7d8ba49ff4232dbdb696 (tree)
parent 52056b156b8e8ed848c909e527f0c89435e24deb
Author: Andrew Kelley <andrew@ziglang.org>
Date:   Mon, 28 Dec 2020 18:24:55 -0700

stage2: C backend: properly render type of array decls

Diffstat:
Msrc/codegen/c.zig | 21++++++++++++++++-----
1 file changed, 16 insertions(+), 5 deletions(-)

diff --git 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"); }