Files
AILang/docs
Brummel 9c4d195806 plan: 0064 iter 3 — let-alias borrow propagation (class 2) (#57)
Third iteration of spec 0064. Closes false-positive class 2: Term::Let
walks its value in Position::Consume, so (let a t (match a …)) over a
borrow-mode t consumes t at the binding -> false consume-while-borrowed.

Fix: Checker gains a scoped aliases: HashMap<String,String>. A (let a t
body) whose value is a bare Var resolving to a tracked binder records
a -> root(t) for the body scope and skips the consume walk. A new
resolve_alias helper maps a name to its root, PREFERRING a real binder
at each chain step -- so an inner binder named `a` (nested let, pattern
binder, lam param) automatically shadows the alias with NO change to
with_binder/walk_arm/Lam (the shadowing is handled centrally in the
resolver, not at three scattered introduction sites). Every
binder-state lookup keyed by name resolves through the map first:
use_var, the App borrow bump + decrement, callee_arg_modes, and the
reuse-as source.

Design calls (orchestrator):
- Alias REDIRECT, not state clone (spec scope decision 3): consuming
  the alias marks the single root consumed, so a real double-consume
  through an alias is still caught -- a clone would miss it (unsound).
  Pinned by the let_alias_of_owned_double_consume_still_errors unit
  test.
- resolve_alias prefers binders -> shadowing needs no edits to the
  three binder-introduction sites (simpler, lower-risk than clearing
  aliases at each).
- reuse-as source (linearity.rs:663) is the 4th binder-state-reading
  site; the spec's Fix 3 named three illustratively. Resolving there
  too avoids a spurious reuse-as-source-not-bare-var on an aliased Var.
  Faithful completion of Fix 3, documented as such.

Three tasks, RED-first: Task 1 adds examples/c2_let_alias.ail to the
harden list (RED: consume-while-borrowed on count's t); Task 2 is the
alias mechanism (GREEN) + the soundness unit test; Task 3 closes the
design/contracts/0008-memory-model.md:340 let-alias carve-out (was
"has not shipped yet") and extends the Ratified-by trailer to name
linearity.rs. Diagnostic-only; no schema/type change. plan-recon mapped
current post-iter-2 line numbers; parse gate fired on the inlined
fixture (RED confirmed).

Class 4 (partition_eithers rewrite) remains for the final iteration.

refs #57
2026-06-01 18:07:29 +02:00
..