aboutsummaryrefslogtreecommitdiff
path: root/src/codegen
diff options
context:
space:
mode:
authorEmily Bellows <emily.a.bellows@hey.com>2021-10-31 14:21:02 -0400
committerAndrew Kelley <andrew@ziglang.org>2021-11-02 12:45:29 -0400
commit674932e503e5b3a929f5a17eb4aa2fd2866219c3 (patch)
tree996ee589e424fde8f61fe6edd1a02001c49001e2 /src/codegen
parent325bae7fc0025f7153bd1de1c28e642e896190b1 (diff)
downloadzig-674932e503e5b3a929f5a17eb4aa2fd2866219c3.tar.gz
zig-674932e503e5b3a929f5a17eb4aa2fd2866219c3.zip
C backend: implement ?void, and other zero sized types
Diffstat (limited to 'src/codegen')
-rw-r--r--src/codegen/c.zig17
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 });
}