diff options
| author | Cody Tapscott <cody+topolarity@tapscott.me> | 2022-01-24 11:17:52 -0700 |
|---|---|---|
| committer | Cody Tapscott <cody+topolarity@tapscott.me> | 2022-01-24 12:00:04 -0700 |
| commit | 983dfcd3fbd70347537f7b63db9838848caf0ac0 (patch) | |
| tree | 7b47a2eb85d3f76869530ede526d32138c01448b /src/codegen/c.zig | |
| parent | 8c96c64fbbab83f14027963d0c4b4da5254a57a8 (diff) | |
| download | zig-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.zig | 78 |
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; } |
