Commit b85b68a7fd

Andrew Kelley <superjoe30@gmail.com>
2018-06-02 21:20:51
better compile error for error sets behind nullable
1 parent e514454
Changed files (2)
src/ir.cpp
@@ -7934,11 +7934,20 @@ static ImplicitCastMatchResult ir_types_match_with_implicit_cast(IrAnalyze *ira,
         return ImplicitCastMatchResultReportedError;
     }
 
+    // implicit conversion from ?T to ?U
+    if (expected_type->id == TypeTableEntryIdMaybe && actual_type->id == TypeTableEntryIdMaybe) {
+        ImplicitCastMatchResult res = ir_types_match_with_implicit_cast(ira, expected_type->data.maybe.child_type,
+                actual_type->data.maybe.child_type, value);
+        if (res != ImplicitCastMatchResultNo)
+            return res;
+    }
+
     // implicit conversion from non maybe type to maybe type
-    if (expected_type->id == TypeTableEntryIdMaybe &&
-        ir_types_match_with_implicit_cast(ira, expected_type->data.maybe.child_type, actual_type, value))
-    {
-        return ImplicitCastMatchResultYes;
+    if (expected_type->id == TypeTableEntryIdMaybe) {
+        ImplicitCastMatchResult res = ir_types_match_with_implicit_cast(ira, expected_type->data.maybe.child_type,
+                actual_type, value);
+        if (res != ImplicitCastMatchResultNo)
+            return res;
     }
 
     // implicit conversion from null literal to maybe type
test/compile_errors.zig
@@ -1,6 +1,23 @@
 const tests = @import("tests.zig");
 
 pub fn addCases(cases: *tests.CompileErrorContext) void {
+    cases.add(
+        "invalid deref on switch target",
+        \\const NextError = error{NextError};
+        \\const OtherError = error{OutOfMemory};
+        \\
+        \\export fn entry() void {
+        \\    const a: ?NextError!i32 = foo();
+        \\}
+        \\
+        \\fn foo() ?OtherError!i32 {
+        \\    return null;
+        \\}
+    ,
+        ".tmp_source.zig:5:34: error: expected 'NextError!i32', found 'OtherError!i32'",
+        ".tmp_source.zig:2:26: note: 'error.OutOfMemory' not a member of destination error set",
+    );
+
     cases.add(
         "invalid deref on switch target",
         \\comptime {