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(...@@ -86,9 +86,7 @@ fn renderType(
86 },86 },
87 .Array => {87 .Array => {
88 try renderType(ctx, writer, t.elemType());88 try renderType(ctx, writer, t.elemType());
89 const sentinel_bit = @boolToInt(t.sentinel() != null);89 try writer.writeAll(" *");
90 const c_len = t.arrayLen() + sentinel_bit;
91 try writer.print("[{d}]", .{c_len});
92 },90 },
93 else => |e| return ctx.fail(ctx.decl.src(), "TODO: C backend: implement type {s}", .{91 else => |e| return ctx.fail(ctx.decl.src(), "TODO: C backend: implement type {s}", .{
94 @tagName(e),92 @tagName(e),
...@@ -254,8 +252,21 @@ pub fn generate(file: *C, decl: *Decl) !void {...@@ -254,8 +252,21 @@ pub fn generate(file: *C, decl: *Decl) !void {
254 // TODO ask the Decl if it is const252 // TODO ask the Decl if it is const
255 // https://github.com/ziglang/zig/issues/7582253 // https://github.com/ziglang/zig/issues/7582
256254
257 try renderType(&ctx, writer, tv.ty);255 var suffix = std.ArrayList(u8).init(file.base.allocator);
258 try writer.print(" {s} = ", .{decl.name});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(" = ");
259 try renderValue(&ctx, writer, tv.ty, tv.val);270 try renderValue(&ctx, writer, tv.ty, tv.val);
260 try writer.writeAll(";\n");271 try writer.writeAll(";\n");
261 }272 }