diff --git a/compiler/ccgreset.nim b/compiler/ccgreset.nim index 7b0d619261..84478dd07e 100644 --- a/compiler/ccgreset.nim +++ b/compiler/ccgreset.nim @@ -67,7 +67,14 @@ proc specializeResetT(p: BProc, accessor: Rope, typ: PType) = var x = typ.baseClass if x != nil: x = x.skipTypes(skipPtrs) specializeResetT(p, accessor.parentObj(p.module), x) - if typ.n != nil: specializeResetN(p, accessor, typ.n, typ) + if typ.n != nil: + if typ.sym != nil and sfImportc in typ.sym.flags: + # imported C struct, nimZeroMem + p.s(cpsStmts).addCallStmt(cgsymValue(p.module, "nimZeroMem"), + cCast(ptrType(CPointer), cAddr(accessor)), + cSizeof(getTypeDesc(p.module, typ))) + else: + specializeResetN(p, accessor, typ.n, typ) of tyTuple: let typ = getUniqueType(typ) for i, a in typ.ikids: diff --git a/tests/stdlib/tlocks.nim b/tests/stdlib/tlocks.nim index 1c5f671193..95ec62993b 100644 --- a/tests/stdlib/tlocks.nim +++ b/tests/stdlib/tlocks.nim @@ -9,3 +9,30 @@ import std/assertions var m = createMyType[int]() doAssert m.use() == 3 + + +import std/locks + +type + S = object + r: proc() + + B = object + d: Lock + w: S + +proc v(x: ptr B) {.exportc.} = reset(x[]) + +type + Test = object + path: string # Removing this makes both cases work. + lock: Lock + +# A: This is not fine. +var a = Test() + +proc main(): void = + # B: This is fine. + var b = Test() + +main()