Add hasClosure to std/typetraits (#17501)

* fix nim js cmp fails at CT

* Add `hasClosure` to `std/effecttraits`

* type

* Update changelog.md

Co-authored-by: Timothee Cour <timothee.cour2@gmail.com>

* Update lib/std/effecttraits.nim

Co-authored-by: Timothee Cour <timothee.cour2@gmail.com>
Co-authored-by: Andreas Rumpf <rumpf_a@web.de>
This commit is contained in:
flywind 2021-03-29 20:22:29 +08:00 • committed by GitHub
commit 81e54c1d30
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 109 additions and 0 deletions

View file

@ -0,0 +1,92 @@
discard """
targets: "c cpp js"
"""
import std/typetraits
macro testClosure(fn: typed, flag: static bool) =
if flag:
doAssert hasClosure(fn)
else:
doAssert not hasClosure(fn)
block:
proc h1() =
echo 1
testClosure(h1, false)
proc h2() {.nimcall.} =
echo 2
testClosure(h2, false)
block:
proc fn(): auto =
proc hello() {.nimcall.} =
echo 3
hello
let name = fn()
testClosure(name, false)
block:
proc fn(): auto =
proc hello() =
echo 3
hello
let name = fn()
testClosure(name, false)
block:
proc fn(): auto =
var x = 0
proc hello() =
echo 3
inc x
hello
let name = fn()
testClosure(name, true)
block:
proc fn(): auto =
var x = 0
proc hello() {.closure.} =
echo 3
inc x
hello
let name = fn()
testClosure(name, true)
block:
proc fn(): auto =
var x = 0
proc hello() {.closure.} =
echo 3
inc x
hello
let name = fn()
testClosure(name, true)
let name2 = name
testClosure(name2, true)
block:
iterator hello(): int =
yield 1
testClosure(hello, false)
when not defined(js):
block:
iterator hello(): int {.closure.}=
yield 1
testClosure(hello, true)