You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Restore changed catalog rows to their master table positions
The 9 re-audited variants (Type_clash, Parameters_differ, Null_arity_external,
Bad_fixed_type, Varying_anonymous, Invalid_interval, Incoherent_label_order,
Illegal_value_name, Unbound_type_constructor_2) had their per-module table
rows deleted and the info relocated to the prose list, causing line drift.
Each row is now back in its master position with an in-place status update
(⚠ -> ✓ + fixture; Type_clash stays ⚠ "appears dead, retained"), so the diff
reads as a row-level edit instead of a move. Verified all four module tables
(typecore/typedecl/env/typetexp) now match master row order; remaining gaps
are only the genuinely-removed variants.
Signed-Off-By: Jono Prest <jono@envio.dev>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|`Polymorphic_label`| ✓ |`polymorphic_label.res`| Pattern that instantiates a polymorphic record field: `({f: (f: int => int)}: t) =>` constrains the universal `'a` of `f: 'a. 'a => 'a` to `int => int`. |
199
199
|`Constructor_arity_mismatch`| ✓ |`constructor_arity_mismatch.res`, `constructor_arity_mismatch_pattern.res`, `arity_mismatch*.res`| Triggers in both expression (4028) and pattern (1426) paths. |
200
+
|`Label_mismatch`| ✓ |`label_mismatch_record_literal.res`| Record literal without expected type mixing fields from two different record types — disambiguation picks one type per label, and the cross-type unify fails inside `type_label_exp`. |
200
201
|`Pattern_type_clash`| ✓ | many `*_pattern_type_clash.res` etc. | Most-fired pattern error. Sub-case fixtures: `pattern_matching_on_option_but_value_not_option.res` and `pattern_matching_on_value_but_is_option.res` (option-vs-non-option trace), `pattern_type_clash_polyvariant.res` (polyvariant tag against concrete type), `pattern_type_clash_tuple_arity.res` (tuple arity mismatch). |
|`Abstract_wrong_label`| ✓ |`abstract_wrong_label.res`| Multi-arg function literal where an inner argument label doesn't match the expected arrow's label (e.g. `let f: (~a, ~b) => int = (~a, ~c) => …`). |
208
-
|`Label_mismatch`| ✓ |`label_mismatch_record_literal.res`| Record literal without expected type mixing fields from two different record types — disambiguation picks one type per label, and the cross-type unify fails inside `type_label_exp`. |
|`Abstract_wrong_label`| ✓ |`abstract_wrong_label.res`| Multi-arg function literal where an inner argument label doesn't match the expected arrow's label (e.g. `let f: (~a, ~b) => int = (~a, ~c) => …`). |
|`Not_a_variant_type`| ✓ |`variant_spread_pattern_not_a_variant.res`| Pattern-level variant spread of a non-variant type. |
221
+
|`Incoherent_label_order`| ✓ |`labeled_args_incoherent_order.res`| A not-yet-generalized function value applied more than once with labelled args in conflicting orders (`g => (g(~a, ~b), g(~b, ~a))`); the reordered second call hits the leftover/tvar path in `type_unknown_args`. |
|`Unexpected_existential`| ✓ |`super_errors_multi/Unexpected_existential_in_let`| Destructuring GADT constructor with existential in toplevel `let`. |
226
227
|`Unqualified_gadt_pattern`| ✓ |`super_errors_multi/Cross_gadt_pattern`| Only reachable via cross-module GADT disambiguation; in single-file matching the constructor would resolve before this check. |
228
+
|`Invalid_interval`| ✓ |`pattern_interval_non_char.res`| Non-char constant interval pattern (e.g. `1 .. 5`); the parser builds `Ppat_interval` and only the `Pconst_char` interval is rewritten. |
|`Type_clash`| ⚠ | — | Appears dead; retained pending proof. `update_type` unifies `t<fresh>` against `t`'s own manifest (an alpha-renamed copy of itself), which can't head-clash; real inconsistencies hit `Cycle_in_def`/`Recursive_abbrev`/`Parameters_differ` first. ~37 shapes tried without reaching it. |
266
+
|`Parameters_differ`| ✓ |`recursive_type_parameters_differ.res`| Non-uniform recursion through an object/record manifest (`type rec t<'a> = {"f": t<int>}`), caught by `check_regular` rather than `Cycle_in_def`. |
267
+
|`Null_arity_external`| ✓ |`external_null_arity.res`| External whose name starts with `?` (e.g. `external x: int = "?nodeFs"`) skips the magic `prim_native_name` encoding and reaches the typer with arity 0. |
|`Unavailable_type_constructor`| ☐ (needs build harness) | — | typedecl.ml:778. Requires a type path findable at parse time but missing during constraint enforcement; only cross-unit scenarios where a `.cmi` was found but later removed. |
277
+
|`Bad_fixed_type`| ✓ |`fixed_type_no_row_variable.res`| Fully-bounded closed private polymorphic variant (`type t = private [< #A | #B > #A #B]`) satisfies `is_fixed_type` but has a static (non-`Tvar`) row. |
|`Unbound_type_constructor_2`| ✓ |`incomplete_type_constructor_polyvariant.res`, `incomplete_type_constructor_object.res`| Identity alias `type t<'a> = 'a` used in an inherit position with a type-variable arg; `expand_head` collapses `t<'b>` to a bare `Tvar` while the repr stays `Tconstr`. Reachable from poly-variant inherit and object spread. |
|`Illegal_renaming`| ☐ (needs build harness) | — | Triggered when a `.cmi` filename and the module name inside it disagree. Reachable via `rescript.json` setups that rename the produced artefact, but not from a single-process `bsc` invocation that always writes `Module.cmi` to match the source. |
477
485
|`Inconsistent_import`| ☐ (needs build harness) | — | Triggered when two `.cmi` files transitively imported by the same unit declare different CRCs for the same type. Needs an artificially-mutated build state across multiple compile invocations. |
478
486
|`Missing_module`| ☐ (needs build harness) | — |`.cmi` referenced but absent from `-I` paths at compile time. The `super_errors_multi` runner pre-compiles every fixture file via `-bs-read-cmi`, so it never reaches this code path. |
487
+
|`Illegal_value_name`| ✓ |`illegal_value_name.res`| Escaped identifier reaching `check_value_name` during definition (`let \"->" = 1`); the parser does not reject `\"->"`. |
0 commit comments