// Inferred-set widening rejection (ERR step E1.4b). When a named caller // (`-> !A`) `try`s a bare-`!` callee, the callee's WHOLE-PROGRAM-CONVERGED // inferred set must be a subset of A. Before the SCC pass this was a // false-negative (the bare-`!` placeholder was empty, so the check trivially // passed); now the converged tags are checked. `deep`'s converged set is // {Foo} (raised transitively through `via`), which is not in A = {Bar}. // The positive case lives in `examples/223-inferred-error-sets.sx`. #import "modules/std.sx"; A :: error { Bar } deep :: () -> ! { raise error.Foo; // deep's inferred set = {Foo} } via :: () -> ! { try deep(); // via absorbs {Foo} return; } caller :: () -> !A { try via(); // error: Foo (via's converged set) not in A return; } main :: () -> s32 { e := caller(); return 0; }