Commit 1a0081b763

Andrew Kelley <superjoe30@gmail.com>
2017-04-22 17:45:04
add peer type resolution for T and ?T
See #334
1 parent e0b635e
Changed files (2)
src
test
cases
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)
         {
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);
+}