Diagnostics: inline-record mutability coercion gives no reason, and `throw` in `finally` warns about unreachable code

Aperta
#9,185 0 commenti 0 reazioni 0 assegnatari Vedi su GitHub

I maintainer di solito rispondono entro 1 giorno

Nessuno ha ancora preso questa issue.

Valutazione

Difficoltà
4/5
Tempo stimato
3-5 giorni
Idoneità per principianti
38/100
Tipo di issue
Bug
Chiarezza
Abbastanza chiara
Stato di attività
Attiva
Stack tecnologico
ocaml

Direzione di ricerca

The throw-in-finally case points to compiler/ml/typecore.ml around lines 2920-2922, where the finally block is typed as a statement; check how warning 21 is raised for non-returning statements. The inline-record coercion error is reached through a subtype path the payload does not name, so locate it by searching for the existing plain-record mutability explanation and compare the two. Run the two snippets from the issue to confirm the wrong output, and count done as the mutable-field explanation appearing for inline records and warning 21 no longer firing for throw in finally.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Descrizione

Found by differential semantic drift analysis from b123b7c3 to c10223e8.

What is broken

  • Coercion into an inline record with a mutable field gives no reason (#9086). The coercion is now rejected, correctly:

    type v1 = A({x: float})
    type v2 = A({mutable x: float})
    let a: v1 = A({x: 0.})
    let b = (a :> v2)
    

    The error is only Type v1 is not a subtype of v2. For a field of a plain record type ({r: r1} into {r: r2}) the error explains: "The field x is mutable in record r2, but not in record r1. A coercion can't make a field writable."

  • throw in finally gives warning 21 (#8931):

    exception B
    let k = () => try { 1 } finally { throw(B) }
    

    Warning 21: "This statement does not continue execution; following code is unreachable." No code follows the throw; the generated JavaScript is correct. The finally block is typed as a statement (typecore.ml L2920-L2922), and a non-returning statement triggers this warning.

Possible cause (speculation only)

The inline-record path reports the subtype failure before reaching the field comparison that produces the explanation for plain records.

🤖 Generated with Claude Code

Lingua principale
OCaml
Stelle
7.5k
Fork
484
Merge medio
17h 2m
PR unite (30g)
249

Preparare l'ambiente

Apri in Codespaces

Avvia il container di sviluppo del progetto nel browser, con il tuo account GitHub.

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di rescript-lang/rescript

Tutte le issue di rescript-lang/rescript

Issue simili

Altre issue su Compilers

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.