Skip to content

Commit 3178528

Browse files
committed
Removed zero sized error set optimization
fixes #762 fixes #818
1 parent 27cbb44 commit 3178528

File tree

2 files changed

+31
-10
lines changed

2 files changed

+31
-10
lines changed

src/ir.cpp

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6166,16 +6166,10 @@ static IrInstruction *ir_gen_err_set_decl(IrBuilder *irb, Scope *parent_scope, A
61666166
buf_init_from_buf(&err_set_type->name, type_name);
61676167
err_set_type->is_copyable = true;
61686168
err_set_type->data.error_set.err_count = err_count;
6169-
6170-
if (err_count == 0) {
6171-
err_set_type->zero_bits = true;
6172-
err_set_type->di_type = irb->codegen->builtin_types.entry_void->di_type;
6173-
} else {
6174-
err_set_type->type_ref = irb->codegen->builtin_types.entry_global_error_set->type_ref;
6175-
err_set_type->di_type = irb->codegen->builtin_types.entry_global_error_set->di_type;
6176-
irb->codegen->error_di_types.append(&err_set_type->di_type);
6177-
err_set_type->data.error_set.errors = allocate<ErrorTableEntry *>(err_count);
6178-
}
6169+
err_set_type->type_ref = irb->codegen->builtin_types.entry_global_error_set->type_ref;
6170+
err_set_type->di_type = irb->codegen->builtin_types.entry_global_error_set->di_type;
6171+
irb->codegen->error_di_types.append(&err_set_type->di_type);
6172+
err_set_type->data.error_set.errors = allocate<ErrorTableEntry *>(err_count);
61796173

61806174
ErrorTableEntry **errors = allocate<ErrorTableEntry *>(irb->codegen->errors_by_index.length + err_count);
61816175

test/cases/error.zig

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,3 +175,30 @@ fn baz_1() !i32 {
175175
fn quux_1() !i32 {
176176
return error.C;
177177
}
178+
179+
180+
test "error: fn returning empty error set can be passed as fn returning any error" {
181+
entry();
182+
comptime entry();
183+
}
184+
185+
fn entry() void {
186+
foo2(bar2);
187+
}
188+
189+
fn foo2(f: fn()error!void) void {
190+
const x = f();
191+
}
192+
193+
fn bar2() (error{}!void) { }
194+
195+
196+
test "error: Zero sized error set returned with value payload crash" {
197+
_ = foo3(0);
198+
_ = comptime foo3(0);
199+
}
200+
201+
const Error = error{};
202+
fn foo3(b: usize) Error!usize {
203+
return b;
204+
}

0 commit comments

Comments
 (0)