zig

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

commit c75e58ffe6905c6a7d4e9f082726ea2cdcec514e (tree)
parent e0a422ae7e9716172ef316e88a1050f98fb7f1fa
Author: Andrew Kelley <superjoe30@gmail.com>
Date:   Sun, 29 Jan 2017 19:10:56 -0500

fix behavior for comptime and runtime basic block phi

Diffstat:
Msrc/ir.cpp | 1+
Mtest/cases/eval.zig | 28++++++++++++++++++++++++++++
2 files changed, 29 insertions(+), 0 deletions(-)

diff --git a/src/ir.cpp b/src/ir.cpp @@ -5935,6 +5935,7 @@ static TypeTableEntry *ir_inline_bb(IrAnalyze *ira, IrInstruction *source_instru return ir_unreach_error(ira); } + old_bb->other = ira->old_irb.current_basic_block->other; ir_start_bb(ira, old_bb, ira->old_irb.current_basic_block); return ira->codegen->builtin_types.entry_unreachable; } diff --git a/test/cases/eval.zig b/test/cases/eval.zig @@ -191,3 +191,31 @@ fn testTryToTrickEvalWithRuntimeIf(b: bool) -> usize { return i; } } + +fn max(comptime T: type, a: T, b: T) -> T { + if (T == bool) { + return a || b; + } else if (a > b) { + return a; + } else { + return b; + } +} +fn letsTryToCompareBools(a: bool, b: bool) -> bool { + max(bool, a, b) +} +fn inlinedBlockAndRuntimeBlockPhi() { + @setFnTest(this); + + assert(letsTryToCompareBools(true, true)); + assert(letsTryToCompareBools(true, false)); + assert(letsTryToCompareBools(false, true)); + assert(!letsTryToCompareBools(false, false)); + + comptime { + assert(letsTryToCompareBools(true, true)); + assert(letsTryToCompareBools(true, false)); + assert(letsTryToCompareBools(false, true)); + assert(!letsTryToCompareBools(false, false)); + } +}