From ddb87237de60cb0feacc606d21c9dd48c5c3bd4b Mon Sep 17 00:00:00 2001 From: LemonBoy Date: Sun, 20 Oct 2019 22:56:58 +0200 Subject: [PATCH] Fix crash with peer type resolution & error unions Fixes #3353 --- src/ir.cpp | 12 ++++++++++++ test/compile_errors.zig | 10 ++++++++++ 2 files changed, 22 insertions(+) diff --git a/src/ir.cpp b/src/ir.cpp index 6bdfd86b29..4cce464a4c 100644 --- a/src/ir.cpp +++ b/src/ir.cpp @@ -10120,6 +10120,18 @@ static ZigType *ir_resolve_peer_types(IrAnalyze *ira, AstNode *source_node, ZigT } else { err_set_type = cur_type; } + + if (!resolve_inferred_error_set(ira->codegen, err_set_type, cur_inst->source_node)) { + return ira->codegen->builtin_types.entry_invalid; + } + + if (type_is_global_error_set(err_set_type)) { + err_set_type = ira->codegen->builtin_types.entry_global_error_set; + continue; + } + + update_errors_helper(ira->codegen, &errors, &errors_count); + for (uint32_t i = 0; i < err_set_type->data.error_set.err_count; i += 1) { ErrorTableEntry *error_entry = err_set_type->data.error_set.errors[i]; assert(errors[error_entry->value] == nullptr); diff --git a/test/compile_errors.zig b/test/compile_errors.zig index 288fd501cf..35c6ded4a4 100644 --- a/test/compile_errors.zig +++ b/test/compile_errors.zig @@ -2,6 +2,16 @@ const tests = @import("tests.zig"); const builtin = @import("builtin"); pub fn addCases(cases: *tests.CompileErrorContext) void { + cases.add( + "comparison with error union and error value", + \\export fn entry() void { + \\ var number_or_error: anyerror!i32 = error.SomethingAwful; + \\ _ = number_or_error == error.SomethingAwful; + \\} + , + "tmp.zig:3:25: error: operator not allowed for type 'anyerror!i32'", + ); + cases.add( "switch with overlapping case ranges", \\export fn entry() void {