✓
Passing This code compiles and runs correctly.
Code
// Test: Impure events require overrides
// MUST_FAIL: has impure events without overrides
//
// When a test calls an impure event (Zig proc without ~[pure]),
// the compiler should error and list ALL impure events at once.
//
// This is the "fix/recompile loop killer" - great UX!
~import "$std/testing"
// Impure event - Zig proc without ~[pure]
~event fetch_user { id: u32 }
| found { name: []const u8 }
| not_found {}
~proc fetch_user {
// This is impure - does I/O (simulated)
return .{ .found = .{ .name = "Alice" } };
}
// Another impure event
~event save_log { message: []const u8 }
| saved {}
~proc save_log {
// This is impure - writes to disk
return .{ .saved = .{} };
}
// Test: Should FAIL - calls impure events without overrides
~test(Impure events should error) {
~fetch_user(id: 1)
| found u |>
save_log(message: u.name)
| saved |> assert.ok()
}
pub fn main() void {}
Error Verification
Expected Error Pattern
MUST_FAILActual Compiler Output
[PHASE 2.4] Calling run_pass for transforms\n[TEST] Building mock lookup map
[TEST] Transformed program has 16 items:
[TEST] [0] flow
[TEST] invocation: fetch_user
[TEST] [1] other
[TEST] [2] other
[TEST] [3] other
[TEST] [4] other
[TEST] [5] other
[TEST] [6] other
[TEST] [7] other
[TEST] [8] other
[TEST] [9] event_decl
[TEST] [10] proc_decl
[TEST] [11] other
[TEST] [12] event_decl
[TEST] [13] proc_decl
[TEST] [14] other
[TEST] [15] other
[TEST] Found 1 transformed flows
[TEST] SKIPPING purity walk for debugging
[TEST] Purity walk complete, 0 impure events
[PHASE 2.5] Executing comptime_main() - running comptime flows
[PHASE 2.5] Comptime flows complete (31 items)
[PHASE 2.6] Rescanning transformed AST (31 items)
[PHASE 2.6] Rescan complete: 25 comptime events found
[0] std.compiler:requires
[1] std.compiler:flag.declare
[2] std.compiler:command.declare
[3] std.compiler:coordinate
[4] std.compiler:context_create
[5] std.testing:test
[6] std.testing:validate_mocks
[7] std.testing:test.with_harness
[8] std.testing:test.harness
[9] std.testing:assert
[10] std.testing:test.property.equivalent
[11] std.deps:deps
[12] std.deps:requires.system
[13] std.deps:requires.zig
[14] std.control:if
[15] std.control:for
[16] std.control:capture
[17] std.control:const
[18] std.build:requires
[19] std.build:variants
[20] std.build:config
[21] std.build:command.sh
[22] std.build:command.zig
[23] std.build:step
[24] std.template:define
[PHANTOM-KORU] Starting phantom check proc...
[DEAD-STRIP] Removing event_decl: std.compiler:coordinate
[DEAD-STRIP] Removing event_decl: std.compiler:ast_dump
[DEAD-STRIP] Removing proc_decl: std.compiler:ast_dump
[DEAD-STRIP] Removing event_decl: std.compiler:transform_taps
[DEAD-STRIP] Removing proc_decl: std.compiler:transform_taps
[DEAD-STRIP] Removing event_decl: std.compiler:parse
[DEAD-STRIP] Removing proc_decl: std.compiler:parse
[DEAD-STRIP] Removing event_decl: std.testing:test
[DEAD-STRIP] Removing proc_decl: std.testing:test
[DEAD-STRIP] Removing event_decl: std.testing:test.with_harness
[DEAD-STRIP] Removing event_decl: std.testing:test.harness
[DEAD-STRIP] Removing event_decl: std.testing:assert
[DEAD-STRIP] Removing proc_decl: std.testing:assert
[DEAD-STRIP] Removing event_decl: std.testing:assert.ok
[DEAD-STRIP] Removing proc_decl: std.testing:assert.ok
[DEAD-STRIP] Removing event_decl: std.testing:assert.fail
[DEAD-STRIP] Removing proc_decl: std.testing:assert.fail
[DEAD-STRIP] Removing event_decl: std.testing:assert.eq
[DEAD-STRIP] Removing event_decl: std.testing:assert.contains
[DEAD-STRIP] Removing event_decl: std.testing:test.property.equivalent
[DEAD-STRIP] Removing event_decl: std.deps:deps
[DEAD-STRIP] Removing proc_decl: std.deps:deps
[DEAD-STRIP] Removing event_decl: std.deps:requires.zig
[DEAD-STRIP] Removing proc_decl: std.deps:requires.zig
[DEAD-STRIP] Removing event_decl: std.control:if
[DEAD-STRIP] Removing proc_decl: std.control:if
[DEAD-STRIP] Removing event_decl: std.control:for
[DEAD-STRIP] Removing proc_decl: std.control:for
[DEAD-STRIP] Removing event_decl: std.control:capture
[DEAD-STRIP] Removing proc_decl: std.control:capture
[DEAD-STRIP] Removing event_decl: std.control:const
[DEAD-STRIP] Removing proc_decl: std.control:const
[DEAD-STRIP] Removing event_decl: std.build:requires
[DEAD-STRIP] Removing proc_decl: std.build:requires
[DEAD-STRIP] Removing event_decl: std.build:variants
[DEAD-STRIP] Removing proc_decl: std.build:variants
[DEAD-STRIP] Removing event_decl: std.build:config
[DEAD-STRIP] Removing proc_decl: std.build:config
[DEAD-STRIP] Removing event_decl: std.build:command.sh
[DEAD-STRIP] Removing event_decl: std.build:command.zig
[DEAD-STRIP] Removing event_decl: std.build:command
[DEAD-STRIP] Removing event_decl: std.build:collect
[DEAD-STRIP] Removing proc_decl: std.build:collect
[DEAD-STRIP] Removing event_decl: std.compiler_types:__compiler_types_marker
[DEAD-STRIP] Removing event_decl: input:fetch_user
[DEAD-STRIP] Removing proc_decl: input:fetch_user
[DEAD-STRIP] Removing event_decl: input:save_log
[DEAD-STRIP] Removing proc_decl: input:save_log
[DEAD-STRIP] Stripped 48 unreachable items
[BUFFER DEBUG] After CodeEmitter.init:
[BUFFER DEBUG] code_emitter.pos = 0
[BUFFER DEBUG] First 50 bytes: [170][170][170][170][170][170][170][170][170][170][170][170][170][170][170][170][170][170][170][170][170][170][170][170][170][170][170][170][170][170][170][170][170][170][170][170][170][170][170][170][170][170][170][170][170][170][170][170][170][170]
[BUFFER DEBUG] After visitor_emitter.emit:
[BUFFER DEBUG] code_emitter.pos = 3466
[BUFFER DEBUG] First 50 bytes of buffer: // Access compiler flags from backend.zig via root
[BUFFER DEBUG] final_code length = 3466
[BUFFER DEBUG] First 50 bytes of final_code: // Access compiler flags from backend.zig via root
[INTER] inter:start called with 6 contexts
[INTER] --inter flag not set, skipping
🎯 Compiler coordination: Passes: 13 (flow-based: frontend, analysis, emission)
[MAIN DEBUG] Before file write:
[MAIN DEBUG] generated_code.len = 3466
[MAIN DEBUG] generated_code.ptr = u8@107f4be40
[MAIN DEBUG] emitted_file = output_emitted.zig
[MAIN DEBUG] emitted_file.ptr = u8@1030b045e
[MAIN DEBUG] First 50 bytes: // Access compiler flags from backend.zig via rootTest Configuration
MUST_FAIL