Commit b85b68a7fd
Changed files (2)
src
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 {