mirror of
https://github.com/nim-lang/Nim.git
synced 2026-02-17 00:24:16 +00:00
remove conflicting default call in tables.getOrDefault (#24265)
fixes #23587 As explained in the issue, `getOrDefault` has a parameter named `default` that can be a proc after generic instantiation. But the parameter having a proc type [overrides all other overloads](f73e03b132/compiler/semexprs.nim (L1203)) including the magic `system.default` overload and causes a compile error if the proc doesn't match the normal use of `default`. To fix this, the `result = default(B)` initializer call is removed because it's not needed, `result` is always set in `getOrDefaultImpl` when a default value is provided. This is still a suspicious behavior of the compiler but `tables` working has a higher priority. (cherry picked from commit67ea754b7f)
This commit is contained in:
@@ -507,7 +507,7 @@ proc len(filenames: RstFileTable): int = filenames.idxToFilename.len
|
||||
proc addFilename*(s: PRstSharedState, file1: string): FileIndex =
|
||||
## Returns index of filename, adding it if it has not been used before
|
||||
let nextIdx = s.filenames.len.FileIndex
|
||||
result = getOrDefault(s.filenames.filenameToIdx, file1, default = nextIdx)
|
||||
result = getOrDefault(s.filenames.filenameToIdx, file1, nextIdx)
|
||||
if result == nextIdx:
|
||||
s.filenames.filenameToIdx[file1] = result
|
||||
s.filenames.idxToFilename.add file1
|
||||
|
||||
@@ -419,9 +419,9 @@ proc getOrDefault*[A, B](t: Table[A, B], key: A): B =
|
||||
result = default(B)
|
||||
getOrDefaultImpl(t, key)
|
||||
|
||||
proc getOrDefault*[A, B](t: Table[A, B], key: A, default: B): B =
|
||||
proc getOrDefault*[A, B](t: Table[A, B], key: A, def: B): B =
|
||||
## Retrieves the value at `t[key]` if `key` is in `t`.
|
||||
## Otherwise, `default` is returned.
|
||||
## Otherwise, `def` is returned.
|
||||
##
|
||||
## See also:
|
||||
## * `[] proc<#[],Table[A,B],A>`_ for retrieving a value of a key
|
||||
@@ -434,8 +434,7 @@ proc getOrDefault*[A, B](t: Table[A, B], key: A, default: B): B =
|
||||
let a = {'a': 5, 'b': 9}.toTable
|
||||
doAssert a.getOrDefault('a', 99) == 5
|
||||
doAssert a.getOrDefault('z', 99) == 99
|
||||
result = default(B)
|
||||
getOrDefaultImpl(t, key, default)
|
||||
getOrDefaultImpl(t, key, def)
|
||||
|
||||
proc mgetOrPut*[A, B](t: var Table[A, B], key: A, val: B): var B =
|
||||
## Retrieves value at `t[key]` or puts `val` if not present, either way
|
||||
@@ -972,9 +971,9 @@ proc getOrDefault*[A, B](t: TableRef[A, B], key: A): B =
|
||||
|
||||
getOrDefault(t[], key)
|
||||
|
||||
proc getOrDefault*[A, B](t: TableRef[A, B], key: A, default: B): B =
|
||||
proc getOrDefault*[A, B](t: TableRef[A, B], key: A, def: B): B =
|
||||
## Retrieves the value at `t[key]` if `key` is in `t`.
|
||||
## Otherwise, `default` is returned.
|
||||
## Otherwise, `def` is returned.
|
||||
##
|
||||
## See also:
|
||||
## * `[] proc<#[],TableRef[A,B],A>`_ for retrieving a value of a key
|
||||
@@ -988,7 +987,7 @@ proc getOrDefault*[A, B](t: TableRef[A, B], key: A, default: B): B =
|
||||
doAssert a.getOrDefault('a', 99) == 5
|
||||
doAssert a.getOrDefault('z', 99) == 99
|
||||
|
||||
getOrDefault(t[], key, default)
|
||||
getOrDefault(t[], key, def)
|
||||
|
||||
proc mgetOrPut*[A, B](t: TableRef[A, B], key: A, val: B): var B =
|
||||
## Retrieves value at `t[key]` or puts `val` if not present, either way
|
||||
@@ -1491,9 +1490,9 @@ proc getOrDefault*[A, B](t: OrderedTable[A, B], key: A): B =
|
||||
result = default(B)
|
||||
getOrDefaultImpl(t, key)
|
||||
|
||||
proc getOrDefault*[A, B](t: OrderedTable[A, B], key: A, default: B): B =
|
||||
proc getOrDefault*[A, B](t: OrderedTable[A, B], key: A, def: B): B =
|
||||
## Retrieves the value at `t[key]` if `key` is in `t`.
|
||||
## Otherwise, `default` is returned.
|
||||
## Otherwise, `def` is returned.
|
||||
##
|
||||
## See also:
|
||||
## * `[] proc<#[],OrderedTable[A,B],A>`_ for retrieving a value of a key
|
||||
@@ -1506,8 +1505,7 @@ proc getOrDefault*[A, B](t: OrderedTable[A, B], key: A, default: B): B =
|
||||
let a = {'a': 5, 'b': 9}.toOrderedTable
|
||||
doAssert a.getOrDefault('a', 99) == 5
|
||||
doAssert a.getOrDefault('z', 99) == 99
|
||||
result = default(B)
|
||||
getOrDefaultImpl(t, key, default)
|
||||
getOrDefaultImpl(t, key, def)
|
||||
|
||||
proc mgetOrPut*[A, B](t: var OrderedTable[A, B], key: A, val: B): var B =
|
||||
## Retrieves value at `t[key]` or puts `val` if not present, either way
|
||||
@@ -1992,9 +1990,9 @@ proc getOrDefault*[A, B](t: OrderedTableRef[A, B], key: A): B =
|
||||
|
||||
getOrDefault(t[], key)
|
||||
|
||||
proc getOrDefault*[A, B](t: OrderedTableRef[A, B], key: A, default: B): B =
|
||||
proc getOrDefault*[A, B](t: OrderedTableRef[A, B], key: A, def: B): B =
|
||||
## Retrieves the value at `t[key]` if `key` is in `t`.
|
||||
## Otherwise, `default` is returned.
|
||||
## Otherwise, `def` is returned.
|
||||
##
|
||||
## See also:
|
||||
## * `[] proc<#[],OrderedTableRef[A,B],A>`_ for retrieving a value of a key
|
||||
@@ -2008,7 +2006,7 @@ proc getOrDefault*[A, B](t: OrderedTableRef[A, B], key: A, default: B): B =
|
||||
doAssert a.getOrDefault('a', 99) == 5
|
||||
doAssert a.getOrDefault('z', 99) == 99
|
||||
|
||||
getOrDefault(t[], key, default)
|
||||
getOrDefault(t[], key, def)
|
||||
|
||||
proc mgetOrPut*[A, B](t: OrderedTableRef[A, B], key: A, val: B): var B =
|
||||
## Retrieves value at `t[key]` or puts `val` if not present, either way
|
||||
@@ -2320,9 +2318,9 @@ proc rawGet[A](t: CountTable[A], key: A): int =
|
||||
h = nextTry(h, high(t.data))
|
||||
result = -1 - h # < 0 => MISSING; insert idx = -1 - result
|
||||
|
||||
template ctget(t, key, default: untyped): untyped =
|
||||
template ctget(t, key, def: untyped): untyped =
|
||||
var index = rawGet(t, key)
|
||||
result = if index >= 0: t.data[index].val else: default
|
||||
result = if index >= 0: t.data[index].val else: def
|
||||
|
||||
proc inc*[A](t: var CountTable[A], key: A, val = 1)
|
||||
|
||||
@@ -2447,15 +2445,15 @@ proc contains*[A](t: CountTable[A], key: A): bool =
|
||||
## the `in` operator.
|
||||
return hasKey[A](t, key)
|
||||
|
||||
proc getOrDefault*[A](t: CountTable[A], key: A; default: int = 0): int =
|
||||
proc getOrDefault*[A](t: CountTable[A], key: A; def: int = 0): int =
|
||||
## Retrieves the value at `t[key]` if `key` is in `t`. Otherwise, the
|
||||
## integer value of `default` is returned.
|
||||
## integer value of `def` is returned.
|
||||
##
|
||||
## See also:
|
||||
## * `[] proc<#[],CountTable[A],A>`_ for retrieving a value of a key
|
||||
## * `hasKey proc<#hasKey,CountTable[A],A>`_ for checking if a key
|
||||
## is in the table
|
||||
ctget(t, key, default)
|
||||
ctget(t, key, def)
|
||||
|
||||
proc del*[A](t: var CountTable[A], key: A) {.since: (1, 1).} =
|
||||
## Deletes `key` from table `t`. Does nothing if the key does not exist.
|
||||
@@ -2772,15 +2770,15 @@ proc contains*[A](t: CountTableRef[A], key: A): bool =
|
||||
## the `in` operator.
|
||||
return hasKey[A](t, key)
|
||||
|
||||
proc getOrDefault*[A](t: CountTableRef[A], key: A, default: int): int =
|
||||
proc getOrDefault*[A](t: CountTableRef[A], key: A, def: int): int =
|
||||
## Retrieves the value at `t[key]` if `key` is in `t`. Otherwise, the
|
||||
## integer value of `default` is returned.
|
||||
## integer value of `def` is returned.
|
||||
##
|
||||
## See also:
|
||||
## * `[] proc<#[],CountTableRef[A],A>`_ for retrieving a value of a key
|
||||
## * `hasKey proc<#hasKey,CountTableRef[A],A>`_ for checking if a key
|
||||
## is in the table
|
||||
result = t[].getOrDefault(key, default)
|
||||
result = t[].getOrDefault(key, def)
|
||||
|
||||
proc len*[A](t: CountTableRef[A]): int =
|
||||
## Returns the number of keys in `t`.
|
||||
|
||||
Reference in New Issue
Block a user