diff options
author | Araq <rumpf_a@web.de> | 2018-09-29 16:54:50 +0200 |
---|---|---|
committer | Araq <rumpf_a@web.de> | 2018-09-29 16:54:59 +0200 |
commit | 40e01d8549ce3c278dbe791d7af4f1e73b4d56da (patch) | |
tree | f0b2c4b7beae7270f752bf1f35dd9059ac668494 /tests | |
parent | 2dfd09b1bef5c7d7dcba02b8c80856bce7aa685e (diff) | |
download | Nim-40e01d8549ce3c278dbe791d7af4f1e73b4d56da.tar.gz |
don't require an implementation for procs marked with .error; activate the move optimizer for destructors
Diffstat (limited to 'tests')
-rw-r--r-- | tests/destructor/tprevent_assign.nim | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/tests/destructor/tprevent_assign.nim b/tests/destructor/tprevent_assign.nim new file mode 100644 index 000000000..108ccc371 --- /dev/null +++ b/tests/destructor/tprevent_assign.nim @@ -0,0 +1,33 @@ +discard """ + errormsg: "'=' is not available for type <Foo>; requires a copy because it's not the last read of 'otherTree'" + line: 29 +""" + +type + Foo = object + x: int + +proc `=destroy`(f: var Foo) = f.x = 0 +proc `=`(a: var Foo; b: Foo) {.error.} # = a.x = b.x +proc `=sink`(a: var Foo; b: Foo) = a.x = b.x + +proc createTree(x: int): Foo = + Foo(x: x) + +proc take2(a, b: sink Foo) = + echo a.x, " ", b.x + +proc allowThis() = + # all these temporary lets are harmless: + let otherTree = createTree(44) + let b = otherTree + let c = b + take2(createTree(34), c) + +proc preventThis() = + let otherTree = createTree(44) + let b = otherTree + take2(createTree(34), otherTree) + +allowThis() +preventThis() |