← board

Synthetic all-features stress test (cross-target conformance)

Outcome

Acceptance met and far exceeded. test_conformance_1 (classes/virtual/variant/ float, x86-64) + cross-portable test_conformance_2 and a large family of cross tests (many_params, shortcircuit, ptr_arith, case_range, global_init, typed_const, const_alias, multidim/multidim3d, named_array, record_2darray, param_2darray, dyn_comma, set_subrange, float_const) are wired into make test and the three cross suites, byte-identical and FPC-matching. The harness drove a long string of fixes/features over this cycle (class ctor managed-string, short-circuit and/or, aarch64 >8 params, paren-deref, case ranges, global/typed/float/string constants, dynamic-array aliases, 1-D..N-D fixed arrays across var/named/field/param, set-of-subrange crash, and — fixed indirectly — the nested-index load-width landmine). Closing as done; further language-surface work continues under its own tickets.

Goal

Self-hosting is an excellent cross-target stress test, but a deliberately incomplete one: the compiler is written in a restricted subset and omits whole language areas on purpose (objects/classes, interfaces, variants in some forms, operator overloading edges, sets, nested closures, generics, etc.). So the self-host exercises only the IR-primitive combinations the compiler itself uses. Bugs in primitives that the compiler never combines (but user programs will) stay invisible until a user hits them on a given target.

Build one synthetic program — not a real app, just a dense conformance harness — that combines every supported language feature in mixed, adversarial ways, and produces deterministic output. Run it on every target and diff against the x86-64 oracle (same pattern as the existing test_cross_* suite). It fills the gap between the narrow per-primitive test_cross_* cases and the (subset- only) self-host.

Why

Every cross-target wall this cycle was a per-backend primitive gap exposed by a combination (e.g. Int64 by-ref param next to a managed string on ARM32; dyn-array-of-record fill for array of const on AArch64). The frontend/IR is shared and transparent; IR→machine is four independent translators. A combinatorial harness surfaces those gaps without needing each one to happen to appear in compiler.pas.

Scope / coverage checklist (combine, don't isolate)

Acceptance

Notes

Log