summary refs log tree commit diff stats
path: root/tests/destructor/tsimpleclosure.nim
diff options
context:
space:
mode:
Diffstat (limited to 'tests/destructor/tsimpleclosure.nim')
-rw-r--r--tests/destructor/tsimpleclosure.nim62
1 files changed, 62 insertions, 0 deletions
diff --git a/tests/destructor/tsimpleclosure.nim b/tests/destructor/tsimpleclosure.nim
new file mode 100644
index 000000000..9626dd6f8
--- /dev/null
+++ b/tests/destructor/tsimpleclosure.nim
@@ -0,0 +1,62 @@
+discard """
+  cmd: '''nim c -d:nimAllocStats --gc:arc $file'''
+  output: '''a b
+70
+hello
+hello
+hello
+(allocCount: 3, deallocCount: 3)'''
+"""
+
+import system / ansi_c
+
+proc main(): owned(proc()) =
+  var a = "a"
+  var b = "b"
+  result = proc() =
+    echo a, " ", b
+
+
+proc foo(f: (iterator(): int)) =
+  for i in f(): echo i
+
+proc wrap =
+  let p = main()
+  p()
+
+  let fIt = iterator(): int = yield 70
+  foo fIt
+
+wrap()
+
+# bug #11533
+proc say = echo "hello"
+
+# Error: internal error: genAssignment: tyNil
+var err0: proc() = say
+err0()
+
+var ok0: proc()
+ok0 = say
+ok0()
+
+var ok1 = say
+ok1()
+
+when false:
+  # bug #12443
+  func newStringIterator(s: string): owned(iterator(): char) =
+    result = iterator(): char =
+      var pos = 0
+      while pos < s.len:
+        yield s[pos]
+        inc pos
+
+  proc stringIter() =
+    let si = newStringIterator("foo")
+    for i in si():
+      echo i
+
+  stringIter()
+
+echo getAllocStats()