Permalink
Browse files

Error out if vararg match isn't an exact one (#8186)

Fixes #8172
  • Loading branch information...
LemonBoy authored and Araq committed Jul 3, 2018
1 parent 426e5c2 commit ab47a870bce94cb33c66f2b27ecb1c62f48ae783
Showing with 22 additions and 1 deletion.
  1. +11 −1 compiler/sigmatch.nim
  2. +11 −0 tests/typerel/t8172.nim
@@ -2308,6 +2308,7 @@ proc matchesAux(c: PContext, n, nOrig: PNode,
m.firstMismatch = f
return
if m.baseTypeMatch:
assert formal.typ.kind == tyVarargs
#assert(container == nil)
if container.isNil:
container = newNodeIT(nkBracket, n.sons[a].info, arrayConstr(c, arg))
@@ -2321,10 +2322,19 @@ proc matchesAux(c: PContext, n, nOrig: PNode,

# pick the formal from the end, so that 'x, y, varargs, z' works:
f = max(f, formalLen - n.len + a + 1)
else:
elif formal.typ.kind != tyVarargs or container == nil:
setSon(m.call, formal.position + 1, arg)
inc(f)
container = nil
else:
# we end up here if the argument can be converted into the varargs
# formal (eg. seq[T] -> varargs[T]) but we have already instantiated
# a container
assert arg.kind == nkHiddenStdConv
localError(c.config, n.sons[a].info, "cannot convert $1 to $2" % [
typeToString(n.sons[a].typ), typeToString(formal.typ) ])
m.state = csNoMatch
return
checkConstraint(n.sons[a])
inc(a)

@@ -0,0 +1,11 @@
discard """
line: 11
errormsg: "cannot convert array[0..0, string] to varargs[string]"
"""

proc f(v: varargs[string]) =
echo(v)

f("b", "c") # Works
f(["b", "c"]) # Works
f("b", ["c"]) # Fails

0 comments on commit ab47a87

Please sign in to comment.