parent
9c6fe59b55
commit
ba61e7e3ac
3 changed files with 51 additions and 1 deletions
|
|
@ -127,7 +127,8 @@ proc replaceTypeVarsT*(cl: var TReplTypeVars, t: PType): PType =
|
||||||
proc prepareNode(cl: var TReplTypeVars, n: PNode): PNode =
|
proc prepareNode(cl: var TReplTypeVars, n: PNode): PNode =
|
||||||
let t = replaceTypeVarsT(cl, n.typ)
|
let t = replaceTypeVarsT(cl, n.typ)
|
||||||
if t != nil and t.kind == tyStatic and t.n != nil:
|
if t != nil and t.kind == tyStatic and t.n != nil:
|
||||||
return t.n
|
return if tfUnresolved in t.flags: prepareNode(cl, t.n)
|
||||||
|
else: t.n
|
||||||
result = copyNode(n)
|
result = copyNode(n)
|
||||||
result.typ = t
|
result.typ = t
|
||||||
if result.kind == nkSym: result.sym = replaceTypeVarsS(cl, n.sym)
|
if result.kind == nkSym: result.sym = replaceTypeVarsS(cl, n.sym)
|
||||||
|
|
|
||||||
|
|
@ -1781,6 +1781,13 @@ proc paramTypesMatchAux(m: var TCandidate, f, a: PType,
|
||||||
arg.typ.sons = @[evaluated.typ]
|
arg.typ.sons = @[evaluated.typ]
|
||||||
arg.typ.n = evaluated
|
arg.typ.n = evaluated
|
||||||
a = arg.typ
|
a = arg.typ
|
||||||
|
else:
|
||||||
|
if m.callee.kind == tyGenericBody:
|
||||||
|
if f.kind == tyStatic and typeRel(m, f.base, a) != isNone:
|
||||||
|
result = makeStaticExpr(m.c, arg)
|
||||||
|
result.typ.flags.incl tfUnresolved
|
||||||
|
result.typ.n = arg
|
||||||
|
return
|
||||||
|
|
||||||
var r = typeRel(m, f, a)
|
var r = typeRel(m, f, a)
|
||||||
|
|
||||||
|
|
|
||||||
42
tests/statictypes/tpassthruarith.nim
Normal file
42
tests/statictypes/tpassthruarith.nim
Normal file
|
|
@ -0,0 +1,42 @@
|
||||||
|
discard """
|
||||||
|
output: '''
|
||||||
|
[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
|
||||||
|
|
||||||
|
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
|
||||||
|
|
||||||
|
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
|
||||||
|
|
||||||
|
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
|
||||||
|
'''
|
||||||
|
"""
|
||||||
|
|
||||||
|
# https://github.com/nim-lang/Nim/issues/4880
|
||||||
|
|
||||||
|
proc `^^`(x: int): int = x * 2
|
||||||
|
|
||||||
|
type
|
||||||
|
Foo[x: static[int]] = array[x, int]
|
||||||
|
Bar[a, b: static[int]] = array[b, Foo[^^a]]
|
||||||
|
|
||||||
|
var x: Bar[2, 3]
|
||||||
|
echo repr(x)
|
||||||
|
|
||||||
|
# https://github.com/nim-lang/Nim/issues/2730
|
||||||
|
|
||||||
|
type
|
||||||
|
Matrix[M,N: static[int]] = distinct array[0..(M*N - 1), int]
|
||||||
|
|
||||||
|
proc bigger[M,N](m: Matrix[M,N]): Matrix[(M * N) div 8, (M * N)] =
|
||||||
|
discard
|
||||||
|
|
||||||
|
proc bigger2[M,N](m: Matrix[M,N]): Matrix[M * 2, N * 2] =
|
||||||
|
discard
|
||||||
|
|
||||||
|
var m : Matrix[4, 4]
|
||||||
|
var n = bigger(m)
|
||||||
|
var o = bigger2(m)
|
||||||
|
|
||||||
|
echo repr(m)
|
||||||
|
echo repr(n)
|
||||||
|
echo repr(o)
|
||||||
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue