mirror of
https://github.com/nim-lang/Nim.git
synced 2025-12-28 08:54:53 +00:00
Specify that address is taken when converter takes a var parameter (#21391)
* Add test case * closes #21247 Add the sfAddrTaken flag to var parameters in converters This allows the JS backend to properly pass the parameter as a fat pointer
This commit is contained in:
@@ -1980,6 +1980,7 @@ proc userConvMatch(c: PContext, m: var TCandidate, f, a: PType,
|
||||
param = implicitConv(nkHiddenSubConv, src, copyTree(arg), m, c)
|
||||
elif src.kind in {tyVar}:
|
||||
# Analyse the converter return type
|
||||
arg.sym.flags.incl sfAddrTaken
|
||||
param = newNodeIT(nkHiddenAddr, arg.info, s.typ[1])
|
||||
param.add copyTree(arg)
|
||||
else:
|
||||
|
||||
15
tests/js/t21247.nim
Normal file
15
tests/js/t21247.nim
Normal file
@@ -0,0 +1,15 @@
|
||||
import std/typetraits
|
||||
|
||||
type
|
||||
QueryParams* = distinct seq[(string, string)]
|
||||
|
||||
converter toBase*(params: var QueryParams): var seq[(string, string)] =
|
||||
params.distinctBase
|
||||
|
||||
proc foo(): QueryParams =
|
||||
# Issue was that the implicit converter call didn't say that it took the
|
||||
# address of the parameter it was converting. This led to the parameter not being
|
||||
# passed as a fat pointer which toBase expected
|
||||
result.add(("hello", "world"))
|
||||
|
||||
assert foo().distinctBase() == @[("hello", "world")]
|
||||
Reference in New Issue
Block a user