mirror of
https://github.com/nim-lang/Nim.git
synced 2026-01-07 05:23:20 +00:00
This commit is contained in:
@@ -498,10 +498,17 @@ 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)
|
||||
if not isOrHasImportedCppType(typ): #bug 22679
|
||||
let tyDesc = getTypeDesc(p.module, loc.t, descKindFromSymKind mapTypeChooser(loc))
|
||||
if p.module.compileToCpp and isOrHasImportedCppType(typ):
|
||||
if lfIndirect in loc.flags:
|
||||
#C++ cant be just zeroed. We need to call the ctors
|
||||
var tmp = getTemp(p, loc.t)
|
||||
linefmt(p, cpsStmts,"#nimCopyMem((void*)$1, (NIM_CONST void*)$2, sizeof($3));$n",
|
||||
[addrLoc(p.config, loc), addrLoc(p.config, tmp), tyDesc])
|
||||
else:
|
||||
linefmt(p, cpsStmts, "#nimZeroMem((void*)$1, sizeof($2));$n",
|
||||
[addrLoc(p.config, loc),
|
||||
getTypeDesc(p.module, loc.t, descKindFromSymKind mapTypeChooser(loc))])
|
||||
[addrLoc(p.config, loc), tyDesc])
|
||||
|
||||
# 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)
|
||||
|
||||
50
tests/cpp/t22680.nim
Normal file
50
tests/cpp/t22680.nim
Normal file
@@ -0,0 +1,50 @@
|
||||
discard """
|
||||
cmd: "nim cpp $file"
|
||||
output:'''
|
||||
cppNZ.x = 123
|
||||
cppNZInit.x = 123
|
||||
inheritCpp.x = 123
|
||||
inheritCppInit.x = 123
|
||||
inheritCppCtor.x = 123
|
||||
'''
|
||||
"""
|
||||
import std/sugar
|
||||
|
||||
{.emit:"""/*TYPESECTION*/
|
||||
struct CppNonZero {
|
||||
int x = 123;
|
||||
};
|
||||
""".}
|
||||
|
||||
type
|
||||
CppNonZero {.importcpp, inheritable.} = object
|
||||
x: cint
|
||||
|
||||
InheritCpp = object of CppNonZero
|
||||
|
||||
proc initCppNonZero: CppNonZero =
|
||||
CppNonZero()
|
||||
|
||||
proc initInheritCpp: InheritCpp =
|
||||
InheritCpp()
|
||||
|
||||
proc ctorInheritCpp: InheritCpp {.constructor.} =
|
||||
discard
|
||||
|
||||
proc main =
|
||||
var cppNZ: CppNonZero
|
||||
dump cppNZ.x
|
||||
|
||||
var cppNZInit = initCppNonZero()
|
||||
dump cppNZInit.x
|
||||
|
||||
var inheritCpp: InheritCpp
|
||||
dump inheritCpp.x
|
||||
|
||||
var inheritCppInit = initInheritCpp()
|
||||
dump inheritCppInit.x
|
||||
|
||||
var inheritCppCtor = ctorInheritCpp()
|
||||
dump inheritCppCtor.x
|
||||
|
||||
main()
|
||||
Reference in New Issue
Block a user