File: ttypetraits.nim

package info (click to toggle)
nim 2.2.0-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 1,911,644 kB
  • sloc: sh: 24,603; ansic: 1,761; python: 1,492; makefile: 1,013; sql: 298; asm: 141; xml: 13
file content (94 lines) | stat: -rw-r--r-- 1,346 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
discard """
  matrix: "--mm:refc; --mm:orc"
  targets: "c cpp js"
"""

# xxx merge with tests/metatype/ttypetraits.nim

import std/typetraits
import std/assertions

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)