diff options
-rw-r--r-- | compiler/sigmatch.nim | 7 | ||||
-rw-r--r-- | tests/overload/tvart_varargs.nim | 18 |
2 files changed, 25 insertions, 0 deletions
diff --git a/compiler/sigmatch.nim b/compiler/sigmatch.nim index 95f5f0b07..19ef8a117 100644 --- a/compiler/sigmatch.nim +++ b/compiler/sigmatch.nim @@ -1310,6 +1310,13 @@ proc localConvMatch(c: PContext, m: var TCandidate, f, a: PType, if r == isGeneric: result.typ = getInstantiatedType(c, arg, m, base(f)) m.baseTypeMatch = true + # bug #4545: allow the call to go through a 'var T': + let vt = result.sons[0].typ.sons[1] + if vt.kind == tyVar: + let x = result.sons[1] + let va = newNodeIT(nkHiddenAddr, x.info, vt) + va.add x + result.sons[1] = va proc incMatches(m: var TCandidate; r: TTypeRelation; convMatch = 1) = case r diff --git a/tests/overload/tvart_varargs.nim b/tests/overload/tvart_varargs.nim new file mode 100644 index 000000000..c0c460c76 --- /dev/null +++ b/tests/overload/tvart_varargs.nim @@ -0,0 +1,18 @@ + +# bug #4545 +type SomeObject = object + a : int + +type AbstractObject = object + objet: ptr SomeObject + +proc convert(this: var SomeObject): AbstractObject = + AbstractObject(objet: this.addr) + +proc varargProc(args: varargs[AbstractObject, convert]): int = + for arg in args: + result += arg.objet.a + +var obj = SomeObject(a: 17) + +discard varargProc(obj) |