diff --git a/lib/pure/collections/sequtils.nim b/lib/pure/collections/sequtils.nim index e32c784c6..893f31389 100644 --- a/lib/pure/collections/sequtils.nim +++ b/lib/pure/collections/sequtils.nim @@ -371,9 +371,8 @@ proc map*[T, S](s: openArray[T], op: proc (x: T): S {.closure.}): b = map(a, proc(x: int): string = $x) assert b == @["1", "2", "3", "4"] - newSeq(result, s.len) - for i in 0 ..< s.len: - result[i] = op(s[i]) + result = newSeqOfCap[S](s.len) + for elem in s: result.add op(elem) proc apply*[T](s: var openArray[T], op: proc (x: var T) {.closure.}) {.inline.} = diff --git a/lib/pure/collections/sharedtables.nim b/lib/pure/collections/sharedtables.nim index 2a1c0543f..96f934f50 100644 --- a/lib/pure/collections/sharedtables.nim +++ b/lib/pure/collections/sharedtables.nim @@ -77,8 +77,7 @@ template withValue*[A, B](t: var SharedTable[A, B], key: A, try: var hc: Hash var index = rawGet(t, key, hc) - let hasKey = index >= 0 - if hasKey: + if index >= 0: var value {.inject.} = addr(t.data[index].val) body finally: @@ -104,8 +103,7 @@ template withValue*[A, B](t: var SharedTable[A, B], key: A, try: var hc: Hash var index = rawGet(t, key, hc) - let hasKey = index >= 0 - if hasKey: + if index >= 0: var value {.inject.} = addr(t.data[index].val) body1 else: @@ -119,13 +117,13 @@ proc mget*[A, B](t: var SharedTable[A, B], key: A): var B = withLock t: var hc: Hash var index = rawGet(t, key, hc) - let hasKey = index >= 0 - if hasKey: result = t.data[index].val - if not hasKey: - when compiles($key): - raise newException(KeyError, "key not found: " & $key) + if index >= 0: + result = t.data[index].val else: - raise newException(KeyError, "key not found") + when compiles($key): + raise newException(KeyError, "key not found: " & $key) + else: + raise newException(KeyError, "key not found") proc mgetOrPut*[A, B](t: var SharedTable[A, B], key: A, val: B): var B = ## retrieves value at ``t[key]`` or puts ``val`` if not present, either way diff --git a/lib/pure/ioselects/ioselectors_epoll.nim b/lib/pure/ioselects/ioselectors_epoll.nim index bf13cc83e..002bddac5 100644 --- a/lib/pure/ioselects/ioselectors_epoll.nim +++ b/lib/pure/ioselects/ioselectors_epoll.nim @@ -502,8 +502,7 @@ proc contains*[T](s: Selector[T], fd: SocketHandle|int): bool {.inline.} = proc getData*[T](s: Selector[T], fd: SocketHandle|int): var T = let fdi = int(fd) s.checkFd(fdi) - if fdi in s: - result = s.fds[fdi].data + result = s.fds[fdi].data proc setData*[T](s: Selector[T], fd: SocketHandle|int, data: T): bool = let fdi = int(fd) diff --git a/lib/pure/ioselects/ioselectors_kqueue.nim b/lib/pure/ioselects/ioselectors_kqueue.nim index 83e15d479..c5e19a011 100644 --- a/lib/pure/ioselects/ioselectors_kqueue.nim +++ b/lib/pure/ioselects/ioselectors_kqueue.nim @@ -600,8 +600,7 @@ proc contains*[T](s: Selector[T], fd: SocketHandle|int): bool {.inline.} = proc getData*[T](s: Selector[T], fd: SocketHandle|int): var T = let fdi = int(fd) s.checkFd(fdi) - if fdi in s: - result = s.fds[fdi].data + result = s.fds[fdi].data proc setData*[T](s: Selector[T], fd: SocketHandle|int, data: T): bool = let fdi = int(fd) diff --git a/lib/pure/ioselects/ioselectors_select.nim b/lib/pure/ioselects/ioselectors_select.nim index 02a853b42..6a742df99 100644 --- a/lib/pure/ioselects/ioselectors_select.nim +++ b/lib/pure/ioselects/ioselectors_select.nim @@ -410,11 +410,17 @@ else: body proc getData*[T](s: Selector[T], fd: SocketHandle|int): var T = + # The compiler needs this to prove that all code paths return a value + result = (cast[ptr T](0'u))[] + s.withSelectLock(): let fdi = int(fd) for i in 0..= 0: - result = my.row[index] + assert index >= 0 + result = my.row[index] when not defined(testing) and isMainModule: import os diff --git a/tests/collections/ttables.nim b/tests/collections/ttables.nim index a59707865..2a590dd26 100644 --- a/tests/collections/ttables.nim +++ b/tests/collections/ttables.nim @@ -80,7 +80,7 @@ block thashes: # Test with range block: type - R = range[1..10] + R = range[0..9] var t = initTable[R,int]() # causes warning, why? t[1] = 42 # causes warning, why? t[2] = t[1] + 1 diff --git a/tests/discard/tneedsdiscard_in_for.nim b/tests/discard/tneedsdiscard_in_for.nim index 499b06009..ab5216150 100644 --- a/tests/discard/tneedsdiscard_in_for.nim +++ b/tests/discard/tneedsdiscard_in_for.nim @@ -8,7 +8,7 @@ type Rgba8 = object proc premultiply*(c: var Rgba8): var Rgba8 = - discard + return c type App = ref object