fixes #22898; fix #22883 differently (#22900)

fixes #22898
In these cases, the tables/sets are clears or elements are deleted from
them. It's reasonable to suppress warnings because the value is not
accessed anymore, which means it's safe to ignore the warnings.
This commit is contained in:
ringabout
2023-11-05 16:12:53 +08:00
committed by GitHub
parent ec37b59a65
commit f0e5bdd7d8
4 changed files with 10 additions and 4 deletions

View File

@@ -87,7 +87,9 @@ 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
{.push warning[UnsafeDefault]:off.}
reset(s.data[i].key)
{.pop.}
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

View File

@@ -382,7 +382,9 @@ proc clear*[A](s: var HashSet[A]) =
s.counter = 0
for i in 0 ..< s.data.len:
s.data[i].hcode = 0
{.push warning[UnsafeDefault]:off.}
reset(s.data[i].key)
{.pop.}
proc union*[A](s1, s2: HashSet[A]): HashSet[A] =
@@ -816,7 +818,9 @@ proc clear*[A](s: var OrderedSet[A]) =
for i in 0 ..< s.data.len:
s.data[i].hcode = 0
s.data[i].next = 0
{.push warning[UnsafeDefault]:off.}
reset(s.data[i].key)
{.pop.}
proc len*[A](s: OrderedSet[A]): int {.inline.} =
## Returns the number of elements in `s`.

View File

@@ -119,8 +119,10 @@ 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
{.push warning[UnsafeDefault]:off.}
reset(t.data[i].key)
reset(t.data[i].val)
{.pop.}
while true:
i = (i + 1) and msk # increment mod table size
if cellEmpty(i): # end of collision cluster; So all done
@@ -151,8 +153,10 @@ 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
{.push warning[UnsafeDefault]:off.}
reset(t.data[i].key)
reset(t.data[i].val)
{.pop.}
t.counter = 0
template ctAnd(a, b): bool =

View File

@@ -911,18 +911,14 @@ 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.}