From 79ec8c257183e01c01811a34e3930de7814756fb Mon Sep 17 00:00:00 2001 From: Timothee Cour Date: Fri, 7 Feb 2020 04:29:18 -0800 Subject: [PATCH] fix #13182: `proc fun(a: varargs[Foo, conv])` now can be overloaded (#13345) [backport] --- compiler/sigmatch.nim | 3 ++- tests/errmsgs/tsigmatch2.nim | 47 ++++++++++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+), 1 deletion(-) create mode 100644 tests/errmsgs/tsigmatch2.nim diff --git a/compiler/sigmatch.nim b/compiler/sigmatch.nim index 677afc2d50593..09b8d0b76aa53 100644 --- a/compiler/sigmatch.nim +++ b/compiler/sigmatch.nim @@ -1938,7 +1938,8 @@ proc localConvMatch(c: PContext, m: var TCandidate, f, a: PType, var call = newNodeI(nkCall, arg.info) call.add(f.n.copyTree) call.add(arg.copyTree) - result = c.semExpr(c, call) + result = c.semTryExpr(c, call) + if result != nil: if result.typ == nil: return nil # resulting type must be consistent with the other arguments: diff --git a/tests/errmsgs/tsigmatch2.nim b/tests/errmsgs/tsigmatch2.nim new file mode 100644 index 0000000000000..c4eb4c1977682 --- /dev/null +++ b/tests/errmsgs/tsigmatch2.nim @@ -0,0 +1,47 @@ +discard """ + cmd: "nim check --showAllMismatches:on --hints:off $file" + nimout: ''' +tsigmatch2.nim(40, 14) Error: type mismatch: got +but expected one of: +proc foo(i: Foo): string + first type mismatch at position: 1 + required type for i: Foo + but expression '1.2' is of type: float64 +proc foo(args: varargs[string, myproc]): string + first type mismatch at position: 1 + required type for args: varargs[string] + but expression '1.2' is of type: float64 + +expression: foo(1.2) +tsigmatch2.nim(46, 7) Error: type mismatch: got +but expected one of: +proc foo(args: varargs[string, myproc]) + first type mismatch at position: 1 + required type for args: varargs[string] + but expression '1' is of type: int literal(1) + +expression: foo 1 +''' + errormsg: "type mismatch" +""" + + + +# line 30 + +block: # issue #13182 + proc myproc(a: int): string = $("myproc", a) + proc foo(args: varargs[string, myproc]): string = $args + type Foo = object + proc foo(i: Foo): string = "in foo(i)" + static: doAssert foo(Foo()) == "in foo(i)" + static: doAssert foo(1) == """["(\"myproc\", 1)"]""" + doAssert not compiles(foo(1.2)) + discard foo(1.2) + +block: + proc myproc[T](x: T): string = + let temp = 12.isNil + proc foo(args: varargs[string, myproc]) = discard + foo 1 +static: echo "done" \ No newline at end of file