Commit graph

75 commits

Author SHA1 Message Date
ayazhafiz
0eede1cd86 Generate unique symbols for shadowing identifiers
This code has a shadowing error:

```
b = False
f = \b -> b
f b
```

but prior to this commit, the compiler would hit an internal error
during monomorphization and not even get to report the error. The reason
was that when we entered the closure `\b -> b`, we would try to
introduce the identifier `b` to the scope, see that it shadows an
existing identifier, and not insert the identifier. But this meant that
when checking the body of `\b -> b`, we would think that we captured the
value `b` in the outer scope, but that's incorrect!

The present patch fixes the issue by generating new symbols for
shadowing identifiers, so deeper scopes pick up the correct reference.
This also means in the future we may be able to compile and execute code
with shadows, even though it will still be an error.

Closes #2343
2022-01-23 12:35:31 -05:00
Richard Feldman
6d8277ad8d
Merge pull request #2367 from rtfeldman/remove_Num.minmaxInt
Remove `Num.(min/max)Int`
2022-01-20 00:19:44 -05:00
Jan Van Bruggen
8e4b6f0cab Remove Num.(min/max)Int
Replace all uses with `Num.(min/max)I64`,
since all uses expect an `I64`.
2022-01-19 09:55:06 -07:00
Jan Van Bruggen
1e9d2d1239 Remove accidental trailing spaces 2022-01-18 22:25:46 -07:00
ayazhafiz
880bae55b0 Print u8-sized integers in repl properly
Closes #2335
2022-01-10 19:41:07 -05:00
ayazhafiz
605cad1114 Reify commented-out tests 2022-01-08 15:24:17 -05:00
ayazhafiz
fd474528eb Unroll newtypes that are records 2022-01-08 15:11:27 -05:00
ayazhafiz
85efcbccdd Support functions in structures
Closes #2313
2022-01-06 23:09:47 -06:00
Joshua Warner
5f7bec3ee8 Use assert_multiline_str_eq in repl_eval tests 2022-01-01 18:20:05 -08:00
ayazhafiz
983a9f7e17 Position correct basic block before calling error catcher
While building the main function for tests, we may need to generate
additional blocks while marshalling arugments to the error catcher into
the expected calling convention. This pushes the last block in the main
function down, so that the "entry" block may not be last BB in the
function. Instead, look up the last insertion block before generating
the catcher, and then add a call to the catcher at the end of this last
block.

Closes #2300
2021-12-30 20:55:43 -06:00
ayazhafiz
d966d8921f Support nullable wrapped tag union layouts in REPL 2021-12-29 17:55:21 -06:00
ayazhafiz
cdcc31f199 Support nullable unwrapped tag layouts in REPL 2021-12-29 17:55:21 -06:00
ayazhafiz
9c147c8b70 Support non-nullable unwrapped unions in repl 2021-12-29 17:55:21 -06:00
ayazhafiz
b7c9713232 Support nested non-recursive unions in REPL eval 2021-12-29 17:55:21 -06:00
ayazhafiz
2c25bac695 Support rendering general "regular" recursive tag unions in REPL 2021-12-29 17:55:21 -06:00
ayazhafiz
a9ae8aea22 Retrieve recursive tag union IDs when tag is stored next to data 2021-12-29 17:55:21 -06:00
ayazhafiz
71bd77e3b2 Handle flat variants of recursive tag unions in repl 2021-12-29 17:55:21 -06:00
ayazhafiz
3fcc59fb8e Improve repl output of nested newtypes 2021-12-29 17:55:21 -06:00
ayazhafiz
9938f7c832 Support multiline inputs from non-tty stdins 2021-12-29 17:55:19 -06:00
ayazhafiz
5e5eb6dca8 (llvm) Generate code for tag unions less than 64 bits in size correctly
Previously, we assumed that a union layout always lived on >= 1 64-bit
boundary when generating an LLVM type for it. For small tags unions,
like `[ Ok i8, Err ]` this need not be the case; indeed, a tag union
like that is actually only 2 bits - 1 bit for the "i8" data, and one bit
of the tag kind.

This led to a discrepancy between what the layout IR and generated LLVM
code would assume about the size of tag unions. In the case above, the
layout IR would assume the tag data is 2 bits wide, and the tag id is 1
bit into the data. But the LLVM code would generate a type that was 65
bits wide, the first 64 bits being for the "i8" data and the last 1 bit
being for the tag kind.

Usually, just running the LLVM-emitted code would not present a problem.
But it does present a problem when we use the layout IR to inspect the
result of LLVM-run code, in particular when we try to look up the tag
ID, as the repl does. This patch fixes that issue.

Note that this bug did not present itself in `test_gen` previously
because the data that most tests check against is stored in the front of
the representation.

Closes #2149
2021-12-26 11:45:02 -06:00
Folkert
acb26002c8 fix repl 2021-11-10 23:36:16 +01:00
Folkert
4152519bfb formatting & catch zig overflow error 2021-10-17 18:03:40 +02:00
Chelsea Troy
03295d4369 So far, add type for divCeil to the language 2021-10-17 09:29:11 -05:00
Folkert
ed52615d4c fix Foo Bar 2021-10-13 14:34:59 +02:00
Chelsea Troy
475326c005 cargo fmt 2021-10-11 20:48:19 -05:00
Chelsea Troy
051b511d87 Remove parentheses from unapplied tags 2021-10-11 20:42:07 -05:00
Folkert
34a25408c3 fix issue 2021-09-24 14:27:38 +02:00
Richard Feldman
57676057fa Rename gen to gen_llvm
This way, we have gen_dev and gen_llvm representing the two
different compiler backends.
2021-06-06 07:56:47 -04:00
Anton-4
d1948d99d0 Merge branch 'trunk' of github.com:rtfeldman/roc into benchmarks 2021-06-02 10:56:30 +02:00
Folkert
08a3b43649 remove inaccurate comments 2021-05-31 23:18:39 +02:00
Anton-4
8d0d1a0758 put cli helpers in cli_utils crate, added bench_utils.rs for sharing functions between benchmarks, added iai benchmarks 2021-05-18 18:48:59 +02:00
Anton-4
9a50ba37ce criterion benchmarks for examples/benchmarks, moved cli helpers 2021-05-17 17:15:10 +02:00
Richard Feldman
f1ddf775cb Use a constant for RocCallResult tag size 2021-04-11 09:44:59 -04:00
Folkert
ae17399741 fix issue 2021-04-11 15:29:51 +02:00
Folkert
a4d7e809d2 allow list of empty record in repl 2021-01-22 20:31:29 +01:00
Sébastien Besnier
fdc2b6ad86 add bitwise xor 2021-01-14 16:12:46 +01:00
rvcas
565cf21e1e fix(tests): need to adjust tests after changing builtin function types 2021-01-05 09:18:24 -05:00
rvcas
a123bfa3ee fix: tests compile and repl_eval 2021-01-04 09:46:10 -05:00
Richard Feldman
7a53003313
Merge pull request #826 from rtfeldman/bughunt
Throw on overflow in Num.neg/Num.abs & fix mono bug
2020-12-26 23:41:11 -05:00
Folkert
a760a41e1f repl: show error for partial application 2020-12-26 22:13:05 +01:00
Folkert
12c7b5435a generate more runtime errors 2020-12-26 21:30:25 +01:00
Folkert
3d1824c658 add test 2020-12-26 21:20:50 +01:00
Folkert
125146aac7 Merge remote-tracking branch 'origin/trunk' into bughunt 2020-12-26 00:51:22 +01:00
Folkert
917ec9c44c make List.first/List.last work 2020-12-24 01:00:37 +01:00
Celso Bonutti Filho
e118b9a1ed test: adds repl tests for Num checked operations 2020-12-23 13:44:02 -03:00
Celso Bonutti Filho
c98d554328 test: adds tests for mulCheck and mulWrap 2020-12-23 13:43:34 -03:00
Celso Bonutti Filho
313bc2ab86 adds tests for Num.subWrap and sub overflow 2020-12-22 22:18:00 -03:00
Celso Bonutti Filho
51a302957f adds List.last 2020-12-21 19:44:24 -03:00
Celso Bonutti Filho
0a24f3b4b4 adds Num.bitwiseAnd 2020-12-20 19:55:10 -03:00
rvcas
4987721154 feat(Num): rename Num.Int to Num.I64 2020-12-07 19:17:20 -05:00