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.
This commit is contained in:
metagn
2024-10-03 21:38:42 +03:00
committed by GitHub
parent d98ef312f0
commit 4eed341ba5
2 changed files with 59 additions and 7 deletions

View File

@@ -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"