zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

commit 1a0081b763d145de8a89ab94aca400daa5666dac (tree)
parent e0b635e825b72e1308dd0e2bbee578dafe62d9dc
Author: Andrew Kelley <superjoe30@gmail.com>
Date:   Sat, 22 Apr 2017 11:45:04 -0400

add peer type resolution for T and ?T

See #334

Diffstat:
Msrc/ir.cpp | 9+++++++++
Mtest/cases/cast.zig | 14++++++++++++--
2 files changed, 21 insertions(+), 2 deletions(-)

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