Skip to content

Commit

Permalink
fixes nim-lang#23869; sink generic typeclass (nim-lang#23874)
Browse files Browse the repository at this point in the history
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.
nim-lang#23869
  • Loading branch information
Graveflo authored Jul 22, 2024
1 parent 2d2a7f2 commit 7b50d05
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 2 deletions.
4 changes: 2 additions & 2 deletions compiler/semtypes.nim
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
26 changes: 26 additions & 0 deletions tests/proc/t23874.nim
Original file line number Diff line number Diff line change
@@ -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.}

0 comments on commit 7b50d05

Please sign in to comment.