mirror of
https://github.com/nim-lang/Nim.git
synced 2026-07-21 16:31:39 +00:00
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:
@@ -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
26
tests/proc/t23874.nim
Normal 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.}
|
||||
Reference in New Issue
Block a user