Relation diagnostics

Updated Oct 17, 2026

The parser emits deterministic diagnostics for invalid relation forms:

Codes beginning with D-REL identify relation diagnostics.

Table 1. Relation diagnostics.

Code Cause Message
D-REL-001 Kind keyword before role keyword D-REL-001: relation role keyword (input/output) must precede the kind keyword
D-REL-002 More than one role keyword D-REL-002: at most one role keyword (input, output) is permitted
D-REL-003 More than one kind keyword D-REL-003: at most one kind keyword (relation, stream, multiset) is permitted
D-REL-004 Bracket body with a primary-key clause D-REL-004: bracket-form relations cannot declare a primary key clause
D-REL-005 Empty bracket body D-REL-005: bracket-form relations require a single element type between '[' and ']'
D-REL-006 Primary-key clause on a non-input relation D-REL-006: primary key clauses are only valid on input relations
D-REL-007 Stray or malformed primary key clause D-REL-007: unexpected or malformed primary key clause
D-REL-008 Bracket-wrapped primary-key clause D-REL-008: bracket-wrapped primary key clauses are not supported; remove the surrounding '['/']'

Build standard

Development builds (make test, make lint, make typecheck and the debug build) use the parallel rustc frontend (-Zthreads=8) and, on Linux, the mold linker. Install mold before building on Linux: the configuration names it, so a build without it fails at link time (on Debian or Ubuntu, sudo apt-get install mold). macOS keeps its platform linker, because mold ships for Linux only.

The flags live in .cargo/config.toml, but Cargo applies exactly one rustflags source and an assigned RUSTFLAGS replaces every configuration source. The Makefile therefore restates the flags in each recipe and keeps any RUSTFLAGS you set, appending the standard flags after yours. Two builds are held out on purpose: the coverage build assigns its own flags, because a measurement should not depend on the fast flags, and the release build. make release keeps your RUSTFLAGS and names neither fast flag, so a shipped artefact links with the platform linker. A bare cargo build --release is different: it takes the configuration's flags unless you assign RUSTFLAGS yourself, for example RUSTFLAGS="" cargo build --release.

Cranelift is not adopted; the developers' guide records the measurement and the reason. See ADR 003 for the reasoning.