From 7b50d05d6be3662431e990b707379bac6f100821 Mon Sep 17 00:00:00 2001 From: Ryan McConnell Date: Mon, 22 Jul 2024 01:13:43 -0400 Subject: [PATCH] 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 --- compiler/semtypes.nim | 4 ++-- tests/proc/t23874.nim | 26 ++++++++++++++++++++++++++ 2 files changed, 28 insertions(+), 2 deletions(-) create mode 100644 tests/proc/t23874.nim diff --git a/compiler/semtypes.nim b/compiler/semtypes.nim index 949648d1710ff..8e9e43de8b92e 100644 --- a/compiler/semtypes.nim +++ b/compiler/semtypes.nim @@ -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 diff --git a/tests/proc/t23874.nim b/tests/proc/t23874.nim new file mode 100644 index 0000000000000..940bc4ac8e3eb --- /dev/null +++ b/tests/proc/t23874.nim @@ -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.}