Every entry here is a decision, not an oversight: a boundary the compiler enforces loudly today, together with the spelling that works now and the release line on which the boundary moves. When a limitation is lifted, its entry leaves this page in the same release.
Language
A sum type’s fields hold plain values, strings and arrays of those
The field sets of a sum type hold plain values, strings and
dynamic arrays of those: numbers, booleans, enumerations, strings, fixed arrays
and records of those, other sum types over them, and array of any of these that
holds no array, pointer or sum type of its own. A pointer, an array of arrays, a
stringbuffer or a borrowed stringpart is refused with analyzer error 5560,
which also refuses a case that reaches its own sum type through array of or
pointer; a case that holds its own sum type directly is refused with error
5559, because a value would contain itself. Arrays of arrays and a sum type
reaching itself need a copy and a release that recurse, which is the next step on
the 7.x line and brings trees such as a JSON value. Until then, keep the inner
arrays in an array beside the value and store their indexes in the field set.
A sum type is neither generic nor exported
A case with a field set inside a generic type template is refused with analyzer
error 5561, and an exp mark on a sum type in a library with error 5580: a
library’s contract has no form for a sum type’s cases yet. Declare the sum type
over concrete field types, and keep it inside the library, exporting routines
over plain values. Both are on the 7.x line.
A case test binds only as the whole condition of an if
value is Case(binding) binds the case’s fields only when the test is the whole
condition of an if; anywhere else, in a while condition or under and, it is
refused with analyzer error 5574, because the binding has no arm to live in.
Test with the wildcard there, value is Case(*), and read the fields with a
case statement.
A sum value behind a pointer is matched through a variable
A case arm or an is test that binds cannot match a place reached through a
pointer, cell.form with cell : pointer Shape, because the protection that
keeps the matched value still inside the arm cannot follow a pointer; analyzer
error 5565 says so. Assign the value to a variable and match the variable.
A generic function does not admit a nested subprogram
A function or procedure declared inside a generic function is refused with analyzer error 5424. A specialization clones the generic’s body once per type argument, and a nested subprogram would demand a second specialization authored inside the first. Declare the helper beside the generic function and pass what it needs.
Sort is unstable
Sort is heapsort: equal elements do not keep their relative order. When a
report must group by one key and preserve an earlier order inside the group,
sort by a compound key instead. A stable variant is on the release-8 line.
Unicode case mapping is one-to-one
Upper and Lower map each code point to exactly one code point: ß stays
ß rather than becoming SS, and the Greek final sigma is not selected by
position. The one-to-many and positional rules are on the release-8 line.
Build and run
Debug builds walk s[i] loops quadratically under utf-8
Under the utf-8 encoding, a hand-written while loop that indexes s[i]
re-measures the string’s prefix on every access in a debug build — O(N²)
for the whole walk. The taught idiom is free of this on every tier:
for c in s doRelease builds optimize the indexed walk; the debug behaviour is the cost of keeping that tier’s code shaped exactly like the source.
A checked build’s memory grows with the run
The checked build keeps every cell a program releases, poisoned, so that a read through a pointer to it is recognized; blocks it can serve no further cell from are quarantined for the rest of the run. Its memory therefore grows with the work the program does, however carefully the program releases what it owns. A fixed-arena program sized with its release build exhausts that arena under a checked build, and the failure report says so in a closing note. Size a checked run for the whole run, or give it the hosted heap; the guarantee is not traded for a smaller budget. See what the checked tier costs in memory.
Tooling and platforms
macOS hosts compile but do not link
On Darwin/ARM64 the compiler cross-compiles both Linux targets, but linking is not available — the binutils integration is bound to Linux hosts. Linux containers on macOS build and run everything, and the container image is the supported macOS road today. macOS as a full host is the headline of release 8.
JSON has no library surface yet
JSON was a named non-goal of the 6.x line and is planned as a release-7
citizen with its own design pass. Starting programs has its surface: the
process unit’s Spawn, described in scripting.