✓
Passing This code compiles and runs correctly.
Code
// TEST: Pass a Connection where Transaction is expected (reverse direction)
//
// commit() expects: *Transaction<!active>
// We're passing: *Connection<active!>
//
// Both have [active] state, but base types differ!
~import app/db
// BUG: the `| ok c |> app/db:commit(tx: c)` handler below passes c
// (*Connection) to commit() which expects *Transaction.
~app/db:connect(host: "localhost")
| ok c |> app/db:commit(tx: c)
| err _ |> _
Flows
flow ~connect click a branch to expand · @labels scroll to their anchor
connect (host: "localhost")
Imported Files
// Database module with Connection and Transaction as IDENTICAL struct layout
// Both have phantom states with the SAME NAME
// The ONLY difference is the semantic TYPE NAME
const std = @import("std");
// BOTH are structurally identical - just an i32 handle!
const Connection = struct { handle: i32 };
const Transaction = struct { handle: i32 }; // Same layout as Connection!
// connect: produces *Connection<active!>
~pub event connect { host: []const u8 }
| ok *Connection<active!>
| err []const u8
~proc connect|zig {
const c = std.heap.page_allocator.create(Connection) catch unreachable;
c.* = Connection{ .handle = 42 };
return .{ .ok = c };
}
// begin: consumes *Connection<!active>, produces *Transaction<active!>
// NOTE: Transaction also has <active!> - same state name as Connection!
~pub event begin { conn: *Connection<!active> }
| ok *Transaction<active!>
| err []const u8
~proc begin|zig {
const tx = std.heap.page_allocator.create(Transaction) catch unreachable;
tx.* = Transaction{ .handle = conn.handle };
std.heap.page_allocator.destroy(conn);
return .{ .ok = tx };
}
// close: consumes *Connection<!active>
// This should ONLY accept Connection, NOT Transaction!
~pub event close { conn: *Connection<!active> }
~proc close|zig {
std.debug.print("Connection closed (handle={})\n", .{conn.handle});
std.heap.page_allocator.destroy(conn);
}
// commit: consumes *Transaction<!active>
// This should ONLY accept Transaction, NOT Connection!
~[!]pub event commit { tx: *Transaction<!active> }
~proc commit|zig {
std.debug.print("COMMIT (handle={})\n", .{tx.handle});
std.heap.page_allocator.destroy(tx);
}
Test Configuration
Compiler Flags:
--strict-base-typesExpected Error:
error[KORU030]: Type mismatch: expected 'app.db:*Transaction<!active>' but got 'app.db:*Connection<app.db:active!>' for argument 'tx'