mirror of
https://github.com/nim-lang/Nim.git
synced 2025-12-30 18:02:05 +00:00
adapt semOpAux to opt-in symchoices (#23750)
fixes #23749, refs #22716
`semIndirectOp` is used here because of the callback expressions, in
this case `db.getProc(...)`, and `semIndirectOp` calls `semOpAux` to
type its arguments before overloading starts. Hence it can opt in to
symchoices since overloading will resolve them.
(cherry picked from commit 948fc29bb2)
This commit is contained in:
@@ -554,7 +554,7 @@ proc semIs(c: PContext, n: PNode, flags: TExprFlags): PNode =
|
||||
result = isOpImpl(c, n, flags)
|
||||
|
||||
proc semOpAux(c: PContext, n: PNode) =
|
||||
const flags = {efDetermineType}
|
||||
const flags = {efDetermineType, efAllowSymChoice}
|
||||
for i in 1..<n.len:
|
||||
var a = n[i]
|
||||
if a.kind == nkExprEqExpr and a.len == 2:
|
||||
|
||||
37
tests/lookups/t23749.nim
Normal file
37
tests/lookups/t23749.nim
Normal file
@@ -0,0 +1,37 @@
|
||||
discard """
|
||||
action: compile
|
||||
"""
|
||||
|
||||
{.pragma: callback, gcsafe, raises: [].}
|
||||
|
||||
type
|
||||
DataProc* = proc(val: openArray[byte]) {.callback.}
|
||||
GetProc = proc (db: RootRef, key: openArray[byte], onData: DataProc): bool {.nimcall, callback.}
|
||||
KvStoreRef* = ref object
|
||||
obj: RootRef
|
||||
getProc: GetProc
|
||||
|
||||
template get(dbParam: KvStoreRef, key: openArray[byte], onData: untyped): bool =
|
||||
let db = dbParam
|
||||
db.getProc(db.obj, key, onData)
|
||||
|
||||
func decode(input: openArray[byte], maxSize = 128): seq[byte] =
|
||||
@[]
|
||||
|
||||
proc getSnappySSZ(db: KvStoreRef, key: openArray[byte]): string =
|
||||
var status = "not found"
|
||||
proc decode(data: openArray[byte]) =
|
||||
status =
|
||||
if true: "found"
|
||||
else: "corrupted"
|
||||
discard db.get(key, decode)
|
||||
status
|
||||
|
||||
|
||||
var ksr: KvStoreRef
|
||||
var k = [byte(1), 2, 3, 4, 5]
|
||||
|
||||
proc foo(): string =
|
||||
getSnappySSZ(ksr, toOpenArray(k, 1, 3))
|
||||
|
||||
echo foo()
|
||||
Reference in New Issue
Block a user