mirror of
https://github.com/nim-lang/Nim.git
synced 2025-12-28 08:54:53 +00:00
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.
57 lines
1.2 KiB
Nim
57 lines
1.2 KiB
Nim
block:
|
|
template foo(a: untyped, b: untyped = a(0)): untyped =
|
|
let x = a(0)
|
|
let y = b
|
|
(x, y)
|
|
proc bar(x: int): int = x + 1
|
|
doAssert foo(bar, b = bar(0)) == (1, 1)
|
|
doAssert foo(bar) == (1, 1)
|
|
|
|
block: # issue #23506
|
|
var a: string
|
|
template foo(x: int; y = x) =
|
|
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"
|