diff options
author | Andreas Rumpf <rumpf_a@web.de> | 2024-06-07 09:01:30 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-06-07 09:01:30 +0200 |
commit | 7039b8b5bc5c62cdd608a769e0ea556e23973cc5 (patch) | |
tree | fa4e644892846e1d333f9b9311efe1bb1efd2a12 | |
parent | 8f5ae28fab113c425d22e5abc230f456fa627744 (diff) | |
download | Nim-7039b8b5bc5c62cdd608a769e0ea556e23973cc5.tar.gz |
fixes #23354; [backport] (#23685)
-rw-r--r-- | compiler/ccgutils.nim | 3 | ||||
-rw-r--r-- | tests/refc/tsinkbug.nim | 17 |
2 files changed, 20 insertions, 0 deletions
diff --git a/compiler/ccgutils.nim b/compiler/ccgutils.nim index 6b106984c..c0e574186 100644 --- a/compiler/ccgutils.nim +++ b/compiler/ccgutils.nim @@ -90,6 +90,9 @@ proc ccgIntroducedPtr*(conf: ConfigRef; s: PSym, retType: PType): bool = if s.typ.sym != nil and sfForward in s.typ.sym.flags: # forwarded objects are *always* passed by pointers for consistency! result = true + elif s.typ.kind == tySink and conf.selectedGC notin {gcArc, gcAtomicArc, gcOrc, gcHooks}: + # bug #23354: + result = false elif (optByRef in s.options) or (getSize(conf, pt) > conf.target.floatSize * 3): result = true # requested anyway elif (tfFinal in pt.flags) and (pt[0] == nil): diff --git a/tests/refc/tsinkbug.nim b/tests/refc/tsinkbug.nim new file mode 100644 index 000000000..2cd762f40 --- /dev/null +++ b/tests/refc/tsinkbug.nim @@ -0,0 +1,17 @@ +discard """ + matrix: "--gc:refc; --gc:arc" + output: ''' +Value is: 42 +Value is: 42''' +""" + +type AnObject* = object of RootObj + value*: int + +proc mutate(a: sink AnObject) = + a.value = 1 + +var obj = AnObject(value: 42) +echo "Value is: ", obj.value +mutate(obj) +echo "Value is: ", obj.value |