summary refs log tree commit diff stats
path: root/tests/template
diff options
context:
space:
mode:
authormetagn <metagngn@gmail.com>2024-10-03 21:38:42 +0300
committerGitHub <noreply@github.com>2024-10-03 20:38:42 +0200
commit4eed341ba53e69674d7e8e8a609efd1ea0a54b4b (patch)
tree8be1f170a39a4795f2dbb85d07843c2f32ac18be /tests/template
parentd98ef312f0cf8745d39c940b16d8d2dce1dfa70f (diff)
downloadNim-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.nim41
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"