From 674932e503e5b3a929f5a17eb4aa2fd2866219c3 Mon Sep 17 00:00:00 2001 From: Emily Bellows Date: Sun, 31 Oct 2021 14:21:02 -0400 Subject: C backend: implement ?void, and other zero sized types --- src/codegen/c.zig | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) (limited to 'src/codegen') diff --git a/src/codegen/c.zig b/src/codegen/c.zig index 7ca56946d0..5935985961 100644 --- a/src/codegen/c.zig +++ b/src/codegen/c.zig @@ -308,6 +308,11 @@ pub const DeclGen = struct { if (ty.isPtrLikeOptional()) { return dg.renderValue(writer, payload_type, val); } + const target = dg.module.getTarget(); + if (payload_type.abiSize(target) == 0) { + const is_null = val.castTag(.opt_payload) == null; + return writer.print("{}", .{is_null}); + } try writer.writeByte('('); try dg.renderType(writer, ty); try writer.writeAll("){"); @@ -588,10 +593,13 @@ pub const DeclGen = struct { .Optional => { var opt_buf: Type.Payload.ElemType = undefined; const child_type = t.optionalChild(&opt_buf); + const target = dg.module.getTarget(); if (t.isPtrLikeOptional()) { return dg.renderType(w, child_type); } else if (dg.typedefs.get(t)) |some| { return w.writeAll(some.name); + } else if (child_type.abiSize(target) == 0) { + return w.writeAll("bool"); } var buffer = std.ArrayList(u8).init(dg.typedefs.allocator); @@ -2100,14 +2108,21 @@ fn airIsNull( const un_op = f.air.instructions.items(.data)[inst].un_op; const writer = f.object.writer(); const operand = try f.resolveInst(un_op); + const target = f.object.dg.module.getTarget(); const local = try f.allocLocal(Type.initTag(.bool), .Const); try writer.writeAll(" = ("); try f.writeCValue(writer, operand); - if (f.air.typeOf(un_op).isPtrLikeOptional()) { + const ty = f.air.typeOf(un_op); + var opt_buf: Type.Payload.ElemType = undefined; + const payload_type = ty.optionalChild(&opt_buf); + + if (ty.isPtrLikeOptional()) { // operand is a regular pointer, test `operand !=/== NULL` try writer.print("){s} {s} NULL;\n", .{ deref_suffix, operator }); + } else if (payload_type.abiSize(target) == 0) { + try writer.print("){s} {s} true;\n", .{ deref_suffix, operator }); } else { try writer.print("){s}.is_null {s} true;\n", .{ deref_suffix, operator }); } -- cgit v1.2.3