Hacktoberfest 2026 : les issues que les mainteneurs ont marquées pour octobre, ouvertes et accessibles aux débutants. Parcourir les issues Hacktoberfest

Compiler crash (matching.ml assertion) on dict and optional-field record patterns mixing a value and `?None` on one key

Fermée
#8,810 0 commentaires 0 réactions 0 personnes assignées Voir sur GitHub

Les mainteneurs répondent en général sous 1 jour

Une pull request liée a déjà été fusionnée.

  • #8842 par @cknitt — fusionnée

Évaluation

Difficulté
4/5
Temps estimé
3-5 jours
Accessibilité débutants
35/100
Type d'issue
Bug
Clarté
Clairement spécifiée
Activité
À l'abandon
Stack technique
javascript, ocaml
Domaine
compilers

Piste de recherche

Start with compiler/ml/matching.ml at get_args_constr around line 1236, then read compiler/ml/dict_pattern.ml around lines 73–102 to understand how dict keys become optional record labels. Reproduce the crash with the supplied dict and optional record pattern examples, and inspect the existing compiler tests for matching. Done means both examples compile without an assertion failure; pull request #8842 is already open.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Description

Found by adversarial experiments on semantic analysts.

What is broken

This match makes bsc crash:

let f = (d: dict<int>) =>
  switch d {
  | dict{"x": 1} => 0
  | dict{"y": 2} => 0
  | dict{"x": ?None} => 1
  | _ => 2
  }
$ bsc -nopervasives C1.res
Fatal error: exception File "compiler/ml/matching.ml", line 1236, characters 9-15: Assertion failed

Expected: it compiles. The compiler at ece8b148 produces:

function f(d) {
  if (d.x !== 1 && d.y !== 2) {
    if (d.x !== undefined) { return 2; } else { return 1; }
  } else { return 0; }
}

The assertion is in get_args_constr: https://github.com/rescript-lang/rescript/blob/8d51b9ce7/compiler/ml/matching.ml#L1233-L1236

The same crash happens with a record type that has optional fields, both at master and at ece8b148:

type r = {x?: int, y?: int}
let f = (d: r) =>
  switch d {
  | {x: 1} => 0
  | {y: 2} => 0
  | {x: ?None} => 1   // `?Some(3)` crashes too
  | _ => 2
  }

Any two of the three cases compile. The crash needs a value pattern and an optional pattern (?None or ?Some(_)) on the same key, with a case on another key between them.

Introduced

The record crash is older. Dict patterns reach it since #8751 (e6c46f23b), which lowers every key of a match to one optional record label: https://github.com/rescript-lang/rescript/blob/8d51b9ce7/compiler/ml/dict_pattern.ml#L73-L102

Impact

The compiler crashes, with no source location, on an ordinary dict pattern match that compiled before #8751.

Langage dominant
ReScript
Étoiles
7.5k
Forks
483
Merge moyen
1 j 1 h
PR mergées (30 j)
120

Préparer son environnement

Ouvrir dans Codespaces

Lance le conteneur de développement du projet dans votre navigateur, avec votre propre compte GitHub.

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Autres issues de rescript-lang/rescript

Toutes les issues de rescript-lang/rescript

Issues similaires

Plus d'issues Compilers

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.