diff options
| author | Jimmi Holst Christensen <jimmiholstchristensen@gmail.com> | 2018-04-28 14:05:08 +0200 |
|---|---|---|
| committer | Jimmi Holst Christensen <jimmiholstchristensen@gmail.com> | 2018-04-28 14:05:08 +0200 |
| commit | 3178528335cb5efbf237cecb9ea9eb3bfa31b21f (patch) | |
| tree | 3a0d8ef0107e6a9989a55f2a3d8070ad42999217 | |
| parent | 27cbb44993389ae042a03266743379c0f15a523e (diff) | |
| download | zig-3178528335cb5efbf237cecb9ea9eb3bfa31b21f.tar.gz zig-3178528335cb5efbf237cecb9ea9eb3bfa31b21f.zip | |
Removed zero sized error set optimization
fixes #762
fixes #818
| -rw-r--r-- | src/ir.cpp | 14 | ||||
| -rw-r--r-- | test/cases/error.zig | 27 |
2 files changed, 31 insertions, 10 deletions
diff --git a/src/ir.cpp b/src/ir.cpp index 86c77758b2..ec7f41d748 100644 --- a/src/ir.cpp +++ b/src/ir.cpp @@ -6166,16 +6166,10 @@ static IrInstruction *ir_gen_err_set_decl(IrBuilder *irb, Scope *parent_scope, A buf_init_from_buf(&err_set_type->name, type_name); err_set_type->is_copyable = true; err_set_type->data.error_set.err_count = err_count; - - if (err_count == 0) { - err_set_type->zero_bits = true; - err_set_type->di_type = irb->codegen->builtin_types.entry_void->di_type; - } else { - err_set_type->type_ref = irb->codegen->builtin_types.entry_global_error_set->type_ref; - err_set_type->di_type = irb->codegen->builtin_types.entry_global_error_set->di_type; - irb->codegen->error_di_types.append(&err_set_type->di_type); - err_set_type->data.error_set.errors = allocate<ErrorTableEntry *>(err_count); - } + err_set_type->type_ref = irb->codegen->builtin_types.entry_global_error_set->type_ref; + err_set_type->di_type = irb->codegen->builtin_types.entry_global_error_set->di_type; + irb->codegen->error_di_types.append(&err_set_type->di_type); + err_set_type->data.error_set.errors = allocate<ErrorTableEntry *>(err_count); ErrorTableEntry **errors = allocate<ErrorTableEntry *>(irb->codegen->errors_by_index.length + err_count); diff --git a/test/cases/error.zig b/test/cases/error.zig index e64bf02c91..c64c835fc4 100644 --- a/test/cases/error.zig +++ b/test/cases/error.zig @@ -175,3 +175,30 @@ fn baz_1() !i32 { fn quux_1() !i32 { return error.C; } + + +test "error: fn returning empty error set can be passed as fn returning any error" { + entry(); + comptime entry(); +} + +fn entry() void { + foo2(bar2); +} + +fn foo2(f: fn()error!void) void { + const x = f(); +} + +fn bar2() (error{}!void) { } + + +test "error: Zero sized error set returned with value payload crash" { + _ = foo3(0); + _ = comptime foo3(0); +} + +const Error = error{}; +fn foo3(b: usize) Error!usize { + return b; +} |
