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

Aberta
#9,185 0 comentários 0 reações 0 responsáveis Ver no GitHub

Mantenedores costumam responder em até 1 dia

Ninguém assumiu esta issue ainda.

Avaliação

Dificuldade
4/5
Tempo estimado
3-5 dias
Facilidade para iniciantes
38/100
Tipo de issue
Bug
Clareza
Razoavelmente clara
Status de atividade
Ativa
Stack de tecnologia
ocaml

Direção de pesquisa

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.

Escrita pelo modelo de indexação a partir do texto da issue.

Descrição

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

Linguagem predominante
OCaml
Estrelas
7.5k
Forks
484
Merge médio
17h 2min
PRs com merge (30d)
249

Preparar o ambiente

Abrir no Codespaces

Inicia o contêiner de desenvolvimento do projeto no navegador, com a sua própria conta do GitHub.

Primeiros passos

  1. Leia a issue inteira e depois o guia de contribuição do projeto.
  2. Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
  3. Faça um fork do repositório e trabalhe em uma branch.
  4. Abra um pull request que referencie o número da issue.

Mais de rescript-lang/rescript

Todas as issues de rescript-lang/rescript

Issues semelhantes

Mais issues de Compilers

Receba novas issues na sua caixa de entrada

Um resumo curto de issues do GitHub para quem está começando.