Commit 629aa10c56

Andrew Kelley <superjoe30@gmail.com>
2017-08-25 16:11:58
unreachable still codegens to unreachable in ReleaseFast test mode
closes #430
1 parent 5dddb45
Changed files (3)
src
std
special
compiler_rt
src/codegen.cpp
@@ -1879,7 +1879,7 @@ static LLVMValueRef ir_render_err_to_int(CodeGen *g, IrExecutable *executable, I
 static LLVMValueRef ir_render_unreachable(CodeGen *g, IrExecutable *executable,
         IrInstructionUnreachable *unreachable_instruction)
 {
-    if (ir_want_debug_safety(g, &unreachable_instruction->base) || g->is_test_build) {
+    if (ir_want_debug_safety(g, &unreachable_instruction->base)) {
         gen_debug_safety_crash(g, PanicMsgIdUnreachable);
     } else {
         LLVMBuildUnreachable(g->builder);
std/special/compiler_rt/index.zig
@@ -17,6 +17,7 @@ comptime {
 
 const builtin = @import("builtin");
 const is_test = builtin.is_test;
+const assert = @import("../../debug.zig").assert;
 
 const __udivmoddi4 = @import("udivmoddi4.zig").__udivmoddi4;
 
@@ -292,8 +293,3 @@ fn test_one_udivsi3(a: u32, b: u32, expected_q: u32) {
     const q: u32 = __udivsi3(a, b);
     assert(q == expected_q);
 }
-
-
-fn assert(ok: bool) {
-    if (!ok) unreachable;
-}
std/debug.zig
@@ -12,7 +12,15 @@ error InvalidDebugInfo;
 error UnsupportedDebugInfo;
 
 pub fn assert(ok: bool) {
-    if (!ok) unreachable // assertion failure
+    if (!ok) {
+        // In ReleaseFast test mode, we still want assert(false) to crash, so
+        // we insert an explicit call to @panic instead of unreachable.
+        if (builtin.is_test) {
+            @panic("assertion failure")
+        } else {
+            unreachable // assertion failure
+        }
+    }
 }
 
 var panicking = false;