Commit ddb87237de

LemonBoy <thatlemon@gmail.com>
2019-10-20 22:56:58
Fix crash with peer type resolution & error unions
Fixes #3353
1 parent 771dafb
Changed files (2)
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);
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 {