diff options
author | metagn <metagngn@gmail.com> | 2024-10-03 21:38:42 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-10-03 20:38:42 +0200 |
commit | 4eed341ba53e69674d7e8e8a609efd1ea0a54b4b (patch) | |
tree | 8be1f170a39a4795f2dbb85d07843c2f32ac18be /tests/template | |
parent | d98ef312f0cf8745d39c940b16d8d2dce1dfa70f (diff) | |
download | Nim-4eed341ba53e69674d7e8e8a609efd1ea0a54b4b.tar.gz |
don't typecheck `untyped` + allow void `typed` template param default values (#24219)
Previously, the compiler never differentiated between `untyped`/`typed` argument default values and other types, it considered any parameter with a type as typed and called `semExprWithType`, which both typechecked it and disallowed `void` expressions. Now, we perform no typechecking at all on `untyped` template param default values, and call `semExpr` instead for `typed` params, which allows expressions with `void` type.
Diffstat (limited to 'tests/template')
-rw-r--r-- | tests/template/tdefaultparam.nim | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/tests/template/tdefaultparam.nim b/tests/template/tdefaultparam.nim index ecbb0e145..7ea0b2b25 100644 --- a/tests/template/tdefaultparam.nim +++ b/tests/template/tdefaultparam.nim @@ -13,3 +13,44 @@ block: # issue #23506 a = $($x, $y) foo(1) doAssert a == "(\"1\", \"1\")" + +block: # untyped params with default value + macro foo(x: typed): untyped = + result = x + template test(body: untyped, alt: untyped = (;), maxTries = 3): untyped {.foo.} = + body + alt + var s = "a" + test: + s.add "b" + do: + s.add "c" + doAssert s == "abc" + template test2(body: untyped, alt: untyped = s.add("e"), maxTries = 3): untyped = + body + alt + test2: + s.add "d" + doAssert s == "abcde" + template test3(body: untyped = willNotCompile) = + discard + test3() + +block: # typed params with `void` default value + macro foo(x: typed): untyped = + result = x + template test(body: untyped, alt: typed = (;), maxTries = 3): untyped {.foo.} = + body + alt + var s = "a" + test: + s.add "b" + do: + s.add "c" + doAssert s == "abc" + template test2(body: untyped, alt: typed = s.add("e"), maxTries = 3): untyped = + body + alt + test2: + s.add "d" + doAssert s == "abcde" |