roc-lang / roc

A fast, friendly, functional language.
https://roc-lang.org
Universal Permissive License v1.0
3.86k stars 284 forks source link

Build crash: After type checking, lists and literals should never align in exhaustiveness checking #6827

Open JRI98 opened 1 week ago

JRI98 commented 1 week ago

The following program should not build. However, instead of displaying an error, the compiler crashes with error:

thread '<unnamed>' panicked at crates/compiler/exhaustive/src/lib.rs:480:51:
After type checking, lists and literals should never align in exhaustiveness checking
app [main] {
    pf: platform "https://github.com/roc-lang/basic-cli/releases/download/0.10.0/vNe6s9hWzoTZtFmNkvEICPErI9ptji_ySjicO6CkucY.tar.br",
}

main = crash ""

bug = \list ->
    when list is
        [] | [.., ..] -> list
        _ -> []

This other program has similar behavior, but the crash has a different origin:

thread '<unnamed>' panicked at crates/compiler/exhaustive/src/lib.rs:597:30:
After type checking, lists and literals should never align in exhaustiveness checking
app [main] {
    pf: platform "https://github.com/roc-lang/basic-cli/releases/download/0.10.0/vNe6s9hWzoTZtFmNkvEICPErI9ptji_ySjicO6CkucY.tar.br",
}

main = crash ""

bug = \list ->
    when list is
        [] | [.., ..] if Bool.true -> list
        _ -> []

After a bit of debugging, I came across this line https://github.com/roc-lang/roc/blob/6ab54c0/crates/compiler/can/src/exhaustive.rs#L446. If I change it from SP::Literal(Literal::Byte(1)) to SP::Anything, as it has been in the past, it stops crashing and instead displays an error. That said, I do not know the implications of this, so I leave it to @ayazhafiz who has made this specific change.