block: # `.noSideEffect`
  func foo(bar: proc(): int): int {.effectsOf: bar.} = bar()
  var count = 0
  proc fn1(): int = 1
  proc fn2(): int = (count.inc; count)

  template accept(body) =
    doAssert compiles(block:
      body)

  template reject(body) =
    doAssert not compiles(block:
      body)

  accept:
    func fun1() = discard foo(fn1)
  reject:
    func fun1() = discard foo(fn2)

  var foo2: type(foo) = foo
  accept:
    func main() = discard foo(fn1)
  reject:
    func main() = discard foo2(fn1)
