summary_session-2026-09-30.md 1.8 KB

Session save — 2026-09-30: VAL conversions + long→int narrowing

Suite 148/148; self-hosting fixpoint OK (bootstrap/fixpoint.sh, image 2,320,770 bytes). master, tree clean except the user's uncommitted compiler/toto.mod.

A short session: the remaining numeric conversion gap.

Step, tag and commit

Step Tag Commit What
VAL conversions v3-val-conversions 1c774a7 INTEGER/LONGINT/REAL conversions + long→int narrowing

What

VAL previously accepted only same-class operands and emitted no conversion code. It now covers:

From → To Codegen
INTEGER → LONGINT extsw
LONGINT → INTEGER copy w (low 32 bits)
INTEGER → REAL swtof
LONGINT → REAL sltof
REAL → INTEGER / LONGINT dtosi (truncate toward zero)

Ordinal↔ordinal, pointer↔pointer and REAL↔REAL were already allowed. New QbeGen helpers: NarrowLong, ConvRI, ConvRL, ConvLR (alongside WidenLong/ConvIR).

Payoff

Conversions is simplified: StrToInt/StrToCard accumulate in a LONGINT and range-check, then narrow with VAL(INTEGER, v) / VAL(CARDINAL, v); the old "detect overflow before the 32-bit wrap" hand-guard is gone.

Tests (148)

New: t_valconv (15) — int→long→int round-trip, int→real, real→int truncation, long→real. ConvProg/ConvResultsProg still pass.

Docs: docs/summary_val-conversions.md.

Resume

cd .../m2compiler-V3
./bootstrap/fixpoint.sh                       # FIXPOINT OK
cd compiler && ./build.sh && ./run_tests.sh   # 148/148

Remaining polish

  • Multiple parents for CLASS (deliberate exclusion).
  • More stdlib: SysClock, richer Strings (Insert/Replace/ Capitalize), more Math.
  • Deeper variant-record / IOChan support.