Nim 2 решает, копировать или переносить, в каждой точке вызова. Не на уровне proc.
proc take(s: sink seq[int]) =
echo s.len
proc main() =
var a = @[1, 2, 3]
take(a) # copied, `a` is read again below
take(a) # last read of `a`, moved
main()
Тот же аргумент, та же proc. Первый вызов копирует, потому что a ещё нужна. Второй переносит. В точке вызова не видно, что именно произойдёт. nim c --expandArc:main печатает переписанное тело, там видно оба случая.
Только локальные переменные. В документации по деструкторам сказано, что анализ ограничен локальными переменными, поэтому проверка живёт в proc, а --expandArc всё равно принимает её имя.
