diff --git a/src/ir.cpp b/src/ir.cpp index 75c49dc53a3372f1debfdf26d6e08cd884f260f5..941210d5833bc6203b7f2be86be7e80b477d807e 100644 --- a/src/ir.cpp +++ b/src/ir.cpp @@ -6120,6 +6120,15 @@ static TypeTableEntry *ir_resolve_peer_types(IrAnalyze *ira, AstNode *source_nod { prev_inst = cur_inst; continue; + } else if (prev_type->id == TypeTableEntryIdMaybe && + types_match_const_cast_only(prev_type->data.maybe.child_type, cur_type)) + { + continue; + } else if (cur_type->id == TypeTableEntryIdMaybe && + types_match_const_cast_only(cur_type->data.maybe.child_type, prev_type)) + { + prev_inst = cur_inst; + continue; } else if (prev_type->id == TypeTableEntryIdNumLitInt || prev_type->id == TypeTableEntryIdNumLitFloat) { diff --git a/test/cases/cast.zig b/test/cases/cast.zig index 9f0d5f330be50359f5481d5825606902381a3e33..74c2ab7b32bdb1c3a36a096b99e9b2f31809e129 100644 --- a/test/cases/cast.zig +++ b/test/cases/cast.zig @@ -116,4 +116,15 @@ fn returnNullFromMaybeTypeErrorRef() -> %?&A { } fn returnNullLitFromMaybeTypeErrorRef() -> %?&A { return null; -} \ No newline at end of file +} + +test "peer type resolution: ?T and T" { + assert(??peerTypeTAndMaybeT(true, false) == 0); +} +fn peerTypeTAndMaybeT(c: bool, b: bool) -> ?usize { + if (c) { + return if (b) null else usize(0); + } + + return usize(3); +}