// Program-wide closure-shape union — widening REJECTION (ERR E5.1 sub-feature 2).
// Two closure literals of shape `Closure(i32)->(i32,!)` raise `Negative` /
// `Other`; the shared inferred-`!` node for that shape is { Negative, Other }.
// A caller that `try`s a slot of this shape but declares only `!Small` (which
// omits both tags) is rejected — the union is checked against the caller's set
// even though the call goes through a slot with no static function name.

#import "modules/std.sx";

Small :: error { Unrelated }

reject :: (h: Closure(i32) -> (i32, !), x: i32) -> (i32, !Small) {
    return try h(x);   // Negative, Other ∉ Small → two diagnostics
}

main :: () -> i32 {
    gpa := GPA.init();
    push Context.{ allocator = xx gpa } {
        handlers : List(Closure(i32) -> (i32, !)) = .{};
        handlers.append(closure((x: i32) -> (i32, !) { if x < 0 { raise error.Negative; } return x; }));
        handlers.append(closure((x: i32) -> (i32, !) { if x == 0 { raise error.Other; } return x; }));
        print("r={}\n", reject(handlers.items[0], 5) catch (e) 0);
    }
    return 0;
}
