diff options
-rw-r--r-- | compiler/sigmatch.nim | 4 | ||||
-rw-r--r-- | tests/overload/tparam_forwarding.nim | 37 | ||||
-rw-r--r-- | web/news/e031_version_0_16_2.rst | 3 |
3 files changed, 42 insertions, 2 deletions
diff --git a/compiler/sigmatch.nim b/compiler/sigmatch.nim index 587598d3e..bc9888df9 100644 --- a/compiler/sigmatch.nim +++ b/compiler/sigmatch.nim @@ -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) diff --git a/tests/overload/tparam_forwarding.nim b/tests/overload/tparam_forwarding.nim new file mode 100644 index 000000000..c1b276bfc --- /dev/null +++ b/tests/overload/tparam_forwarding.nim @@ -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" + diff --git a/web/news/e031_version_0_16_2.rst b/web/news/e031_version_0_16_2.rst index 802478090..37137169b 100644 --- a/web/news/e031_version_0_16_2.rst +++ b/web/news/e031_version_0_16_2.rst @@ -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``. |