summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--compiler/ccgreset.nim15
-rw-r--r--tests/stdlib/tsystem.nim27
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 == {}
+