From 8c9a645bdf8bbd14f7fc9e95c475f7fb963de3f3 Mon Sep 17 00:00:00 2001 From: metagn Date: Thu, 24 Apr 2025 22:18:18 +0300 Subject: [PATCH] fix generic converter regression with `var`/subtype args (#24902) refs #24867, https://github.com/nim-lang/Nim/pull/24867#issuecomment-2821315971 The argument node of the converter can be wrapped in [hidden `addr` or subtype conversion nodes](https://github.com/nim-lang/Nim/blob/dc100c5caa673b039155e9e5d4c7fc0c239f4eb5/compiler/sigmatch.nim#L2327-L2335) which have to be skipped when matching the type again, since the type of the node is the uninstantiated type taken from the proc parameter. --- compiler/semcall.nim | 4 +++- tests/converter/tvargenericconverter.nim | 7 +++++++ 2 files changed, 10 insertions(+), 1 deletion(-) create mode 100644 tests/converter/tvargenericconverter.nim diff --git a/compiler/semcall.nim b/compiler/semcall.nim index 90376214db..e3c6ea851b 100644 --- a/compiler/semcall.nim +++ b/compiler/semcall.nim @@ -688,7 +688,9 @@ proc instGenericConvertersArg*(c: PContext, a: PNode, x: TCandidate) = if s.isGenericRoutineStrict: var src = s.typ.firstParamType var convMatch = newCandidate(c, src) - let srca = typeRel(convMatch, src, a[1].typ) + var arg = a[1] + if arg.kind in {nkHiddenAddr, nkHiddenSubConv}: arg = arg[^1] + let srca = typeRel(convMatch, src, arg.typ) if srca notin {isEqual, isGeneric, isSubtype}: internalError(c.config, a.info, "generic converter failed rematch") let finalCallee = generateInstance(c, s, convMatch.bindings, a.info) diff --git a/tests/converter/tvargenericconverter.nim b/tests/converter/tvargenericconverter.nim new file mode 100644 index 0000000000..f88779d9d8 --- /dev/null +++ b/tests/converter/tvargenericconverter.nim @@ -0,0 +1,7 @@ +# regression test + +converter toPtr[T](x: var T): ptr T = + result = addr x + +var x = 123 +let y: ptr int = x