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

Fixes #8172
This commit is contained in:
LemonBoy 2018-07-03 15:10:12 +02:00 • committed by Andreas Rumpf
commit ab47a870bc
2 changed files with 22 additions and 1 deletions

View file

@ -2308,6 +2308,7 @@ proc matchesAux(c: PContext, n, nOrig: PNode,
m.firstMismatch = f m.firstMismatch = f
return return
if m.baseTypeMatch: if m.baseTypeMatch:
assert formal.typ.kind == tyVarargs
#assert(container == nil) #assert(container == nil)
if container.isNil: if container.isNil:
container = newNodeIT(nkBracket, n.sons[a].info, arrayConstr(c, arg)) 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: # pick the formal from the end, so that 'x, y, varargs, z' works:
f = max(f, formalLen - n.len + a + 1) f = max(f, formalLen - n.len + a + 1)
else: elif formal.typ.kind != tyVarargs or container == nil:
setSon(m.call, formal.position + 1, arg) setSon(m.call, formal.position + 1, arg)
inc(f) inc(f)
container = nil 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]) checkConstraint(n.sons[a])
inc(a) inc(a)

11
tests/typerel/t8172.nim Normal file
View file

@ -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