authorgravatar for thatlemon@gmail.comLemonBoy <thatlemon@gmail.com> 2019-10-20 22:56:58+02:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-10-20 22:03:39-04:00
logddb87237de60cb0feacc606d21c9dd48c5c3bd4b
tree82341819d00348e9c444eed775632a1693a6a36a
parent771dafbabaaf4cda43d722dbc4bcb7d8464b576d

Fix crash with peer type resolution & error unions

Fixes #3353

2 files changed, 22 insertions(+), 0 deletions(-)

src/ir.cpp+12
...@@ -10120,6 +10120,18 @@ static ZigType *ir_resolve_peer_types(IrAnalyze *ira, AstNode *source_node, ZigT...@@ -10120,6 +10120,18 @@ static ZigType *ir_resolve_peer_types(IrAnalyze *ira, AstNode *source_node, ZigT
10120 } else {10120 } else {
10121 err_set_type = cur_type;10121 err_set_type = cur_type;
10122 }10122 }
10123
10124 if (!resolve_inferred_error_set(ira->codegen, err_set_type, cur_inst->source_node)) {
10125 return ira->codegen->builtin_types.entry_invalid;
10126 }
10127
10128 if (type_is_global_error_set(err_set_type)) {
10129 err_set_type = ira->codegen->builtin_types.entry_global_error_set;
10130 continue;
10131 }
10132
10133 update_errors_helper(ira->codegen, &errors, &errors_count);
10134
10123 for (uint32_t i = 0; i < err_set_type->data.error_set.err_count; i += 1) {10135 for (uint32_t i = 0; i < err_set_type->data.error_set.err_count; i += 1) {
10124 ErrorTableEntry *error_entry = err_set_type->data.error_set.errors[i];10136 ErrorTableEntry *error_entry = err_set_type->data.error_set.errors[i];
10125 assert(errors[error_entry->value] == nullptr);10137 assert(errors[error_entry->value] == nullptr);
test/compile_errors.zig+10
...@@ -2,6 +2,16 @@ const tests = @import("tests.zig");...@@ -2,6 +2,16 @@ const tests = @import("tests.zig");
2const builtin = @import("builtin");2const builtin = @import("builtin");
33
4pub fn addCases(cases: *tests.CompileErrorContext) void {4pub fn addCases(cases: *tests.CompileErrorContext) void {
5 cases.add(
6 "comparison with error union and error value",
7 \\export fn entry() void {
8 \\ var number_or_error: anyerror!i32 = error.SomethingAwful;
9 \\ _ = number_or_error == error.SomethingAwful;
10 \\}
11 ,
12 "tmp.zig:3:25: error: operator not allowed for type 'anyerror!i32'",
13 );
14
5 cases.add(15 cases.add(
6 "switch with overlapping case ranges",16 "switch with overlapping case ranges",
7 \\export fn entry() void {17 \\export fn entry() void {