summary refs log tree commit diff stats
path: root/tests/destructor/tobjfield_analysis.nim
diff options
context:
space:
mode:
Diffstat (limited to 'tests/destructor/tobjfield_analysis.nim')
-rw-r--r--tests/destructor/tobjfield_analysis.nim51
1 files changed, 51 insertions, 0 deletions
diff --git a/tests/destructor/tobjfield_analysis.nim b/tests/destructor/tobjfield_analysis.nim
new file mode 100644
index 000000000..83f394c3b
--- /dev/null
+++ b/tests/destructor/tobjfield_analysis.nim
@@ -0,0 +1,51 @@
+discard """
+  output: '''works'''
+"""
+
+#  bug #11095
+
+type
+  MyVal[T] = object
+    f: ptr T
+
+proc `=destroy`[T](x: var MyVal[T]) =
+  if x.f != nil:
+    dealloc(x.f)
+
+proc `=sink`[T](x1: var MyVal[T], x2: MyVal[T]) =
+  if x1.f != x2.f:
+    `=destroy`(x1)
+    x1.f = x2.f
+
+proc `=`[T](x1: var MyVal[T], x2: MyVal[T]) {.error.}
+
+proc newVal[T](x: sink T): MyVal[T] =
+  result.f = create(T)
+  result.f[] = x
+
+proc set[T](x: var MyVal[T], val: T) =
+  x.f[] = val
+
+proc sinkMe[T](x: sink MyVal[T]) =
+  discard
+
+var flag = false
+
+proc main =
+  var y = case flag
+    of true:
+      var x1 = newVal[float](1.0)
+      var x2 = newVal[float](2.0)
+      (newVal(x1), newVal(x2))
+
+    of false:
+      var x1 = newVal[float](1.0)
+      var x2 = newVal[float](2.0)
+      (newVal(x1), newVal(x2))
+
+  sinkMe y[0]
+  sinkMe y[1]
+  echo "works"
+
+main()
+