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:
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));
+ }
+}