roc icon indicating copy to clipboard operation
roc copied to clipboard

Panic with nested linked list

Open sebfisch opened this issue 4 years ago • 1 comments

Replacing examples/hello-world/Hello.roc with the following program

app "hello-world"
    packages { base: "platform" }
    imports []
    provides [ main ] to base

LinkedList elem : [Empty, Prepend (LinkedList elem) elem]

prepend : LinkedList elem, elem -> LinkedList elem
prepend = Prepend

single : elem -> LinkedList elem
single = \elem -> prepend Empty elem

main =
    nested = single (single 42)
    "Hello, World!\n"

and then running it results in the following panic:

thread 'main' panicked at 'internal error: entered unreachable code: symbol/layout `#UserApp.0` ProcLayout { arguments: [Union(NullableUnwrapped { nullable_id: false, other_fields: [RecursivePointer, Builtin(Int(I64))] }), Builtin(Int(I64))], result: Union(NullableUnwrapped { nullable_id: false, other_fields: [RecursivePointer, Builtin(Int(I64))] }) } combo must be in DeclarationToIndex', compiler/mono/src/borrow.rs:227:9

The program works fine when using only one call to single, when inlining the definitions of single or prepend, or when defining prepend as follows:

prepend : LinkedList elem, elem -> LinkedList elem
prepend = \elems, elem -> Prepend elems elem

sebfisch avatar Dec 15 '21 08:12 sebfisch

This no longer panics, but yields an incorrect error message

module []

LinkedList elem : [Empty, Prepend (LinkedList elem) elem]

prepend : LinkedList elem, elem -> LinkedList elem
prepend = Prepend

single : elem -> LinkedList elem
single = \elem -> prepend Empty elem

main =
    nested = single (single 42)
    "Hello, World!\n"
── TYPE MISMATCH in Module.roc ─────────────────────────────────────────────────

This 2nd argument to prepend has an unexpected type:

9│  single = \elem -> prepend Empty elem
                                    ^^^^

This elem value is a:

    elem

But prepend needs its 2nd argument to be:

    elem

────────────────────────────────────────────────────────────────────────────────

1 error and 2 warnings found in 79 ms

As above, adding an explicit parameter to the definition of prepend fixes the issue.

isaacvando avatar Dec 08 '24 02:12 isaacvando