mirror of
https://github.com/nim-lang/Nim.git
synced 2026-02-11 22:08:54 +00:00
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:
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user