summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--compiler/sigmatch.nim7
-rw-r--r--tests/overload/tvart_varargs.nim18
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)