fixes #23869; sink generic typeclass (#23874)

Still have to look this over some. We'll see. I put sink in this branch
simply because I saw `tyVar` there and for no other reason. In any case
the problem appears to be coming from `liftParamType` as it removes the
`sink` type from the formals.
#23869
This commit is contained in:
Ryan McConnell
2024-07-22 01:13:43 -04:00
committed by GitHub
parent 2d2a7f2347
commit 7b50d05d6b
2 changed files with 28 additions and 2 deletions

View File

@@ -1166,11 +1166,11 @@ proc liftParamType(c: PContext, procKind: TSymKind, genericParams: PNode,
paramType[i] = t
result = paramType
of tyAlias, tyOwned, tySink:
of tyAlias, tyOwned:
result = recurse(paramType.base)
of tySequence, tySet, tyArray, tyOpenArray,
tyVar, tyLent, tyPtr, tyRef, tyProc:
tyVar, tyLent, tyPtr, tyRef, tyProc, tySink:
# XXX: this is a bit strange, but proc(s: seq)
# produces tySequence(tyGenericParam, tyNone).
# This also seems to be true when creating aliases

26
tests/proc/t23874.nim Normal file
View File

@@ -0,0 +1,26 @@
block:
type Head[T] = object
wasc: bool
proc `=destroy`[T](x: var Head[T]) =
discard
proc `=copy`[T](x: var Head[T], y: Head[T]) =
x.wasc = true
proc `=dup`[T](x: Head[T]): Head[T] =
result.wasc = true
proc update(h: var Head) =
discard
proc digest(h: sink Head) =
assert h.wasc
var h = Head[int](wasc: false)
h.digest() # sink h
h.update() # use after sink
block:
proc two(a: sink auto) =discard
assert typeof(two[int]) is proc(a: sink int) {.nimcall.}