From 61c6820565e8fb03ab06a160e9dab09f5afef03f Mon Sep 17 00:00:00 2001 From: ringabout <43030857+ringabout@users.noreply.github.com> Date: Tue, 31 Oct 2023 13:20:23 +0000 Subject: [PATCH] fixes #22883; replace `default(typeof(` with `reset`; suppress `UnsafeDefault` warnings --- lib/pure/collections/setimpl.nim | 2 +- lib/pure/collections/sets.nim | 4 ++-- lib/pure/collections/tableimpl.nim | 8 ++++---- lib/system.nim | 4 ++++ 4 files changed, 11 insertions(+), 7 deletions(-) diff --git a/lib/pure/collections/setimpl.nim b/lib/pure/collections/setimpl.nim index dbd4ce1d5e12a..cff953b108c6e 100644 --- a/lib/pure/collections/setimpl.nim +++ b/lib/pure/collections/setimpl.nim @@ -87,7 +87,7 @@ proc exclImpl[A](s: var HashSet[A], key: A): bool {.inline.} = var j = i # The correctness of this depends on (h+1) in nextTry, var r = j # though may be adaptable to other simple sequences. s.data[i].hcode = 0 # mark current EMPTY - s.data[i].key = default(typeof(s.data[i].key)) + reset(s.data[i].key) doWhile((i >= r and r > j) or (r > j and j > i) or (j > i and i >= r)): i = (i + 1) and msk # increment mod table size if isEmpty(s.data[i].hcode): # end of collision cluster; So all done diff --git a/lib/pure/collections/sets.nim b/lib/pure/collections/sets.nim index 220ef3bb63cc1..99bb299d5babb 100644 --- a/lib/pure/collections/sets.nim +++ b/lib/pure/collections/sets.nim @@ -382,7 +382,7 @@ proc clear*[A](s: var HashSet[A]) = s.counter = 0 for i in 0 ..< s.data.len: s.data[i].hcode = 0 - s.data[i].key = default(typeof(s.data[i].key)) + reset(s.data[i].key) proc union*[A](s1, s2: HashSet[A]): HashSet[A] = @@ -816,7 +816,7 @@ proc clear*[A](s: var OrderedSet[A]) = for i in 0 ..< s.data.len: s.data[i].hcode = 0 s.data[i].next = 0 - s.data[i].key = default(typeof(s.data[i].key)) + reset(s.data[i].key) proc len*[A](s: OrderedSet[A]): int {.inline.} = ## Returns the number of elements in `s`. diff --git a/lib/pure/collections/tableimpl.nim b/lib/pure/collections/tableimpl.nim index 112aaa7d0697c..9bccc8d9662e3 100644 --- a/lib/pure/collections/tableimpl.nim +++ b/lib/pure/collections/tableimpl.nim @@ -119,8 +119,8 @@ template delImplIdx(t, i, makeEmpty, cellEmpty, cellHash) = var j = i # The correctness of this depends on (h+1) in nextTry var r = j # though may be adaptable to other simple sequences. makeEmpty(i) # mark current EMPTY - t.data[i].key = default(typeof(t.data[i].key)) - t.data[i].val = default(typeof(t.data[i].val)) + reset(t.data[i].key) + reset(t.data[i].val) while true: i = (i + 1) and msk # increment mod table size if cellEmpty(i): # end of collision cluster; So all done @@ -151,8 +151,8 @@ template clearImpl() {.dirty.} = for i in 0 ..< t.dataLen: when compiles(t.data[i].hcode): # CountTable records don't contain a hcode t.data[i].hcode = 0 - t.data[i].key = default(typeof(t.data[i].key)) - t.data[i].val = default(typeof(t.data[i].val)) + reset(t.data[i].key) + reset(t.data[i].val) t.counter = 0 template ctAnd(a, b): bool = diff --git a/lib/system.nim b/lib/system.nim index 41c9e96ea2acf..d8a61f9fa9410 100644 --- a/lib/system.nim +++ b/lib/system.nim @@ -911,14 +911,18 @@ proc default*[T](_: typedesc[T]): T {.magic: "Default", noSideEffect.} = proc reset*[T](obj: var T) {.noSideEffect.} = ## Resets an object `obj` to its default value. when nimvm: + {.push warning[UnsafeDefault]:off.} obj = default(typeof(obj)) + {.pop.} else: when defined(gcDestructors): {.cast(noSideEffect), cast(raises: []), cast(tags: []).}: `=destroy`(obj) `=wasMoved`(obj) else: + {.push warning[UnsafeDefault]:off.} obj = default(typeof(obj)) + {.pop.} proc setLen*[T](s: var seq[T], newlen: Natural) {. magic: "SetLengthSeq", noSideEffect, nodestroy.}