summary refs log tree commit diff stats
path: root/tests/destructor/tobjfield_analysis.nim
diff options
context:
space:
mode:
authorAraq <rumpf_a@web.de>2019-04-15 17:57:59 +0200
committerAraq <rumpf_a@web.de>2019-04-16 10:35:43 +0200
commit045e026d0ee4e6decc4f22f1f9cbb0bdd8bc3b45 (patch)
tree50b70427b53bc39ce6df075eaccbfebd74663122 /tests/destructor/tobjfield_analysis.nim
parent01f09567c43031d3d35a54c8856d79f6cd1d4bf7 (diff)
downloadNim-045e026d0ee4e6decc4f22f1f9cbb0bdd8bc3b45.tar.gz
dfa.nim: track object/tuple field accesses more precisely; sink(o.x); sink(o.y) needs to compile; activate the tuple unpacking transf.nim bugfix
Diffstat (limited to 'tests/destructor/tobjfield_analysis.nim')
-rw-r--r--tests/destructor/tobjfield_analysis.nim35
1 files changed, 35 insertions, 0 deletions
diff --git a/tests/destructor/tobjfield_analysis.nim b/tests/destructor/tobjfield_analysis.nim
new file mode 100644
index 000000000..24cf02aee
--- /dev/null
+++ b/tests/destructor/tobjfield_analysis.nim
@@ -0,0 +1,35 @@
+discard """
+  output: '''works'''
+"""
+
+type
+  MyVal = object
+    f: ptr float
+
+proc `=destroy`(x: var MyVal) =
+  if x.f != nil:
+    dealloc(x.f)
+
+proc `=sink`(x1: var MyVal, x2: Myval) =
+  if x1.f != x2.f:
+    `=destroy`(x1)
+    x1.f = x2.f
+
+proc `=`(x1: var MyVal, x2: Myval) {.error.}
+
+proc newVal(x: float): MyVal =
+  result.f = create(float)
+  result.f[] = x
+
+proc sinkMe(x: sink MyVal) =
+  discard
+
+proc main =
+  var y = (newVal(3.0), newVal(4.0))
+
+  sinkMe y[0]
+  sinkMe y[1]
+  echo "works"
+
+main()
+