unify explicit generic param semchecking in calls (#22618)

fixes #9040

(cherry picked from commit 6738f44af3)
This commit is contained in:
metagn
2023-09-01 16:37:16 +03:00
committed by narimiran
parent 965eeb68e2
commit 106cde1ff8
3 changed files with 26 additions and 7 deletions

View File

@@ -660,14 +660,18 @@ proc explicitGenericSym(c: PContext, n: PNode, s: PSym): PNode =
onUse(info, s)
result = newSymNode(newInst, info)
proc explicitGenericInstantiation(c: PContext, n: PNode, s: PSym): PNode =
assert n.kind == nkBracketExpr
proc setGenericParams(c: PContext, n: PNode) =
## sems generic params in subscript expression
for i in 1..<n.len:
let e = semExprWithType(c, n[i])
if e.typ == nil:
n[i].typ = errorType(c)
else:
n[i].typ = e.typ.skipTypes({tyTypeDesc})
proc explicitGenericInstantiation(c: PContext, n: PNode, s: PSym): PNode =
assert n.kind == nkBracketExpr
setGenericParams(c, n)
var s = s
var a = n[0]
if a.kind == nkSym:

View File

@@ -946,10 +946,6 @@ proc bracketedMacro(n: PNode): PSym =
if result.kind notin {skMacro, skTemplate}:
result = nil
proc setGenericParams(c: PContext, n: PNode) =
for i in 1..<n.len:
n[i].typ = semTypeNode(c, n[i], nil)
proc afterCallActions(c: PContext; n, orig: PNode, flags: TExprFlags; expectedType: PType = nil): PNode =
if efNoSemCheck notin flags and n.typ != nil and n.typ.kind == tyError:
return errorNode(c, n)

View File

@@ -42,4 +42,23 @@ block: #4688
block: #4164
proc printStr[T](s: static[string]): T = discard
discard printStr[int]("hello static")
discard printStr[int]("hello static")
import macros
block: # issue #9040, statics with template, macro, symchoice explicit generics
block: # macro
macro fun[N: static int](): untyped =
newLit 1
const a = fun[2]()
doAssert a == 1
block: # template
template fun[N: static int](): untyped =
1
const a = fun[2]()
doAssert a == 1
block: # symchoice
proc newSeq[x: static int](): int = 1
template foo: int =
newSeq[2]()
doAssert foo() == 1