summary refs log tree commit diff stats
path: root/tests/parallel/tmissing_deepcopy.nim
diff options
context:
space:
mode:
Diffstat (limited to 'tests/parallel/tmissing_deepcopy.nim')
-rw-r--r--tests/parallel/tmissing_deepcopy.nim42
1 files changed, 42 insertions, 0 deletions
diff --git a/tests/parallel/tmissing_deepcopy.nim b/tests/parallel/tmissing_deepcopy.nim
new file mode 100644
index 000000000..ea77936ad
--- /dev/null
+++ b/tests/parallel/tmissing_deepcopy.nim
@@ -0,0 +1,42 @@
+discard """
+  matrix: "--mm:refc"
+  ccodeCheck: "@'genericDeepCopy(' .*"
+  action: compile
+"""
+
+# bug #2286
+
+import threadPool
+
+type
+  Person = ref object
+    name: string
+    friend: Person
+
+var
+  people: seq[Person] = @[]
+
+proc newPerson(name:string): Person =
+  result.new()
+  result.name = name
+
+proc greet(p:Person) =
+  p.friend.name &= "-MUT" # this line crashes the program
+  echo "Person {",
+    " name:", p.name, "(", cast[int](addr p.name),"),",
+    " friend:", p.friend.name, "(", cast[int](addr p.friend.name),") }"
+
+proc setup =
+  for i in 0 ..< 10:
+    people.add newPerson("Person" & $(i + 1))
+  for i in 0 ..< 10:
+    people[i].friend = people[9-i]
+
+proc update =
+  parallel:
+    for i in 0 .. people.high:
+      spawn people[i].greet()
+
+when true:
+  setup()
+  update()