diff --git a/compiler/sigmatch.nim b/compiler/sigmatch.nim index 76c04e693e..ad88ed7b26 100644 --- a/compiler/sigmatch.nim +++ b/compiler/sigmatch.nim @@ -2389,7 +2389,9 @@ proc findFirstArgBlock(m: var TCandidate, n: PNode): int = # checking `nfBlockArg in n[a2].flags` wouldn't work inside templates if n[a2].kind != nkStmtList: break let formalLast = m.callee.n[m.callee.n.len - (n.len - a2)] - if formalLast.kind == nkSym and formalLast.sym.ast == nil: + # parameter has to occupy space (no default value, not void or varargs) + if formalLast.kind == nkSym and formalLast.sym.ast == nil and + formalLast.sym.typ.kind notin {tyVoid, tyVarargs}: result = a2 else: break diff --git a/tests/misc/trfc405.nim b/tests/misc/trfc405.nim index 8c967eb773..0828879ee8 100644 --- a/tests/misc/trfc405.nim +++ b/tests/misc/trfc405.nim @@ -79,6 +79,34 @@ template main = foobar3 foobar4 doAssert a2 == (1, 20, "\nfoobar1\nfoobar2", "\nfoobar3\nfoobar4") + + block: # issue #19015 + template hi(a: untyped, b: varargs[untyped]): untyped = + a + + var worked = false + hi: + worked = true + doAssert worked + worked = false + hi(doAssert(not worked)): + doesntCompile + hi(doAssert(not worked), doesntCompile, againDoesntCompile): + definitelyDoesntCompile + + template hi2(a: bool, b: untyped, c: varargs[untyped]): untyped = + b + doAssert a + + hi2 worked: + worked = true + doAssert worked + hi2 worked, doAssert(worked): + doesntCompile + hi2 worked, doAssert(worked), doesntCompile, againDoesntCompile: + definitelyDoesntCompile + hi2 worked, doAssert(worked), againDoesntCompile: + definitelyDoesntCompile static: main() main()