fix affecting templates with explicit generic params
This commit is contained in:
parent
05bfa47996
commit
672c24e4b8
4 changed files with 23 additions and 30 deletions
|
|
@ -683,27 +683,9 @@ proc bracketedMacro(n: PNode): PSym =
|
||||||
if result.kind notin {skMacro, skTemplate}:
|
if result.kind notin {skMacro, skTemplate}:
|
||||||
result = nil
|
result = nil
|
||||||
|
|
||||||
proc semBracketedMacro(c: PContext; outer, inner: PNode; s: PSym;
|
proc setGenericParams(c: PContext, n: PNode) =
|
||||||
flags: TExprFlags): PNode =
|
for i in 1 .. <n.len:
|
||||||
# We received untransformed bracket expression coming from macroOrTmpl[].
|
n[i].typ = semTypeNode(c, n[i], nil)
|
||||||
# Transform it to macro or template call, where first come normal
|
|
||||||
# arguments, next come generic template arguments.
|
|
||||||
var sons = newSeq[PNode]()
|
|
||||||
sons.add inner.sons[0]
|
|
||||||
# Normal arguments:
|
|
||||||
for i in 1..<outer.len:
|
|
||||||
sons.add outer.sons[i]
|
|
||||||
# Generic template arguments from bracket expression:
|
|
||||||
for i in 1..<inner.len:
|
|
||||||
sons.add inner.sons[i]
|
|
||||||
shallowCopy(outer.sons, sons)
|
|
||||||
# FIXME: Shouldn't we check sfImmediate and call semDirectOp?
|
|
||||||
# However passing to semDirectOp doesn't work here.
|
|
||||||
case s.kind
|
|
||||||
of skMacro: result = semMacroExpr(c, outer, outer, s, flags)
|
|
||||||
of skTemplate: result = semTemplateExpr(c, outer, s, flags)
|
|
||||||
else: assert(false)
|
|
||||||
return
|
|
||||||
|
|
||||||
proc afterCallActions(c: PContext; n, orig: PNode, flags: TExprFlags): PNode =
|
proc afterCallActions(c: PContext; n, orig: PNode, flags: TExprFlags): PNode =
|
||||||
result = n
|
result = n
|
||||||
|
|
@ -745,7 +727,8 @@ proc semIndirectOp(c: PContext, n: PNode, flags: TExprFlags): PNode =
|
||||||
elif n.sons[0].kind == nkBracketExpr:
|
elif n.sons[0].kind == nkBracketExpr:
|
||||||
let s = bracketedMacro(n.sons[0])
|
let s = bracketedMacro(n.sons[0])
|
||||||
if s != nil:
|
if s != nil:
|
||||||
return semBracketedMacro(c, n, n.sons[0], s, flags)
|
setGenericParams(c, n[0])
|
||||||
|
return semDirectOp(c, n, flags)
|
||||||
|
|
||||||
let nOrig = n.copyTree
|
let nOrig = n.copyTree
|
||||||
semOpAux(c, n)
|
semOpAux(c, n)
|
||||||
|
|
@ -2164,10 +2147,6 @@ proc shouldBeBracketExpr(n: PNode): bool =
|
||||||
n.sons[0] = be
|
n.sons[0] = be
|
||||||
return true
|
return true
|
||||||
|
|
||||||
proc setGenericParams(c: PContext, n: PNode) =
|
|
||||||
for i in 1 .. <n.len:
|
|
||||||
n[i].typ = semTypeNode(c, n[i], nil)
|
|
||||||
|
|
||||||
proc semExpr(c: PContext, n: PNode, flags: TExprFlags = {}): PNode =
|
proc semExpr(c: PContext, n: PNode, flags: TExprFlags = {}): PNode =
|
||||||
result = n
|
result = n
|
||||||
if gCmd == cmdIdeTools: suggestExpr(c, n)
|
if gCmd == cmdIdeTools: suggestExpr(c, n)
|
||||||
|
|
|
||||||
|
|
@ -1609,8 +1609,9 @@ proc setupMacroParam(x: PNode, typ: PType): TFullReg =
|
||||||
iterator genericParamsInMacroCall*(macroSym: PSym, call: PNode): (PSym, PNode) =
|
iterator genericParamsInMacroCall*(macroSym: PSym, call: PNode): (PSym, PNode) =
|
||||||
let gp = macroSym.ast[genericParamsPos]
|
let gp = macroSym.ast[genericParamsPos]
|
||||||
for i in 0 .. <gp.len:
|
for i in 0 .. <gp.len:
|
||||||
let idx = macroSym.typ.len + i
|
let genericParam = gp[i].sym
|
||||||
yield (gp[i].sym, call.sons[idx])
|
let posInCall = macroSym.typ.len + i
|
||||||
|
yield (genericParam, call[posInCall])
|
||||||
|
|
||||||
var evalMacroCounter: int
|
var evalMacroCounter: int
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -147,7 +147,7 @@ also have pointer-like covariance:
|
||||||
|
|
||||||
.. code-block:: nim
|
.. code-block:: nim
|
||||||
type
|
type
|
||||||
GuiWidget = object of TObject
|
GuiWidget = object of RootObj
|
||||||
Button = object of GuiWidget
|
Button = object of GuiWidget
|
||||||
ComboBox = object of GuiWidget
|
ComboBox = object of GuiWidget
|
||||||
|
|
||||||
|
|
@ -184,7 +184,7 @@ sequence (i.e. it will be covariant only when instantiated with ``ptr`` and
|
||||||
.. code-block:: nim
|
.. code-block:: nim
|
||||||
|
|
||||||
type
|
type
|
||||||
Base = object of TObject
|
Base = object of RootObj
|
||||||
Derived = object of Base
|
Derived = object of Base
|
||||||
|
|
||||||
proc consumeBaseValues(b: RingBuffer[Base]) = ...
|
proc consumeBaseValues(b: RingBuffer[Base]) = ...
|
||||||
|
|
|
||||||
13
tests/template/tgenerictemplates.nim
Normal file
13
tests/template/tgenerictemplates.nim
Normal file
|
|
@ -0,0 +1,13 @@
|
||||||
|
type
|
||||||
|
SomeObj = object of RootObj
|
||||||
|
|
||||||
|
Foo[T, U] = object
|
||||||
|
x: T
|
||||||
|
y: U
|
||||||
|
|
||||||
|
template someTemplate[T](): tuple[id: int32, obj: T] =
|
||||||
|
var result: tuple[id: int32, obj: T] = (0'i32, T())
|
||||||
|
result
|
||||||
|
|
||||||
|
let ret = someTemplate[SomeObj]()
|
||||||
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue