roc
roc copied to clipboard
Panic with nested linked list
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
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.