when T is both a type symbol and a routine symbol in scope of a generic proc do not account for the type symbol when doing a.T() (#21899)

fix #21883
This commit is contained in:
metagn
2023-05-24 21:39:40 +03:00
committed by GitHub
parent cb3f6fdc66
commit 446e5fbbb3
3 changed files with 15 additions and 4 deletions

View File

@@ -138,7 +138,8 @@ proc newDot(n, b: PNode): PNode =
result.add(b)
proc fuzzyLookup(c: PContext, n: PNode, flags: TSemGenericFlags,
ctx: var GenericCtx; isMacro: var bool): PNode =
ctx: var GenericCtx; isMacro: var bool;
inCall = false): PNode =
assert n.kind == nkDotExpr
semIdeForTemplateOrGenericCheck(c.config, n, ctx.cursorInBody)
@@ -152,8 +153,9 @@ proc fuzzyLookup(c: PContext, n: PNode, flags: TSemGenericFlags,
result = n
let n = n[1]
let ident = considerQuotedIdent(c, n)
var candidates = searchInScopesFilterBy(c, ident, routineKinds+{skType})
# skType here because could be type conversion
# could be type conversion if like a.T and not a.T()
let symKinds = if inCall: routineKinds else: routineKinds+{skType}
var candidates = searchInScopesFilterBy(c, ident, symKinds)
if candidates.len > 0:
let s = candidates[0] # XXX take into account the other candidates!
isMacro = s.kind in {skTemplate, skMacro}
@@ -281,7 +283,7 @@ proc semGenericStmt(c: PContext, n: PNode,
onUse(fn.info, s)
first = 1
elif fn.kind == nkDotExpr:
result[0] = fuzzyLookup(c, fn, flags, ctx, mixinContext)
result[0] = fuzzyLookup(c, fn, flags, ctx, mixinContext, inCall = true)
first = 1
# Consider 'when declared(globalsSlot): ThreadVarSetValue(globalsSlot, ...)'
# in threads.nim: the subtle preprocessing here binds 'globalsSlot' which

View File

@@ -23,3 +23,6 @@ proc doStrip*[T](a: T): string =
type Foo = int32
proc baz2*[T](y: int): auto =
result = y.Foo
proc set*(x: var int, a, b: string) =
x = a.len + b.len

View File

@@ -40,6 +40,12 @@ block tdotlookup:
doAssert doStrip(123) == "123"
# bug #14254
doAssert baz2[float](1'i8) == 1
# bug #21883
proc abc[T: not not int](x: T): T =
var x = x
x.set("hello", "world")
result = x
doAssert abc(5) == 10
block tmodule_same_as_proc:
# bug #1965