diff options
author | heterodoxic <122719743+heterodoxic@users.noreply.github.com> | 2023-05-27 15:27:42 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-05-27 15:27:42 +0200 |
commit | af3fd5a010b2f30a007c410858effb3095ef2598 (patch) | |
tree | b8eb00407dae6ecb83eeb3fd8e808edd3d609196 | |
parent | 73095e2abbc46ce6f6582f08b30548431f28ed62 (diff) | |
download | Nim-af3fd5a010b2f30a007c410858effb3095ef2598.tar.gz |
fixes #15428 by updating deep open array copy codegen (#21935)
* fix #15428 * add test
-rw-r--r-- | compiler/ccgexprs.nim | 5 | ||||
-rw-r--r-- | tests/ccgbugs/t15428.nim | 22 |
2 files changed, 25 insertions, 2 deletions
diff --git a/compiler/ccgexprs.nim b/compiler/ccgexprs.nim index f5033bdc3..b2510f5be 100644 --- a/compiler/ccgexprs.nim +++ b/compiler/ccgexprs.nim @@ -450,9 +450,10 @@ proc genDeepCopy(p: BProc; dest, src: TLoc) = [addrLoc(p.config, dest), rdLoc(src), genTypeInfoV1(p.module, dest.t, dest.lode.info)]) of tyOpenArray, tyVarargs: + let source = addrLocOrTemp(src) linefmt(p, cpsStmts, - "#genericDeepCopyOpenArray((void*)$1, (void*)$2, $1Len_0, $3);$n", - [addrLoc(p.config, dest), addrLocOrTemp(src), + "#genericDeepCopyOpenArray((void*)$1, (void*)$2, $2->Field1, $3);$n", + [addrLoc(p.config, dest), source, genTypeInfoV1(p.module, dest.t, dest.lode.info)]) of tySet: if mapSetType(p.config, ty) == ctArray: diff --git a/tests/ccgbugs/t15428.nim b/tests/ccgbugs/t15428.nim new file mode 100644 index 000000000..d9ae8ff16 --- /dev/null +++ b/tests/ccgbugs/t15428.nim @@ -0,0 +1,22 @@ +discard """ + cmd: "nim $target --mm:refc $file" + output: '''5 +5 +[1, 2, 3, 4, 5] +(data: [1, 2, 3, 4, 5]) +''' +""" + +proc take[T](f: openArray[T]) = + echo f.len +let f = @[0,1,2,3,4] +take(f.toOpenArray(0,4)) + +{.experimental: "views".} +type + Foo = object + data: openArray[int] +let f2 = Foo(data: [1,2,3,4,5]) +echo f2.data.len +echo f2.data +echo f2 \ No newline at end of file |