Commit 4d50bc3f8d

Andrew Kelley <andrew@ziglang.org>
2019-03-23 23:46:20
add peer type resolution for `*const T` and `?*T`
closes #1298
1 parent 89953ec
Changed files (3)
doc
src
test
stage1
behavior
doc/langref.html.in
@@ -4695,6 +4695,13 @@ fn peerTypeEmptyArrayAndSliceAndError(a: bool, slice: []u8) anyerror![]u8 {
 
     return slice[0..1];
 }
+
+test "peer type resolution: *const T and ?*T" {
+    const a = @intToPtr(*const usize, 0x123456789);
+    const b = @intToPtr(?*usize, 0x123456789);
+    assert(a == b);
+    assert(b == a);
+}
       {#code_end#}
       {#header_close#}
       {#header_close#}
src/ir.cpp
@@ -9658,6 +9658,23 @@ static ZigType *ir_resolve_peer_types(IrAnalyze *ira, AstNode *source_node, ZigT
             continue;
         }
 
+        if (prev_type->id == ZigTypeIdOptional &&
+            types_match_const_cast_only(ira, cur_type, prev_type->data.maybe.child_type,
+                source_node, false).id == ConstCastResultIdOk)
+        {
+            prev_inst = cur_inst;
+            any_are_null = true;
+            continue;
+        }
+
+        if (cur_type->id == ZigTypeIdOptional &&
+            types_match_const_cast_only(ira, prev_type, cur_type->data.maybe.child_type,
+                source_node, false).id == ConstCastResultIdOk)
+        {
+            any_are_null = true;
+            continue;
+        }
+
         if (cur_type->id == ZigTypeIdUndefined) {
             continue;
         }
test/stage1/behavior/pointers.zig
@@ -130,3 +130,10 @@ test "initialize const optional C pointer to null" {
     expect(a == null);
     comptime expect(a == null);
 }
+
+test "compare equality of optional and non-optional pointer" {
+    const a = @intToPtr(*const usize, 0x123456789);
+    const b = @intToPtr(?*usize, 0x123456789);
+    expect(a == b);
+    expect(b == a);
+}