cbe: fix bug where empty enum would be generated

fix a bug where an invalid empty enum would be emitted into the C
source file if the global error set was empty.
This commit is contained in:
notcancername 2023-07-19 06:44:39 +02:00 committed by Jacob Young
parent 996eb01746
commit ce859cfcb8

View file

@ -2406,22 +2406,24 @@ pub fn genErrDecls(o: *Object) !void {
const mod = o.dg.module; const mod = o.dg.module;
const writer = o.writer(); const writer = o.writer();
try writer.writeAll("enum {\n");
o.indent_writer.pushIndent();
var max_name_len: usize = 0; var max_name_len: usize = 0;
for (mod.global_error_set.keys()[1..], 1..) |name_nts, value| { // do not generate an invalid empty enum when the global error set is empty
const name = mod.intern_pool.stringToSlice(name_nts); if (mod.global_error_set.keys().len > 1) {
max_name_len = @max(name.len, max_name_len); try writer.writeAll("enum {\n");
const err_val = try mod.intern(.{ .err = .{ o.indent_writer.pushIndent();
.ty = .anyerror_type, for (mod.global_error_set.keys()[1..], 1..) |name_nts, value| {
.name = name_nts, const name = mod.intern_pool.stringToSlice(name_nts);
} }); max_name_len = @max(name.len, max_name_len);
try o.dg.renderValue(writer, Type.anyerror, err_val.toValue(), .Other); const err_val = try mod.intern(.{ .err = .{
try writer.print(" = {d}u,\n", .{value}); .ty = .anyerror_type,
.name = name_nts,
} });
try o.dg.renderValue(writer, Type.anyerror, err_val.toValue(), .Other);
try writer.print(" = {d}u,\n", .{value});
}
o.indent_writer.popIndent();
try writer.writeAll("};\n");
} }
o.indent_writer.popIndent();
try writer.writeAll("};\n");
const array_identifier = "zig_errorName"; const array_identifier = "zig_errorName";
const name_prefix = array_identifier ++ "_"; const name_prefix = array_identifier ++ "_";
const name_buf = try o.dg.gpa.alloc(u8, name_prefix.len + max_name_len); const name_buf = try o.dg.gpa.alloc(u8, name_prefix.len + max_name_len);