diff options
-rw-r--r-- | compiler/ccgreset.nim | 15 | ||||
-rw-r--r-- | tests/stdlib/tsystem.nim | 27 |
2 files changed, 41 insertions, 1 deletions
diff --git a/compiler/ccgreset.nim b/compiler/ccgreset.nim index fc7370d81..93b1652f9 100644 --- a/compiler/ccgreset.nim +++ b/compiler/ccgreset.nim @@ -87,7 +87,20 @@ proc specializeResetT(p: BProc, accessor: Rope, typ: PType) = lineCg(p, cpsStmts, "$1 = 0;$n", [accessor]) of tyCstring, tyPointer, tyPtr, tyVar, tyLent: lineCg(p, cpsStmts, "$1 = NIM_NIL;$n", [accessor]) - else: + of tySet: + case mapSetType(p.config, typ) + of ctArray: + lineCg(p, cpsStmts, "#nimZeroMem($1, sizeof($2));$n", + [accessor, getTypeDesc(p.module, typ)]) + of ctInt8, ctInt16, ctInt32, ctInt64: + lineCg(p, cpsStmts, "$1 = 0;$n", [accessor]) + else: + doAssert false, "unexpected set type kind" + of {tyNone, tyEmpty, tyNil, tyUntyped, tyTyped, tyGenericInvocation, + tyGenericParam, tyOrdinal, tyRange, tyOpenArray, tyForward, tyVarargs, + tyUncheckedArray, tyProxy, tyBuiltInTypeClass, tyUserTypeClass, + tyUserTypeClassInst, tyCompositeTypeClass, tyAnd, tyOr, tyNot, + tyAnything, tyStatic, tyFromExpr, tyConcept, tyVoid, tyIterable}: discard proc specializeReset(p: BProc, a: TLoc) = diff --git a/tests/stdlib/tsystem.nim b/tests/stdlib/tsystem.nim index 00be16275..a90a1d1d9 100644 --- a/tests/stdlib/tsystem.nim +++ b/tests/stdlib/tsystem.nim @@ -74,3 +74,30 @@ template main = static: main() main() + +# bug #19967 +block: + type + X = object + a: string + b: set[char] + + var y = X(b: {'a'}) + + reset(y) + + doAssert y.b == {} + +block: + type + Color = enum + Red, Blue, Yellow + X = object + a: string + b: set[Color] + + var y = X(b: {Red, Blue}) + + reset(y) + doAssert y.b == {} + |