mirror of
https://github.com/nim-lang/Nim.git
synced 2026-01-16 01:35:35 +00:00
@@ -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:
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user