elm / compiler

Compiler for Elm, a functional language for reliable webapps.
https://elm-lang.org/
BSD 3-Clause "New" or "Revised" License
7.48k stars 658 forks source link

in a lambda, wrong `let` types can cause "thread blocked indefinitely" #2295

Open lue-bird opened 1 year ago

lue-bird commented 1 year ago

Quick Summary: In a lambda, annotating the argument with the wrong type argument causes an error:

thread blocked indefinitely in an MVar operation

SSCCE

test : a -> a
test =
    \a ->
        let
            b : b
            b =
                a
        in
        b

elm throws

You ran into a compiler bug. Here are some details for the developers:

    b [rank = 2]

Please create an <http://sscce.org/> and then report it
at <https://github.com/elm/compiler/issues>

CallStack (from HasCallStack):
  error, called at compiler/src/Type/Solve.hs:206:15 in main:Type.Solve

-- ERROR -----------------------------------------------------------------------

I ran into something that bypassed the normal error reporting process! I
extracted whatever information I could from the internal error:

>   thread blocked indefinitely in an MVar operation

if the argument a is part of the declaration top

test : a -> a
test a = ...

the correct error is thrown

This a value is a:

a

But the type annotation on b says it should be:

b

The result type can be chosen arbitrarily, for example () or Int. If the result type is set to b a correct error is thrown

The body is an anonymous function of type:

b -> b

But the type annotation on test says it should be:

a -> b
github-actions[bot] commented 1 year ago

Thanks for reporting this! To set expectations:

Finally, please be patient with the core team. They are trying their best with limited resources.