add peer type resolution for *const T and ?*T

closes #1298
This commit is contained in:
Andrew Kelley 2019-03-23 18:46:20 -04:00
parent 89953ec83d
commit 4d50bc3f8d
No known key found for this signature in database
GPG Key ID: 7C5F548F728501A9
3 changed files with 31 additions and 0 deletions

View File

@ -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#}

View File

@ -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;
}

View File

@ -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);
}