diff --git a/compiler/sempass2.nim b/compiler/sempass2.nim index 8c740f54bf..008f2317ba 100644 --- a/compiler/sempass2.nim +++ b/compiler/sempass2.nim @@ -1197,7 +1197,9 @@ proc trackCall(tracked: PEffects; n: PNode) = else: if laxEffects notin tracked.c.config.legacyFeatures and a.kind == nkSym and a.sym.kind in routineKinds: - propagateEffects(tracked, n, a.sym) + let (isHook, opKind) = findHookKind(a.sym.name.s) + if (not isHook) or opKind notin {attachedAsgn, attachedSink, attachedDup}: + propagateEffects(tracked, n, a.sym) else: mergeRaises(tracked, effectList[exceptionEffects], n) mergeTags(tracked, effectList[tagEffects], n) diff --git a/tests/effects/thooks.nim b/tests/effects/thooks.nim index 23cc005cd1..393f8eff74 100644 --- a/tests/effects/thooks.nim +++ b/tests/effects/thooks.nim @@ -13,4 +13,12 @@ proc send(x: string) = let wrapper = Thing(x: x) discard isolate(wrapper) -send("la") \ No newline at end of file +send("la") + +block: + func enqueue[T](buf: var array[10, T], elem: sink T) = + `=sink`(buf[0], elem) + + var buf: array[10, int] + enqueue(buf, 42) + assert buf[0] == 42 \ No newline at end of file