unify explicit generic param semchecking in calls (#22618)

fixes #9040
This commit is contained in:
metagn
2023-09-01 16:37:16 +03:00
committed by GitHub
parent 0c6e13806d
commit 6738f44af3
3 changed files with 26 additions and 7 deletions

View File

@@ -733,14 +733,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

@@ -1003,10 +1003,6 @@ proc bracketedMacro(n: PNode): PSym =
else:
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