diff options
author | metagn <metagngn@gmail.com> | 2024-08-18 01:52:32 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-08-18 00:52:32 +0200 |
commit | f7c11a8978a1fc7182ef18c4bdc80e920ce6ad88 (patch) | |
tree | 084c92138cf165be22b69eb5096fc3208eb58b2a /tests | |
parent | a354b18fe189b61ab1ff29039f8cef9502fce934 (diff) | |
download | Nim-f7c11a8978a1fc7182ef18c4bdc80e920ce6ad88.tar.gz |
allow generic compileTime proc folding (#22022)
fixes #10753, fixes #22021, refs #19365 (was fixed by #22029, but more faithful test added) For whatever reason `compileTime` proc calls did not fold if the proc was generic ([since this folding was introduced](https://github.com/nim-lang/Nim/commit/c25ffbf2622a197c15a4a3bd790b1bc788db2c7f#diff-539da3a63df08fa987f1b0c67d26cdc690753843d110b6bf0805a685eeaffd40)). I'm guessing the intention was for *unresolved* generic procs to not fold, which is now the logic. Non-magic `compileTime` procs also now don't fold at compile time in `typeof` contexts to avoid possible runtime errors (only the important) and prevent double/needless evaluation.
Diffstat (limited to 'tests')
-rw-r--r-- | tests/vm/tgenericcompiletimeproc.nim | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/tests/vm/tgenericcompiletimeproc.nim b/tests/vm/tgenericcompiletimeproc.nim new file mode 100644 index 000000000..cb4dbb2d8 --- /dev/null +++ b/tests/vm/tgenericcompiletimeproc.nim @@ -0,0 +1,29 @@ +block: # issue #10753 + proc foo(x: int): int {.compileTime.} = x + const a = foo(123) + doAssert foo(123) == a + + proc bar[T](x: T): T {.compileTime.} = x + const b = bar(123) + doAssert bar(123) == b + const c = bar("abc") + doAssert bar("abc") == c + +block: # issue #22021 + proc foo(x: static int): int {.compileTime.} = x + 1 + doAssert foo(123) == 124 + +block: # issue #19365 + proc f[T](x: static T): T {.compileTime.} = x + x + doAssert f(123) == 246 + doAssert f(1.0) == 2.0 + +block: + # don't fold compile time procs in typeof + proc fail[T](x: T): T {.compileTime.} = + doAssert false + x + doAssert typeof(fail(123)) is typeof(123) + proc p(x: int): int = x + + type Foo = typeof(p(fail(123))) |