Fix range type construction in the VM (#9205)

The `range[X,Y]` representation is wrong, we use `range[X .. Y]`
instead.

Fixes #9194

(cherry picked from commit 8a1055adce)
This commit is contained in:
LemonBoy
2018-10-09 15:51:49 +02:00
committed by narimiran
parent 221c67b880
commit 0f080fdce3
2 changed files with 29 additions and 2 deletions

View File

@@ -237,8 +237,15 @@ proc mapTypeToAstX(cache: IdentCache; t: PType; info: TLineInfo;
of tyRange:
result = newNodeIT(nkBracketExpr, if t.n.isNil: info else: t.n.info, t)
result.add atomicType("range", mRange)
result.add t.n.sons[0].copyTree
result.add t.n.sons[1].copyTree
if inst:
let rng = newNodeX(nkInfix)
rng.add newIdentNode(getIdent(cache, ".."), info)
rng.add t.n.sons[0].copyTree
rng.add t.n.sons[1].copyTree
result.add rng
else:
result.add t.n.sons[0].copyTree
result.add t.n.sons[1].copyTree
of tyPointer: result = atomicType("pointer", mPointer)
of tyString: result = atomicType("string", mString)
of tyCString: result = atomicType("cstring", mCString)

20
tests/macros/t9194.nim Normal file
View File

@@ -0,0 +1,20 @@
discard """
output: '''
range[0 .. 100]
array[0 .. 100, int]
'''
"""
import macros
type
Foo1 = range[0 .. 100]
Foo2 = array[0 .. 100, int]
macro get(T: typedesc): untyped =
# Get the X out of typedesc[X]
let tmp = getTypeImpl(T)
result = newStrLitNode(getTypeImpl(tmp[1]).repr)
echo Foo1.get
echo Foo2.get