aboutsummaryrefslogtreecommitdiff
path: root/src/codegen/c.zig
diff options
context:
space:
mode:
authorCody Tapscott <cody+topolarity@tapscott.me>2022-01-24 11:17:52 -0700
committerCody Tapscott <cody+topolarity@tapscott.me>2022-01-24 12:00:04 -0700
commit983dfcd3fbd70347537f7b63db9838848caf0ac0 (patch)
tree7b47a2eb85d3f76869530ede526d32138c01448b /src/codegen/c.zig
parent8c96c64fbbab83f14027963d0c4b4da5254a57a8 (diff)
downloadzig-983dfcd3fbd70347537f7b63db9838848caf0ac0.tar.gz
zig-983dfcd3fbd70347537f7b63db9838848caf0ac0.zip
Fix rendering of `void` function args
Diffstat (limited to 'src/codegen/c.zig')
-rw-r--r--src/codegen/c.zig78
1 files changed, 37 insertions, 41 deletions
diff --git a/src/codegen/c.zig b/src/codegen/c.zig
index 22f91feeaa..2e882f0c3e 100644
--- a/src/codegen/c.zig
+++ b/src/codegen/c.zig
@@ -633,22 +633,24 @@ pub const DeclGen = struct {
try dg.renderDeclName(dg.decl, w);
try w.writeAll("(");
const param_len = dg.decl.ty.fnParamLen();
- const is_var_args = dg.decl.ty.fnIsVarArgs();
- if (param_len == 0 and !is_var_args)
- try w.writeAll("void")
- else {
- var index: usize = 0;
- while (index < param_len) : (index += 1) {
- if (index > 0) {
- try w.writeAll(", ");
- }
- try dg.renderType(w, dg.decl.ty.fnParamType(index));
- try w.print(" a{d}", .{index});
+
+ var index: usize = 0;
+ var params_written: usize = 0;
+ while (index < param_len) : (index += 1) {
+ if (dg.decl.ty.fnParamType(index).zigTypeTag() == .Void) continue;
+ if (params_written > 0) {
+ try w.writeAll(", ");
}
+ try dg.renderType(w, dg.decl.ty.fnParamType(index));
+ try w.print(" a{d}", .{index});
+ params_written += 1;
}
- if (is_var_args) {
- if (param_len != 0) try w.writeAll(", ");
+
+ if (dg.decl.ty.fnIsVarArgs()) {
+ if (params_written != 0) try w.writeAll(", ");
try w.writeAll("...");
+ } else if (params_written == 0) {
+ try w.writeAll("void");
}
try w.writeByte(')');
}
@@ -670,21 +672,23 @@ pub const DeclGen = struct {
const name_end = buffer.items.len - 2;
const param_len = fn_info.param_types.len;
- const is_var_args = fn_info.is_var_args;
- if (param_len == 0 and !is_var_args)
- try bw.writeAll("void")
- else {
- var index: usize = 0;
- while (index < param_len) : (index += 1) {
- if (index > 0) {
- try bw.writeAll(", ");
- }
- try dg.renderType(bw, fn_info.param_types[index]);
+
+ var params_written: usize = 0;
+ var index: usize = 0;
+ while (index < param_len) : (index += 1) {
+ if (fn_info.param_types[index].zigTypeTag() == .Void) continue;
+ if (params_written > 0) {
+ try bw.writeAll(", ");
}
+ try dg.renderType(bw, fn_info.param_types[index]);
+ params_written += 1;
}
- if (is_var_args) {
- if (param_len != 0) try bw.writeAll(", ");
+
+ if (fn_info.is_var_args) {
+ if (params_written != 0) try bw.writeAll(", ");
try bw.writeAll("...");
+ } else if (params_written == 0) {
+ try bw.writeAll("void");
}
try bw.writeAll(");\n");
@@ -1128,13 +1132,11 @@ pub fn genDecl(o: *Object) !void {
if (variable.is_threadlocal) {
try fwd_decl_writer.writeAll("zig_threadlocal ");
}
- try o.dg.renderType(fwd_decl_writer, o.dg.decl.ty);
- try fwd_decl_writer.writeAll(" ");
- if (is_global) {
- try fwd_decl_writer.writeAll(mem.span(o.dg.decl.name));
- } else {
- try o.dg.renderDeclName(o.dg.decl, fwd_decl_writer);
- }
+
+ const decl_c_value: CValue = if (is_global) .{ .bytes = mem.span(o.dg.decl.name) }
+ else .{ .decl = o.dg.decl };
+
+ try o.dg.renderTypeAndName(fwd_decl_writer, o.dg.decl.ty, decl_c_value, .Mut, o.dg.decl.align_val);
try fwd_decl_writer.writeAll(";\n");
if (variable.init.isUndefDeep()) {
@@ -1143,13 +1145,7 @@ pub fn genDecl(o: *Object) !void {
try o.indent_writer.insertNewline();
const w = o.writer();
- try o.dg.renderType(w, o.dg.decl.ty);
- try w.writeAll(" ");
- if (is_global) {
- try w.writeAll(mem.span(o.dg.decl.name));
- } else {
- try o.dg.renderDeclName(o.dg.decl, w);
- }
+ try o.dg.renderTypeAndName(w, o.dg.decl.ty, decl_c_value, .Mut, o.dg.decl.align_val);
try w.writeAll(" = ");
if (variable.init.tag() != .unreachable_value) {
try o.dg.renderValue(w, tv.ty, variable.init);
@@ -2364,9 +2360,9 @@ fn airBitcast(f: *Function, inst: Air.Inst.Index) !CValue {
try f.writeCValue(writer, local);
try writer.writeAll(", &");
try f.writeCValue(writer, operand);
- try writer.writeAll(", sizeof ");
+ try writer.writeAll(", sizeof(");
try f.writeCValue(writer, local);
- try writer.writeAll(");\n");
+ try writer.writeAll("));\n");
return local;
}