✓
Passing Passing: the compiler rejects this program as expected.
Code
// WALL: discharging one obligation field and dropping the record must still be
// caught for the UN-discharged field. Pins that narrowing does not let you leak
// the remainder — dropping s while g is still owed is KORU030 on g.
~import std/io
const std = @import("std");
const Handle = struct { n: i32 };
~tor make2 { id: usize } -> { h: *Handle<owned!>, g: *Handle<owned!> }
~proc make2|zig {
const h = std.heap.page_allocator.create(Handle) catch unreachable;
const g = std.heap.page_allocator.create(Handle) catch unreachable;
h.* = .{ .n = 1 }; g.* = .{ .n = 2 };
return .{ .h = h, .g = g };
}
~tor dispose { x: *Handle<!owned> }
~proc dispose|zig { std.heap.page_allocator.destroy(x); }
~make2(id: 1): s |> dispose(x: s.h): _ |> std/io:print.ln("dropped g still owed")
Actual compiler output
error[KORU030]: Resource 'g' obligation <owned!> was not discharged. Call one of: dispose
--> tests/regression/300_ADVANCED_FEATURES/330_PHANTOM_TYPES/330_102_field_narrowing_drop_remainder/input.kz:18:0
❌ Compiler coordination error: Auto-discharge failed (multiple disposal options or no disposal event)
(set KORU_BACKEND_TRACE=1 for the backend return trace)Backend must reject with:
CONTAINS error[KORU030]
CONTAINS was not dischargedFlows
flow ~make2 click a branch to expand · @labels scroll to their anchor
make2 (id: 1)
Test Configuration
MUST_ERROR