diff options
author | Juan M Gómez <info@jmgomez.me> | 2023-09-10 11:30:03 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-09-10 12:30:03 +0200 |
commit | cd24195d442301b5012020fbd627686f10833c87 (patch) | |
tree | d9ce3b88f9d3554e2c2b6fe83f9d062a44a811aa | |
parent | 2ce9197d3ad705b3abb5f40f0c27543d7bf03381 (diff) | |
download | Nim-cd24195d442301b5012020fbd627686f10833c87.tar.gz |
fixes #22679 Nim zero clear an object contains C++ imported class when a proc return it (#22681)
-rw-r--r-- | compiler/cgen.nim | 7 | ||||
-rw-r--r-- | tests/cpp/t22679.nim | 50 |
2 files changed, 54 insertions, 3 deletions
diff --git a/compiler/cgen.nim b/compiler/cgen.nim index 6d301dc47..678a15bc9 100644 --- a/compiler/cgen.nim +++ b/compiler/cgen.nim @@ -498,9 +498,10 @@ proc resetLoc(p: BProc, loc: var TLoc) = else: # array passed as argument decayed into pointer, bug #7332 # so we use getTypeDesc here rather than rdLoc(loc) - linefmt(p, cpsStmts, "#nimZeroMem((void*)$1, sizeof($2));$n", - [addrLoc(p.config, loc), - getTypeDesc(p.module, loc.t, descKindFromSymKind mapTypeChooser(loc))]) + if not isOrHasImportedCppType(typ): #bug 22679 + linefmt(p, cpsStmts, "#nimZeroMem((void*)$1, sizeof($2));$n", + [addrLoc(p.config, loc), + getTypeDesc(p.module, loc.t, descKindFromSymKind mapTypeChooser(loc))]) # XXX: We can be extra clever here and call memset only # on the bytes following the m_type field? genObjectInit(p, cpsStmts, loc.t, loc, constructObj) diff --git a/tests/cpp/t22679.nim b/tests/cpp/t22679.nim new file mode 100644 index 000000000..81defcb58 --- /dev/null +++ b/tests/cpp/t22679.nim @@ -0,0 +1,50 @@ +discard """ + cmd: "nim cpp $file" + output:''' +cppNZ.x = 123 +cppNZInit.x = 123 +hascpp.cppnz.x = 123 +hasCppInit.cppnz.x = 123 +hasCppCtor.cppnz.x = 123 +''' +""" +{.emit:"""/*TYPESECTION*/ +struct CppNonZero { + int x = 123; +}; +""".} + +import sugar +type + CppNonZero {.importcpp, inheritable.} = object + x: cint + + HasCpp = object + cppnz: CppNonZero + +proc initCppNonZero: CppNonZero = + CppNonZero() + +proc initHasCpp: HasCpp = + HasCpp() + +proc ctorHasCpp: HasCpp {.constructor.} = + discard + +proc main = + var cppNZ: CppNonZero + dump cppNZ.x + + var cppNZInit = initCppNonZero() + dump cppNZInit.x + + var hascpp: HasCpp + dump hascpp.cppnz.x + + var hasCppInit = initHasCpp() + dump hasCppInit.cppnz.x + + var hasCppCtor = ctorHasCpp() + dump hasCppCtor.cppnz.x + +main() \ No newline at end of file |