mirror of
https://github.com/nim-lang/Nim.git
synced 2026-08-30 18:41:45 +00:00
Fixes implicit and explicit generics in procedures (#18808)
* Fixes implicit and explicit generics * moved block logic into 'maybeInstantiateGeneric' * Added more tests * Update compiler/semexprs.nim Co-authored-by: Andreas Rumpf <rumpf_a@web.de>
This commit is contained in:
@@ -1493,6 +1493,28 @@ proc semDeref(c: PContext, n: PNode): PNode =
|
||||
else: result = nil
|
||||
#GlobalError(n[0].info, errCircumNeedsPointer)
|
||||
|
||||
proc maybeInstantiateGeneric(c: PContext, n: PNode, s: PSym): PNode =
|
||||
## Instantiates generic if not lacking implicit generics,
|
||||
## otherwise returns n.
|
||||
let
|
||||
neededGenParams = s.ast[genericParamsPos].len
|
||||
heldGenParams = n.len - 1
|
||||
var implicitParams = 0
|
||||
for x in s.ast[genericParamsPos]:
|
||||
if tfImplicitTypeParam in x.typ.flags:
|
||||
inc implicitParams
|
||||
if heldGenParams != neededGenParams and implicitParams + heldGenParams == neededGenParams:
|
||||
# This is an implicit + explicit generic procedure without all args passed,
|
||||
# kicking back the sem'd symbol fixes #17212
|
||||
# Uncertain the hackiness of this solution.
|
||||
result = n
|
||||
else:
|
||||
result = explicitGenericInstantiation(c, n, s)
|
||||
if result == n:
|
||||
n[0] = copyTree(result)
|
||||
else:
|
||||
n[0] = result
|
||||
|
||||
proc semSubscript(c: PContext, n: PNode, flags: TExprFlags): PNode =
|
||||
## returns nil if not a built-in subscript operator; also called for the
|
||||
## checking of assignments
|
||||
@@ -1568,11 +1590,7 @@ proc semSubscript(c: PContext, n: PNode, flags: TExprFlags): PNode =
|
||||
of skProc, skFunc, skMethod, skConverter, skIterator:
|
||||
# type parameters: partial generic specialization
|
||||
n[0] = semSymGenericInstantiation(c, n[0], s)
|
||||
result = explicitGenericInstantiation(c, n, s)
|
||||
if result == n:
|
||||
n[0] = copyTree(result)
|
||||
else:
|
||||
n[0] = result
|
||||
result = maybeInstantiateGeneric(c, n, s)
|
||||
of skMacro, skTemplate:
|
||||
if efInCall in flags:
|
||||
# We are processing macroOrTmpl[] in macroOrTmpl[](...) call.
|
||||
|
||||
Reference in New Issue
Block a user