summary refs log tree commit diff stats
path: root/tests
diff options
context:
space:
mode:
authorflywind <xzsflywind@gmail.com>2022-01-29 21:06:54 +0800
committerGitHub <noreply@github.com>2022-01-29 14:06:54 +0100
commit33cd883e27f7ba7564cbeb59d2d38fe02bb507bf (patch)
tree8761da8fbaf0c5a2a486c256a5c93f38f0e9aa63 /tests
parentcb894c7094fb49014f85815a9dafc38b5dda743e (diff)
downloadNim-33cd883e27f7ba7564cbeb59d2d38fe02bb507bf.tar.gz
[add testcase] NRVO does not occur with init procedures (#19462)
* [add testcase] NRVO does not occur with init procedures

close #19094

* Update tests/ccgbugs2/tcodegen.nim
Diffstat (limited to 'tests')
-rw-r--r--tests/ccgbugs2/tcodegen.nim28
1 files changed, 28 insertions, 0 deletions
diff --git a/tests/ccgbugs2/tcodegen.nim b/tests/ccgbugs2/tcodegen.nim
new file mode 100644
index 000000000..84cd76e2f
--- /dev/null
+++ b/tests/ccgbugs2/tcodegen.nim
@@ -0,0 +1,28 @@
+discard """
+  targets: "c cpp"
+"""
+
+# bug #19094
+type
+  X = object
+    filler: array[2048, int]
+    innerAddress: uint
+
+proc initX(): X =
+  result.innerAddress = cast[uint](result.addr)
+
+proc initXInPlace(x: var X) =
+  x.innerAddress = cast[uint](x.addr)
+
+block: # NRVO1
+  var x = initX()
+  let innerAddress = x.innerAddress
+  let outerAddress = cast[uint](x.addr)
+  doAssert(innerAddress == outerAddress) # [OK]
+
+block: # NRVO2
+  var x: X
+  initXInPlace(x)
+  let innerAddress = x.innerAddress
+  let outerAddress = cast[uint](x.addr)
+  doAssert(innerAddress == outerAddress) # [OK]