diff options
author | Araq <rumpf_a@web.de> | 2019-04-16 10:35:30 +0200 |
---|---|---|
committer | Araq <rumpf_a@web.de> | 2019-04-16 10:35:43 +0200 |
commit | ce024a73bf9050a18b0cb7c6a985127c86ba14c7 (patch) | |
tree | 29c5ea55d2c609df20e459874f11baee96f733e9 /tests/destructor | |
parent | a520eb77662e5c0e06089e014ce4c118bfd5287b (diff) | |
download | Nim-ce024a73bf9050a18b0cb7c6a985127c86ba14c7.tar.gz |
make move-analysis smarter; see tuse_ownedref_after_move test case
Diffstat (limited to 'tests/destructor')
-rw-r--r-- | tests/destructor/tuse_ownedref_after_move.nim | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/tests/destructor/tuse_ownedref_after_move.nim b/tests/destructor/tuse_ownedref_after_move.nim new file mode 100644 index 000000000..148696ee2 --- /dev/null +++ b/tests/destructor/tuse_ownedref_after_move.nim @@ -0,0 +1,60 @@ +discard """ + cmd: '''nim c --newruntime $file''' + errormsg: "'=' is not available for type <owned Widget>; requires a copy because it's not the last read of ':env.b1()'; another read is done here: tuse_ownedref_after_move.nim(53, 4)" + line: 49 +""" + +import core / allocators +import system / ansi_c + +type + Widget* = ref object of RootObj + drawImpl: owned(proc (self: Widget)) + + Button* = ref object of Widget + caption: string + onclick: owned(proc()) + + Window* = ref object of Widget + elements: seq[owned Widget] + + +proc newButton(caption: string; onclick: owned(proc())): owned Button = + proc draw(self: Widget) = + let b = Button(self) + echo b.caption + + result = Button(drawImpl: draw, caption: caption, onclick: onclick) + +proc newWindow(): owned Window = + proc draw(self: Widget) = + let w = Window(self) + for e in w.elements: + if not e.drawImpl.isNil: e.drawImpl(e) + + result = Window(drawImpl: draw, elements: @[]) + +proc draw(w: Widget) = + if not w.drawImpl.isNil: w.drawImpl(w) + +proc add*(w: Window; elem: owned Widget) = + w.elements.add elem + +proc main = + var w = newWindow() + + var b = newButton("button", nil) + b.onclick = proc () = + b.caption = "clicked!" + w.add b + + w.draw() + # simulate button click: + b.onclick() + + w.draw() + +main() + +let (a, d) = allocCounters() +discard cprintf("%ld %ld new: %ld\n", a, d, allocs) |