summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rwxr-xr-xcompiler/ast.nim4
-rw-r--r--tests/run/tclosure3.nim21
-rwxr-xr-xtodo.txt2
3 files changed, 23 insertions, 4 deletions
diff --git a/compiler/ast.nim b/compiler/ast.nim
index 9cd741cf1..9f3a99363 100755
--- a/compiler/ast.nim
+++ b/compiler/ast.nim
@@ -245,6 +245,7 @@ type
                       # language; for interfacing with Objective C
     sfDiscardable     # returned value may be discarded implicitely
     sfDestructor      # proc is destructor
+    sfByCopy          # a variable is to be captured by value in a closure
 
   TSymFlags* = set[TSymFlag]
 
@@ -264,9 +265,6 @@ const
   
   sfShadowed* = sfInnerProc
     # a variable that was shadowed in some inner scope
-
-  sfByCopy* = sfBorrow
-    # a variable is to be captured by value in a closure
     
   sfHoist* = sfVolatile ## proc return value can be hoisted
 
diff --git a/tests/run/tclosure3.nim b/tests/run/tclosure3.nim
new file mode 100644
index 000000000..6dee49aea
--- /dev/null
+++ b/tests/run/tclosure3.nim
@@ -0,0 +1,21 @@
+discard """
+  file: "tclosure3.nim"
+  output: "success"
+  disabled: true
+"""
+
+proc main =
+  const n = 30
+  for iterations in 0..50_000:
+    var s: seq[proc(): int {.closure.}] = @[]
+    for i in 0 .. n-1:
+      let ii = i
+      s.add(proc(): int = return ii*ii)
+    for i in 0 .. n-1:
+      let val = s[i]()
+      if val != i*i: echo "bug  ", val
+    
+    if getOccupiedMem() > 3000_000: quit("still a leak!")
+  echo "success"
+
+main()
diff --git a/todo.txt b/todo.txt
index d6b84d753..1e3bd6bae 100755
--- a/todo.txt
+++ b/todo.txt
@@ -11,7 +11,7 @@ version 0.9.0
 
 New pragmas:
 - ``hoist`` pragma for loop hoisting
-- test & document ``byCopy`` pragma
+- fix & document ``byCopy`` pragma
 - document destructors
 
 - ``borrow`` needs to take type classes into account