mirror of
https://github.com/nim-lang/Nim.git
synced 2026-04-18 13:30:33 +00:00
* fix varargs forwarding for templates; fixes #5455 * document the macros' varargs change in the news for 0.16.2
This commit is contained in:
@@ -1651,7 +1651,7 @@ proc matchesAux(c: PContext, n, nOrig: PNode,
|
||||
if a >= formalLen-1 and formal != nil and formal.typ.isVarargsUntyped:
|
||||
incl(marker, formal.position)
|
||||
if container.isNil:
|
||||
container = newNodeIT(nkBracket, n.sons[a].info, arrayConstr(c, n.info))
|
||||
container = newNodeIT(nkArgList, n.sons[a].info, arrayConstr(c, n.info))
|
||||
setSon(m.call, formal.position + 1, container)
|
||||
else:
|
||||
incrIndexType(container.typ)
|
||||
@@ -1739,7 +1739,7 @@ proc matchesAux(c: PContext, n, nOrig: PNode,
|
||||
|
||||
if formal.typ.isVarargsUntyped:
|
||||
if container.isNil:
|
||||
container = newNodeIT(nkBracket, n.sons[a].info, arrayConstr(c, n.info))
|
||||
container = newNodeIT(nkArgList, n.sons[a].info, arrayConstr(c, n.info))
|
||||
setSon(m.call, formal.position + 1, container)
|
||||
else:
|
||||
incrIndexType(container.typ)
|
||||
|
||||
37
tests/overload/tparam_forwarding.nim
Normal file
37
tests/overload/tparam_forwarding.nim
Normal file
@@ -0,0 +1,37 @@
|
||||
discard """
|
||||
output: '''baz
|
||||
10
|
||||
100
|
||||
1000
|
||||
a
|
||||
b
|
||||
c
|
||||
'''
|
||||
"""
|
||||
|
||||
type
|
||||
Foo = object
|
||||
x: int
|
||||
|
||||
proc stringVarargs*(strings: varargs[string, `$`]): void =
|
||||
for s in strings: echo s
|
||||
|
||||
proc fooVarargs*(foos: varargs[Foo]) =
|
||||
for f in foos: echo f.x
|
||||
|
||||
template templateForwarding*(callable: untyped,
|
||||
condition: bool,
|
||||
forwarded: varargs[untyped]): untyped =
|
||||
if condition:
|
||||
callable(forwarded)
|
||||
|
||||
proc procForwarding(args: varargs[string]) =
|
||||
stringVarargs(args)
|
||||
|
||||
templateForwarding stringVarargs, 17 + 4 < 21, "foo", "bar", 100
|
||||
templateForwarding stringVarargs, 10 < 21, "baz"
|
||||
|
||||
templateForwarding fooVarargs, "test".len > 3, Foo(x: 10), Foo(x: 100), Foo(x: 1000)
|
||||
|
||||
procForwarding "a", "b", "c"
|
||||
|
||||
@@ -23,6 +23,9 @@ Changes affecting backwards compatibility
|
||||
pointer. Now the hash is calculated from the contents of the string, assuming
|
||||
``cstring`` is a null-terminated string. Equal ``string`` and ``cstring``
|
||||
values produce an equal hash value.
|
||||
- Macros accepting `varargs` arguments will now receive a node having the
|
||||
`nkArgList` node kind. Previous code expecting the node kind to be `nkBracket`
|
||||
may have to be updated.
|
||||
- ``memfiles.open`` now closes file handleds/fds by default. Passing
|
||||
``allowRemap=true`` to ``memfiles.open`` recovers the old behavior. The old
|
||||
behavior is only needed to call ``mapMem`` on the resulting ``MemFile``.
|
||||
|
||||
Reference in New Issue
Block a user