roc-lang / roc

A fast, friendly, functional language.

Home Page:https://roc-lang.org

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

`Num.neg` not supported for `Dec`, or for any `Num` except I64/U64 when in repl

Lubsch opened this issue · comments

When trying to build the following test program:

app [main] {
    cli: platform "https://github.com/roc-lang/basic-cli/releases/download/0.12.0/Lb8EgiejTUzbggO2HVVuPJFkwvvsfW6LojkLR20kTVE.tar.br",
}
import cli.Stdout

a : Dec
a = 10

main =
    Num.neg a
    |> Num.toStr
    |> Stdout.line

I get the output:

thread 'main' panicked at crates/compiler/gen_llvm/src/llvm/lowlevel.rs:2230:13:
internal error: entered unreachable code: Unrecognized dec unary operation: NumNeg
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace

When investigating the source, it's clear that Num.neg is simply not implemented for Dec.
This isn't mentionend in the documentation or anywhere else I've looked.

Additionally, using Num.neg on any Num that's not I64 or U64 is not supported from the repl. For example:

» a : I32
… a = 10

10 : I32
» -a
thread 'main' panicked at crates/compiler/gen_dev/src/generic64/mod.rs:1794:18:
not yet implemented: NumNeg: layout, Builtin(Int(I32))
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace

You can of course work around this by subtracting from 0, but I think this should at least be documented.

Thanks for reporting this @Lubsch. I've created a PR with improved documentation. For anyone interested in implementing this, I suspect the claude 3.5 sonnet API can handle the implementation if you provide it with the rest of the file (crates/compiler/gen_dev/src/generic64/mod.rs), if you get something working, bhansconnect can review it for correctness.

See also #3513