authorgravatar for jhc@dismail.deJimmi Holst Christensen <jhc@dismail.de> 2018-04-28 14:05:08+02:00
committergravatar for jhc@dismail.deJimmi Holst Christensen <jhc@dismail.de> 2018-04-28 14:05:08+02:00
log3178528335cb5efbf237cecb9ea9eb3bfa31b21f
tree3a0d8ef0107e6a9989a55f2a3d8070ad42999217
parent27cbb44993389ae042a03266743379c0f15a523e

Removed zero sized error set optimization

fixes #762 fixes #818

2 files changed, 31 insertions(+), 10 deletions(-)

src/ir.cpp+4-10
...@@ -6166,16 +6166,10 @@ static IrInstruction *ir_gen_err_set_decl(IrBuilder *irb, Scope *parent_scope, A...@@ -6166,16 +6166,10 @@ static IrInstruction *ir_gen_err_set_decl(IrBuilder *irb, Scope *parent_scope, A
6166 buf_init_from_buf(&err_set_type->name, type_name);6166 buf_init_from_buf(&err_set_type->name, type_name);
6167 err_set_type->is_copyable = true;6167 err_set_type->is_copyable = true;
6168 err_set_type->data.error_set.err_count = err_count;6168 err_set_type->data.error_set.err_count = err_count;
61696169 err_set_type->type_ref = irb->codegen->builtin_types.entry_global_error_set->type_ref;
6170 if (err_count == 0) {6170 err_set_type->di_type = irb->codegen->builtin_types.entry_global_error_set->di_type;
6171 err_set_type->zero_bits = true;6171 irb->codegen->error_di_types.append(&err_set_type->di_type);
6172 err_set_type->di_type = irb->codegen->builtin_types.entry_void->di_type;6172 err_set_type->data.error_set.errors = allocate<ErrorTableEntry *>(err_count);
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 }
61796173
6180 ErrorTableEntry **errors = allocate<ErrorTableEntry *>(irb->codegen->errors_by_index.length + err_count);6174 ErrorTableEntry **errors = allocate<ErrorTableEntry *>(irb->codegen->errors_by_index.length + err_count);
61816175
test/cases/error.zig+27
...@@ -175,3 +175,30 @@ fn baz_1() !i32 {...@@ -175,3 +175,30 @@ fn baz_1() !i32 {
175fn quux_1() !i32 {175fn quux_1() !i32 {
176 return error.C;176 return error.C;
177}177}
178
179
180test "error: fn returning empty error set can be passed as fn returning any error" {
181 entry();
182 comptime entry();
183}
184
185fn entry() void {
186 foo2(bar2);
187}
188
189fn foo2(f: fn()error!void) void {
190 const x = f();
191}
192
193fn bar2() (error{}!void) { }
194
195
196test "error: Zero sized error set returned with value payload crash" {
197 _ = foo3(0);
198 _ = comptime foo3(0);
199}
200
201const Error = error{};
202fn foo3(b: usize) Error!usize {
203 return b;
204}