ERR/E5.1: program-wide inferred-! union per closure/fn shape

All occurrences of Closure(<sig>) -> (T, !) with a structurally identical
value-signature now share one inferred error-set node; every bare-!
closure literal of that shape unions its escape tags in, and a
`try slot(x)` against any matching-shape slot widens the caller's named
set against that union. This closes the gap where a slot call (no static
function name) skipped the widening check entirely.

- shape_inferred_sets keyed by closureShapeKey (params + value-return via
  mangleTypeName, error slot excluded) so bare-!, non-failable, .function
  and .closure of one value-sig collapse to a single key.
- convergeClosureShapeSets pre-pass (lowerRoot Pass 1d', after the
  name-keyed convergeInferredErrorSets): collectClosureShapes walks fn
  bodies through lambda boundaries; recordClosureShape resolves each
  concrete bare-! literal's shape and unions its raises (+ try named_fn()
  edges via calleeEscapeTags) into the shape node.
- checkEscapeWidening falls back to shapeKeyOfCallee for bare-! slot calls
  (computed from the callee expr's .function/.closure type). Empty union
  is silently allowed (sub-feature 6).

Scope: concrete shapes only (generic lambdas skipped); closure-to-closure
try edges are not fix-pointed (under-approximation = a missed diagnostic,
never a miscompile).

Tests: 1041 (positive — union composes, runs), 1042 (reject — two
widening diagnostics, exit 1).
This commit is contained in:
agra
2026-06-01 22:01:38 +03:00
parent 0e1afa3eba
commit 39c21468ee
9 changed files with 299 additions and 7 deletions

View File

@@ -0,0 +1 @@
0

View File

@@ -0,0 +1,4 @@
ok0=10
ok1=107
err0=-1
err1=-2

View File

@@ -0,0 +1,11 @@
error: error tag 'error.Negative' is not in caller's error set 'Small'
--> /Users/agra/projects/sx/examples/1042-errors-failable-closure-shape-union-reject.sx:13:12
|
13 | return try h(x); // Negative, Other ∉ Small → two diagnostics
| ^^^^^^^^
error: error tag 'error.Other' is not in caller's error set 'Small'
--> /Users/agra/projects/sx/examples/1042-errors-failable-closure-shape-union-reject.sx:13:12
|
13 | return try h(x); // Negative, Other ∉ Small → two diagnostics
| ^^^^^^^^