Skip to main content
v0.14.0

Language Spec Health

How well the Language Spec is currently backed: how many of its Formal Rules are tested by fixtures, which are exempt and why, and which gaps the language still has. Every figure on this page is computed from the spec chapters and the GAP-* records when the site is built; nothing here is written by hand, so it cannot drift from them.

Every limitation and gap, with its status, is listed on Limitations and Gaps.

Rules and evidence
382
formal rules
370
tested by fixtures
11
exempt
1
untested
21
known gaps
Needs attention
spec.expressions.record-rest-patterns.legality-1A record rest pattern's named fields must be entailed present, and its row facts must determine…no fixture and no exemptionrule ↗spec.functions.closures.dynamics-11When a closure value is dropped, its environment is dropped:blocked — metel-core#261rule ↗spec.ownership.drop-order.dynamics-1When a scope ends, its still-owned values are dropped in reverse declaration order.blocked — metel-core#261rule ↗spec.ownership.drop-order.dynamics-2Dropping a value with a Drop implementation invokes drop(self) before recursively dropping its…blocked — metel-core#261rule ↗spec.ownership.explicit-drop.legality-1After drop(x) consumes a non-Copy binding, that binding may not be used again.blocked — metel-core#261rule ↗spec.ownership.explicit-drop.dynamics-1drop(x) consumes x and invokes its destructor when its type implements Drop.blocked — metel-core#261rule ↗spec.ownership.drop-dispatch-against-a-narrowed-residual.legality-1A Drop impl's required field set is the residual row its drop method's receiver is declared wit…blocked — metel-core#949rule ↗spec.ownership.drop-dispatch-against-a-narrowed-residual.dynamics-1A Drop impl's destructor fires against any residual of the correct brand whose current row is a…blocked — metel-core#949rule ↗spec.ownership.drop-dispatch-against-a-narrowed-residual.legality-2Coercing a value of a Drop-implementing type to dyn Aspect is rejected when the value's current…blocked — metel-core#949rule ↗spec.ownership.drop-dispatch-against-a-narrowed-residual.legality-3A Drop impl's drop method may declare its &var self receiver as a residual type of Self — a fie…blocked — metel-core#949rule ↗spec.ownership.drop-dispatch-against-a-narrowed-residual.legality-4Within a Drop impl whose drop receiver is declared narrowed (legality-3), the destructor body m…blocked — metel-core#949rule ↗GAP-DECLARATIONS-003No `Ord` or `Hash` aspect exists, so no type has ordering or hashing implsknownrecord ↗GAP-EXPRESSIONS-001A record rest pattern cannot borrow the remainder through a referenceknownrecord ↗GAP-FUNCTIONS-001Free-function overloading is implemented but the Language Spec does not describe itknownrecord ↗GAP-MODULES-001Module graphs may not be cyclic, so modules cannot be mutually dependentknownrecord ↗GAP-MODULES-003Top-level `let` and `var` bindings cannot be exportedknownrecord ↗GAP-OWNERSHIP-001No borrow checking: reference exclusivity and duration are not enforcedknownrecord ↗GAP-TYPES-001No higher-rank polymorphismknownrecord ↗GAP-TYPES-002The storage model of `List<T>` and its boundary with `T[]` and `[T; N]` is not specifiedknownrecord ↗GAP-TYPES-005No spelling for an operator on a generic parameterknownrecord ↗GAP-TYPES-008A record literal accepts at most one row spreadknownrecord ↗GAP-TYPES-009Tuples have no rest pattern or spread over their numeric-label rowknownrecord ↗spec.declarations.aspects.static-dispatch-only.dynamics-1Aspect method calls through a generic type parameter or extends Aspect are resolved statically…untestablerule ↗GAP-DECLARATIONS-001Tuples cannot implement an aspectplannedrecord ↗GAP-DECLARATIONS-002Aspect implementations may not safely widen a method's generic constraintsplannedrecord ↗GAP-FUNCTIONS-002`Callable<A, B>` does not exist, so a function type cannot be bounded by an aspectplannedrecord ↗GAP-FUNCTIONS-003Written function types are move-only, with no `copy` qualifier or `Erased` state yetplannedrecord ↗GAP-MODULES-002A directory cannot be a module on its own: there is no `mod.mtl` equivalentacceptedrecord ↗GAP-OWNERSHIP-002A deeper move does not narrow the enclosing value's rowplannedrecord ↗GAP-OWNERSHIP-003A field cannot be moved out of a `Drop` type, even where its destructor would not need itplannedrecord ↗GAP-TYPES-010A function cannot return an open record while hiding its extra fieldsacceptedrecord ↗GAP-TYPES-011A written function type cannot say it accepts any record with at least these fieldsacceptedrecord ↗GAP-TYPES-012A record or struct field cannot have an open-record type with an anonymous tailacceptedrecord ↗