authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2020-12-28 18:24:55-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2020-12-28 18:24:55-07:00
log37f04d66be014291303b7d8ba49ff4232dbdb696
treec20d8d1848246a53e41e8e4b120d8b8f9bb2b66d
parent52056b156b8e8ed848c909e527f0c89435e24deb

stage2: C backend: properly render type of array decls


1 files changed, 16 insertions(+), 5 deletions(-)

src/codegen/c.zig+16-5
......@@ -86,9 +86,7 @@ fn renderType(
8686 },
8787 .Array => {
8888 try renderType(ctx, writer, t.elemType());
89 const sentinel_bit = @boolToInt(t.sentinel() != null);
90 const c_len = t.arrayLen() + sentinel_bit;
91 try writer.print("[{d}]", .{c_len});
89 try writer.writeAll(" *");
9290 },
9391 else => |e| return ctx.fail(ctx.decl.src(), "TODO: C backend: implement type {s}", .{
9492 @tagName(e),
......@@ -254,8 +252,21 @@ pub fn generate(file: *C, decl: *Decl) !void {
254252 // TODO ask the Decl if it is const
255253 // https://github.com/ziglang/zig/issues/7582
256254
257 try renderType(&ctx, writer, tv.ty);
258 try writer.print(" {s} = ", .{decl.name});
255 var suffix = std.ArrayList(u8).init(file.base.allocator);
256 defer suffix.deinit();
257
258 var render_ty = tv.ty;
259 while (render_ty.zigTypeTag() == .Array) {
260 const sentinel_bit = @boolToInt(render_ty.sentinel() != null);
261 const c_len = render_ty.arrayLen() + sentinel_bit;
262 try suffix.writer().print("[{d}]", .{c_len});
263 render_ty = render_ty.elemType();
264 }
265
266 try renderType(&ctx, writer, render_ty);
267 try writer.print(" {s}{s}", .{ decl.name, suffix.items });
268
269 try writer.writeAll(" = ");
259270 try renderValue(&ctx, writer, tv.ty, tv.val);
260271 try writer.writeAll(";\n");
261272 }