diff options
| author | Emily Bellows <emily.a.bellows@hey.com> | 2021-10-31 14:21:02 -0400 |
|---|---|---|
| committer | Andrew Kelley <andrew@ziglang.org> | 2021-11-02 12:45:29 -0400 |
| commit | 674932e503e5b3a929f5a17eb4aa2fd2866219c3 (patch) | |
| tree | 996ee589e424fde8f61fe6edd1a02001c49001e2 /src/codegen/c.zig | |
| parent | 325bae7fc0025f7153bd1de1c28e642e896190b1 (diff) | |
| download | zig-674932e503e5b3a929f5a17eb4aa2fd2866219c3.tar.gz zig-674932e503e5b3a929f5a17eb4aa2fd2866219c3.zip | |
C backend: implement ?void, and other zero sized types
Diffstat (limited to 'src/codegen/c.zig')
| -rw-r--r-- | src/codegen/c.zig | 17 |
1 files changed, 16 insertions, 1 deletions
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 }); } |
